From ec266db14e394e1696296908607531b94ad3e615 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 22 Nov 2023 00:52:14 +0100 Subject: [PATCH 001/138] Start loading files into editor --- Scenes/ContentManager/Scripts/content_list.gd | 74 +++++++++++++++ .../ContentManager/Scripts/contenteditor.gd | 19 ++++ Scenes/ContentManager/content_list.tscn | 94 +++++++++++++++++++ Scenes/ContentManager/contenteditor.tscn | 67 +++++++++---- Scenes/ContentManager/contentmanager.tscn | 33 +++++++ 5 files changed, 267 insertions(+), 20 deletions(-) create mode 100644 Scenes/ContentManager/Scripts/content_list.gd create mode 100644 Scenes/ContentManager/Scripts/contenteditor.gd create mode 100644 Scenes/ContentManager/content_list.tscn diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd new file mode 100644 index 00000000..df710f43 --- /dev/null +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -0,0 +1,74 @@ +extends Control + +@export var contentItems: ItemList = null +@export var collapseButton: Button = null +@export var pupup_ID: Popup = null +var is_collapsed: bool = true +var source: String = "": + set(path): + source = path + load_data() +var header: String = "Items": + set(newName): + header = newName + collapseButton.text = header + +#This function will collapse and expand the $Content/ContentItems when the collapse button is pressed +func _on_collapse_button_button_up(): + $Content/ContentItems.visible = is_collapsed + is_collapsed = !is_collapsed + +#This function will show a pop-up asking the user to input an ID +func _on_add_button_button_up(): + pupup_ID.show() + + + +#This function adds items to the content list based on the provided path +#If the path is a directory, it will list all the files in the directory +#If the path is a json file, it will list all the items in the json file +func load_data(): + if source == "": + return + if source.ends_with(".json"): + load_file() + else: + load_dir() + +func load_file(): + # Save the JSON string to the selected file location + var file = FileAccess.open(source, FileAccess.READ) + if file: + var data_json: Dictionary + data_json = JSON.parse_string(file.get_as_text()) + for item in data_json: + # get the name of the item, "missing_name" if not found + var item_name: String = item.get("name", "missing_name") + #Add the item and save the index number + var item_index: int = contentItems.add_item(item_name) + #Add the ID as metadata which can be used to load the item data + contentItems.set_item_metadata(item_index, item.get("id", "missing_id")) + else: + print_debug("Unable to load file: " + source) + +func load_dir(): + var dir = DirAccess.open(source) + if dir: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + if !dir.current_is_dir() and file_name.get_extension() == "json": + # Add all the filenames to the ContentItems list as child nodes + contentItems.add_item(file_name.replace(".json", "")) + file_name = dir.get_next() + else: + print_debug("An error occurred when trying to access the path: " + source) + dir.list_dir_end() + + +func _on_ok_button_up(): + pupup_ID.hide() + + +func _on_cancel_button_up(): + pupup_ID.hide() diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd new file mode 100644 index 00000000..26381fb3 --- /dev/null +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -0,0 +1,19 @@ +extends Control + +@onready var contentList: PackedScene = preload("res://Scenes/ContentManager/content_list.tscn") +var selectedMod: String = "Core" + +@export var content: VBoxContainer = null + +# Called when the node enters the scene tree for the first time. +#This function will instatiate a tileScene, set the source property and add it as a child to the content VBoxContainer. The source property should be set to "./Mods/Core/Maps/" +func _ready(): + # Instantiate a tileScene + var contentListInstance = contentList.instantiate() + + # Set the source property + contentListInstance.source = "./Mods/Core/Maps/" + contentListInstance.header = "Maps" + + # Add it as a child to the content VBoxContainer + content.add_child(contentListInstance) diff --git a/Scenes/ContentManager/content_list.tscn b/Scenes/ContentManager/content_list.tscn new file mode 100644 index 00000000..f466fb5f --- /dev/null +++ b/Scenes/ContentManager/content_list.tscn @@ -0,0 +1,94 @@ +[gd_scene load_steps=2 format=3 uid="uid://cv2m4bg1uoj4p"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/content_list.gd" id="1_ly1kh"] + +[node name="ContentList" type="Control" node_paths=PackedStringArray("contentItems", "collapseButton", "pupup_ID")] +custom_minimum_size = Vector2(200, 100) +layout_mode = 3 +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_ly1kh") +contentItems = NodePath("Content/ContentItems") +collapseButton = NodePath("Content/HBoxContainer/CollapseButton") +pupup_ID = NodePath("ID_Input") + +[node name="Content" 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="HBoxContainer" type="HBoxContainer" parent="Content"] +layout_mode = 2 + +[node name="CollapseButton" type="Button" parent="Content/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Items" + +[node name="AddButton" type="Button" parent="Content/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.15 +theme_override_font_sizes/font_size = 16 +text = "+" + +[node name="ContentItems" type="ItemList" parent="Content"] +custom_minimum_size = Vector2(200, 200) +layout_mode = 2 +size_flags_vertical = 3 +max_columns = 2 + +[node name="ID_Input" type="Popup" parent="."] +title = "Input ID" +initial_position = 2 +size = Vector2i(200, 150) +unresizable = false +borderless = false + +[node name="VBoxContainer" type="VBoxContainer" parent="ID_Input"] +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 + +[node name="TextEdit" type="TextEdit" parent="ID_Input/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +placeholder_text = "ex: pistol_9mm" +scroll_fit_content_height = true + +[node name="Label" type="Label" parent="ID_Input/VBoxContainer"] +layout_mode = 2 +text = "Input an ID" + +[node name="HBoxContainer" type="HBoxContainer" parent="ID_Input/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="OK" type="Button" parent="ID_Input/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +text = "Ok" + +[node name="Cancel" type="Button" parent="ID_Input/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +text = "Cancel" + +[connection signal="button_up" from="Content/HBoxContainer/CollapseButton" to="." method="_on_collapse_button_button_up"] +[connection signal="button_up" from="Content/HBoxContainer/AddButton" to="." method="_on_add_button_button_up"] +[connection signal="button_up" from="ID_Input/VBoxContainer/HBoxContainer/OK" to="." method="_on_ok_button_up"] +[connection signal="button_up" from="ID_Input/VBoxContainer/HBoxContainer/Cancel" to="." method="_on_cancel_button_up"] diff --git a/Scenes/ContentManager/contenteditor.tscn b/Scenes/ContentManager/contenteditor.tscn index 446d96bc..3b40a411 100644 --- a/Scenes/ContentManager/contenteditor.tscn +++ b/Scenes/ContentManager/contenteditor.tscn @@ -1,8 +1,11 @@ -[gd_scene load_steps=2 format=3 uid="uid://480xqusluqrk"] +[gd_scene load_steps=3 format=3 uid="uid://480xqusluqrk"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/contenteditor.gd" id="1_65sl4"] [ext_resource type="PackedScene" uid="uid://d3001f5xxpup1" path="res://Scenes/ContentManager/Mapeditor/mapeditor.tscn" id="1_rwi67"] -[node name="contenteditor" type="Control"] +[node name="contenteditor" type="Control" node_paths=PackedStringArray("content")] + layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -10,6 +13,10 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +script = ExtResource("1_65sl4") +content = NodePath("HSplitContainer/ContentLists/TabContainer2/Content") + + [node name="HSplitContainer" type="HSplitContainer" parent="."] layout_mode = 1 anchors_preset = 15 @@ -18,10 +25,33 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="TabContainer2" type="TabContainer" parent="HSplitContainer"] +split_offset = 200 + +[node name="ContentLists" type="VBoxContainer" parent="HSplitContainer"] +layout_mode = 2 + +[node name="SelectMods" type="OptionButton" parent="HSplitContainer/ContentLists"] +layout_mode = 2 +tooltip_text = "Select the mod you want edit" +item_count = 3 +selected = 0 +popup/item_0/text = "Core" +popup/item_0/id = 0 +popup/item_1/text = "MyArcheryMod" +popup/item_1/id = 1 +popup/item_2/text = "MyFarmMod" +popup/item_2/id = 2 + +[node name="TabContainer2" type="TabContainer" parent="HSplitContainer/ContentLists"] layout_mode = 2 +size_flags_vertical = 3 + +[node name="Content" type="VBoxContainer" parent="HSplitContainer/ContentLists/TabContainer2"] +layout_mode = 2 + +[node name="Recent" type="ItemList" parent="HSplitContainer/ContentLists/TabContainer2"] +visible = false -[node name="Recent" type="ItemList" parent="HSplitContainer/TabContainer2"] custom_minimum_size = Vector2(200, 200) layout_mode = 2 item_count = 10 @@ -39,28 +69,25 @@ item_7/text = "snail" item_8/text = "core" item_9/text = "pistol_9mm" -[node name="CurrentFile" type="ItemList" parent="HSplitContainer/TabContainer2"] -visible = false -custom_minimum_size = Vector2(200, 200) -layout_mode = 2 -item_count = 6 -max_columns = 2 -item_0/text = "Core" -item_1/text = "pistol_9mm" -item_2/text = "core" -item_3/text = "revolver_357" -item_4/text = "core" -item_5/text = "laser_rifle" [node name="TabContainer" type="TabContainer" parent="HSplitContainer"] layout_mode = 2 -[node name="9mm_pistol" type="Label" parent="HSplitContainer/TabContainer"] +[node name="Editor_Home" type="RichTextLabel" parent="HSplitContainer/TabContainer"] layout_mode = 2 +bbcode_enabled = true +text = "[font_size=70]Content editor[/font_size] -[node name="itemgroup_kitchen" type="Label" parent="HSplitContainer/TabContainer"] -visible = false -layout_mode = 2 +This is the content editor for CataX. + +[font_size=22][b]Content selection[/b][/font_size] +On the left side you can select one of the mods you want to work on. The content of the mod will be displayed in the selection lists below. +[ul]Double click an item in the list: opens the appropriate editor to the right. +Click the + sign: Allows you to add new content to the mod. Enter the name and a new item will be available to edit[/ul] + + +[font_size=22][b]Content editing[/b][/font_size] +On the right a content editor will be displayed that allows you to edit the selected item. Multiple editors can be opened in tabs. Use the controls to edit the content and press save to save your edits" [node name="generic_house" parent="HSplitContainer/TabContainer" instance=ExtResource("1_rwi67")] visible = false diff --git a/Scenes/ContentManager/contentmanager.tscn b/Scenes/ContentManager/contentmanager.tscn index 1c4b3442..b305f336 100644 --- a/Scenes/ContentManager/contentmanager.tscn +++ b/Scenes/ContentManager/contentmanager.tscn @@ -2,4 +2,37 @@ [node name="contentmanager" type="Control"] layout_mode = 3 +<<<<<<< Updated upstream anchors_preset = 0 +======= +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -60.5 +offset_top = -33.0 +offset_right = 60.5 +offset_bottom = 33.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Button" type="Button" parent="VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 36 +text = "Content editor +" + +[node name="Button2" type="Button" parent="VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 36 +text = "Mod manager" +>>>>>>> Stashed changes From e9f5cc467495aac29fc4a8404f48b4ad8e890926 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 22 Nov 2023 02:13:35 +0100 Subject: [PATCH 002/138] Add navigation from main menu --- .../ContentManager/Scripts/contenteditor.gd | 4 +++ .../ContentManager/Scripts/contentmanager.gd | 9 +++++++ Scenes/ContentManager/contenteditor.tscn | 13 +++++----- Scenes/ContentManager/contentmanager.tscn | 26 ++++++++++++------- Scripts/scene_selector.gd | 4 +++ scene_selector.tscn | 16 +++++++++++- 6 files changed, 54 insertions(+), 18 deletions(-) create mode 100644 Scenes/ContentManager/Scripts/contentmanager.gd diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index 26381fb3..47e58a84 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -17,3 +17,7 @@ func _ready(): # Add it as a child to the content VBoxContainer content.add_child(contentListInstance) + + +func _on_back_button_button_up(): + get_tree().change_scene_to_file("res://Scenes/ContentManager/contentmanager.tscn") diff --git a/Scenes/ContentManager/Scripts/contentmanager.gd b/Scenes/ContentManager/Scripts/contentmanager.gd new file mode 100644 index 00000000..19f8e10d --- /dev/null +++ b/Scenes/ContentManager/Scripts/contentmanager.gd @@ -0,0 +1,9 @@ +extends Control + + +func _on_back_button_button_up(): + get_tree().change_scene_to_file("res://scene_selector.tscn") + + +func _on_content_editor_button_button_up(): + get_tree().change_scene_to_file("res://Scenes/ContentManager/contenteditor.tscn") diff --git a/Scenes/ContentManager/contenteditor.tscn b/Scenes/ContentManager/contenteditor.tscn index 3b40a411..4832777c 100644 --- a/Scenes/ContentManager/contenteditor.tscn +++ b/Scenes/ContentManager/contenteditor.tscn @@ -1,22 +1,18 @@ - [gd_scene load_steps=3 format=3 uid="uid://480xqusluqrk"] [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/contenteditor.gd" id="1_65sl4"] [ext_resource type="PackedScene" uid="uid://d3001f5xxpup1" path="res://Scenes/ContentManager/Mapeditor/mapeditor.tscn" id="1_rwi67"] [node name="contenteditor" type="Control" node_paths=PackedStringArray("content")] - layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 - script = ExtResource("1_65sl4") content = NodePath("HSplitContainer/ContentLists/TabContainer2/Content") - [node name="HSplitContainer" type="HSplitContainer" parent="."] layout_mode = 1 anchors_preset = 15 @@ -24,12 +20,15 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 - split_offset = 200 [node name="ContentLists" type="VBoxContainer" parent="HSplitContainer"] layout_mode = 2 +[node name="BackButton" type="Button" parent="HSplitContainer/ContentLists"] +layout_mode = 2 +text = "Back to menu" + [node name="SelectMods" type="OptionButton" parent="HSplitContainer/ContentLists"] layout_mode = 2 tooltip_text = "Select the mod you want edit" @@ -51,7 +50,6 @@ layout_mode = 2 [node name="Recent" type="ItemList" parent="HSplitContainer/ContentLists/TabContainer2"] visible = false - custom_minimum_size = Vector2(200, 200) layout_mode = 2 item_count = 10 @@ -69,7 +67,6 @@ item_7/text = "snail" item_8/text = "core" item_9/text = "pistol_9mm" - [node name="TabContainer" type="TabContainer" parent="HSplitContainer"] layout_mode = 2 @@ -92,3 +89,5 @@ On the right a content editor will be displayed that allows you to edit the sele [node name="generic_house" parent="HSplitContainer/TabContainer" instance=ExtResource("1_rwi67")] visible = false layout_mode = 2 + +[connection signal="button_up" from="HSplitContainer/ContentLists/BackButton" to="." method="_on_back_button_button_up"] diff --git a/Scenes/ContentManager/contentmanager.tscn b/Scenes/ContentManager/contentmanager.tscn index b305f336..f913759e 100644 --- a/Scenes/ContentManager/contentmanager.tscn +++ b/Scenes/ContentManager/contentmanager.tscn @@ -1,15 +1,15 @@ -[gd_scene format=3 uid="uid://buahqv18qlohm"] +[gd_scene load_steps=2 format=3 uid="uid://buahqv18qlohm"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/contentmanager.gd" id="1_lt3y0"] [node name="contentmanager" type="Control"] layout_mode = 3 -<<<<<<< Updated upstream -anchors_preset = 0 -======= anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +script = ExtResource("1_lt3y0") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -25,14 +25,20 @@ offset_bottom = 33.0 grow_horizontal = 2 grow_vertical = 2 -[node name="Button" type="Button" parent="VBoxContainer"] +[node name="ModManagerButton" type="Button" parent="VBoxContainer"] layout_mode = 2 theme_override_font_sizes/font_size = 36 -text = "Content editor -" +text = "Mod manager" -[node name="Button2" type="Button" parent="VBoxContainer"] +[node name="ContentEditorButton" type="Button" parent="VBoxContainer"] layout_mode = 2 theme_override_font_sizes/font_size = 36 -text = "Mod manager" ->>>>>>> Stashed changes +text = "Content editor" + +[node name="BackButton" type="Button" parent="VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 36 +text = "Back" + +[connection signal="button_up" from="VBoxContainer/ContentEditorButton" to="." method="_on_content_editor_button_button_up"] +[connection signal="button_up" from="VBoxContainer/BackButton" to="." method="_on_back_button_button_up"] diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index 95fde38d..174b1128 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -42,3 +42,7 @@ func _on_play_demo_pressed(): func _on_help_button_pressed(): get_tree().change_scene_to_file("res://documentation.tscn") + + +func _on_content_manager_button_button_up(): + get_tree().change_scene_to_file("res://Scenes/ContentManager/contentmanager.tscn") diff --git a/scene_selector.tscn b/scene_selector.tscn index cac7b86a..dcc195db 100644 --- a/scene_selector.tscn +++ b/scene_selector.tscn @@ -1,7 +1,9 @@ -[gd_scene load_steps=3 format=3 uid="uid://bhqlst5h43xwm"] +[gd_scene load_steps=5 format=3 uid="uid://bhqlst5h43xwm"] [ext_resource type="Script" path="res://Scripts/scene_selector.gd" id="1_a5yxj"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="1_sue5h"] +[ext_resource type="PackedScene" uid="uid://dddjfurdx4wcs" path="res://documentation.tscn" id="2_mdmxg"] +[ext_resource type="PackedScene" uid="uid://buahqv18qlohm" path="res://Scenes/ContentManager/contentmanager.tscn" id="3_4iq2k"] [node name="SceneSelector" type="Control" node_paths=PackedStringArray("option_levels")] layout_mode = 3 @@ -12,6 +14,8 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_a5yxj") option_levels = NodePath("OptionButton") +documentation_menu = ExtResource("2_mdmxg") +content_manager_menu = ExtResource("3_4iq2k") [node name="PlayDemo" type="Button" parent="."] layout_mode = 1 @@ -48,6 +52,16 @@ offset_bottom = 553.0 theme_override_font_sizes/font_size = 25 text = "Help" +[node name="ContentManagerButton" type="Button" parent="."] +layout_mode = 0 +offset_left = 477.0 +offset_top = 474.0 +offset_right = 865.0 +offset_bottom = 553.0 +theme_override_font_sizes/font_size = 25 +text = "Content Manager" + [connection signal="pressed" from="PlayDemo" to="." method="_on_play_demo_pressed"] [connection signal="pressed" from="ViewLevel" to="." method="_on_view_level_pressed"] [connection signal="pressed" from="HelpButton" to="." method="_on_help_button_pressed"] +[connection signal="button_up" from="ContentManagerButton" to="." method="_on_content_manager_button_button_up"] From b2df2a1cdff6ee6b3482196353748dcf547fc4ec Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 22 Nov 2023 04:06:39 +0100 Subject: [PATCH 003/138] Now able to create a new json file --- Scenes/ContentManager/Scripts/content_list.gd | 25 +++++++++++++++++++ Scenes/ContentManager/content_list.tscn | 13 +++++----- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index df710f43..b5dc4721 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -3,6 +3,7 @@ extends Control @export var contentItems: ItemList = null @export var collapseButton: Button = null @export var pupup_ID: Popup = null +@export var popup_textedit: TextEdit = null var is_collapsed: bool = true var source: String = "": set(path): @@ -23,6 +24,25 @@ func _on_add_button_button_up(): pupup_ID.show() +# This function will take a string and create a new json file with just {} as the contents. +func create_new_json_file(filename: String = ""): + # If no string was provided, return without doing anything. + if filename.is_empty(): + return + + var file_path = source + filename + ".json" + + # If the file already exists, alert the user that the file already exists. + if FileAccess.file_exists(file_path): + print_debug("The file already exists: " + file_path) + return + + var file = FileAccess.open(file_path, FileAccess.WRITE) + # The name of the json file will be the string that was passed as a parameter. + file.store_string("{}") + file.close() + load_data() + #This function adds items to the content list based on the provided path #If the path is a directory, it will list all the files in the directory @@ -30,6 +50,7 @@ func _on_add_button_button_up(): func load_data(): if source == "": return + contentItems.clear() if source.ends_with(".json"): load_file() else: @@ -68,6 +89,10 @@ func load_dir(): func _on_ok_button_up(): pupup_ID.hide() + if source.ends_with(".json"): + print_debug("Here should be code that adds an item to the json file") + else: + create_new_json_file(popup_textedit.text) func _on_cancel_button_up(): diff --git a/Scenes/ContentManager/content_list.tscn b/Scenes/ContentManager/content_list.tscn index f466fb5f..9c7895ac 100644 --- a/Scenes/ContentManager/content_list.tscn +++ b/Scenes/ContentManager/content_list.tscn @@ -1,8 +1,8 @@ -[gd_scene load_steps=2 format=3 uid="uid://cv2m4bg1uoj4p"] +[gd_scene load_steps=2 format=3 uid="uid://bhh0v7x4fjsgi"] [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/content_list.gd" id="1_ly1kh"] -[node name="ContentList" type="Control" node_paths=PackedStringArray("contentItems", "collapseButton", "pupup_ID")] +[node name="ContentList" type="Control" node_paths=PackedStringArray("contentItems", "collapseButton", "pupup_ID", "popup_textedit")] custom_minimum_size = Vector2(200, 100) layout_mode = 3 anchors_preset = 15 @@ -16,6 +16,7 @@ script = ExtResource("1_ly1kh") contentItems = NodePath("Content/ContentItems") collapseButton = NodePath("Content/HBoxContainer/CollapseButton") pupup_ID = NodePath("ID_Input") +popup_textedit = NodePath("ID_Input/VBoxContainer/TextEdit") [node name="Content" type="VBoxContainer" parent="."] layout_mode = 1 @@ -62,16 +63,16 @@ grow_vertical = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +[node name="Label" type="Label" parent="ID_Input/VBoxContainer"] +layout_mode = 2 +text = "Input an ID" + [node name="TextEdit" type="TextEdit" parent="ID_Input/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 placeholder_text = "ex: pistol_9mm" scroll_fit_content_height = true -[node name="Label" type="Label" parent="ID_Input/VBoxContainer"] -layout_mode = 2 -text = "Input an ID" - [node name="HBoxContainer" type="HBoxContainer" parent="ID_Input/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 From b24fd03e460758aff9eee8cc6accec5eb66a0e03 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 23 Nov 2023 04:16:42 +0100 Subject: [PATCH 004/138] More work on loading mapfiles --- .../Mapeditor/Scripts/GridContainer.gd | 87 +++++++++---------- .../Mapeditor/Scripts/mapeditor.gd | 19 +++- .../ContentManager/Mapeditor/mapeditor.tscn | 19 ++-- Scenes/ContentManager/Scripts/content_list.gd | 20 ++++- .../ContentManager/Scripts/contenteditor.gd | 23 ++++- Scenes/ContentManager/content_list.tscn | 2 +- Scenes/ContentManager/contenteditor.tscn | 10 +-- 7 files changed, 107 insertions(+), 73 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index f4f811e5..8a0ceba5 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -15,18 +15,18 @@ var erase: bool = false var showBelow: bool = false var showAbove: bool = false var snapAmount: float +const defaultMapData: Dictionary = {"mapwidth": 32, "mapheight": 32, "levels": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]} #Contains map metadata like size as well as the data on all levels -var mapData: Dictionary = {"mapwidth": 32, "mapheight": 32, "levels": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]}: +var mapData: Dictionary = defaultMapData.duplicate(): set(data): - mapData = data.duplicate() + if data.is_empty(): + mapData = defaultMapData.duplicate() + else: + mapData = data.duplicate() loadLevelData(currentLevel) signal zoom_level_changed(zoom_level: int) func _on_mapeditor_ready(): -# mapEditor = $"../../../../../../.." -# LevelScrollBar = $"../../../../Levelscroller/LevelScrollbar" -# levelgrid_below = $"../Level_Below" -# levelgrid_above = $"../Level_Above" columns = mapEditor.mapWidth levelgrid_below.columns = mapEditor.mapWidth levelgrid_above.columns = mapEditor.mapWidth @@ -139,6 +139,9 @@ func loadLevelData(newLevel: int): loadLevel(newLevel, self) func loadLevel(level: int, grid: GridContainer): + if mapData.is_empty(): + print_debug("Tried to load data from an empty mapData dictionary") + return; var newLevelData: Array = mapData.levels[level] var i: int = 0 # If any data exists on this level, we load it @@ -208,60 +211,48 @@ func _on_draw_rectangle_toggled(button_pressed): func _on_tilebrush_list_tile_brush_selection_change(tilebrush): selected_brush = tilebrush - +func _on_show_below_toggled(button_pressed): + showBelow = button_pressed + if showBelow: + levelgrid_below.show() + else: + levelgrid_below.hide() -#This function takes the TileGrid.mapData property and saves all of it as a json file. The user will get a prompt asking for a file location. -func _on_save_button_button_up(): - var folderName: String = "./Mods/Core" - var fileName: String = "Generichouse.json" - var saveLoc: String = folderName + "/Maps" + "/" + fileName +func _on_show_above_toggled(button_pressed): + showAbove = button_pressed + if showAbove: + levelgrid_above.show() + else: + levelgrid_above.hide() + + + + +#This function takes the mapData property and saves all of it as a json file. +func save_map_json_file(): # Convert the TileGrid.mapData to a JSON string storeLevelData() var map_data_json = str(mapData.duplicate()) - - var dir = DirAccess.open(folderName) - dir.make_dir("Maps") - + # Save the JSON string to the selected file location - var file = FileAccess.open(saveLoc, FileAccess.WRITE) + var file = FileAccess.open(mapEditor.mapSource, FileAccess.WRITE) if file: file.store_string(map_data_json) else: - print_debug("Unable to write file " + saveLoc) - -func _on_load_button_button_up(): - var folderName: String = "./Mods/Core" - var fileName: String = "Generichouse.json" - var loadLoc: String = folderName + "/Maps" + "/" + fileName - # Convert the tileGrid.mapData to a JSON string - storeLevelData() - - var dir = DirAccess.open(folderName) - dir.make_dir("Maps") + print_debug("Unable to write file " + mapEditor.mapSource) - # Save the JSON string to the selected file location - var file = FileAccess.open(loadLoc, FileAccess.READ) + +func load_map_json_file(): + var fileToLoad: String = mapEditor.mapSource + if fileToLoad == "": + print_debug("Tried to load mapdata, but mapEditor.mapSource is empty") + return; + # Load the JSON string from the selected file location + var file = FileAccess.open(fileToLoad, FileAccess.READ) if file: var map_data_json: Dictionary map_data_json = JSON.parse_string(file.get_as_text()) mapData = map_data_json - else: - print_debug("Unable to load file " + loadLoc) + print_debug("Unable to load file " + fileToLoad) - - -func _on_show_below_toggled(button_pressed): - showBelow = button_pressed - if showBelow: - levelgrid_below.show() - else: - levelgrid_below.hide() - - -func _on_show_above_toggled(button_pressed): - showAbove = button_pressed - if showAbove: - levelgrid_above.show() - else: - levelgrid_above.hide() diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd index c644e359..b54b251c 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd @@ -1,13 +1,19 @@ extends Control +@export var panWindow: Control = null +@export var mapScrollWindow: ScrollContainer = null +@export var gridContainer: ColorRect = null +@export var tileGrid: GridContainer = null + signal zoom_level_changed(value: int) var tileSize: int = 128 var mapHeight: int = 32 var mapWidth: int = 32 +var mapSource: String = "": + set(newSource): + mapSource = newSource + tileGrid.load_map_json_file() -@export var panWindow: Control = null -@export var mapScrollWindow: ScrollContainer = null -@export var gridContainer: ColorRect = null var zoom_level: int = 20: set(val): @@ -58,4 +64,9 @@ func _on_zoom_scroller_zoom_level_changed(value): func _on_tile_grid_zoom_level_changed(value): zoom_level = value - + + +#The editor is closed, destroy the instance +#TODO: Check for unsaved changes +func _on_close_button_button_up(): + queue_free() diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index d0e9af58..4f0b61d0 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -12,7 +12,7 @@ gradient = SubResource("Gradient_x1sdl") width = 24 -[node name="mapeditor" type="Control" node_paths=PackedStringArray("panWindow", "mapScrollWindow", "gridContainer")] +[node name="mapeditor" type="Control" node_paths=PackedStringArray("panWindow", "mapScrollWindow", "gridContainer", "tileGrid")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -23,6 +23,7 @@ script = ExtResource("1_0c7s4") panWindow = NodePath("HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow") mapScrollWindow = NodePath("HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow") gridContainer = NodePath("HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer") +tileGrid = NodePath("HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid") [node name="HSplitContainer" type="HSplitContainer" parent="."] layout_mode = 1 @@ -44,6 +45,12 @@ custom_minimum_size = Vector2(0, 24) layout_mode = 2 size_flags_stretch_ratio = 0.05 +[node name="CloseButton" type="Button" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.15 +text = "Close" + [node name="ZoomScroller" parent="HSplitContainer/MapeditorContainer/Toolbar" instance=ExtResource("1_0ytmu")] layout_mode = 2 size_flags_horizontal = 3 @@ -78,12 +85,6 @@ size_flags_horizontal = 3 size_flags_stretch_ratio = 0.15 text = "Save" -[node name="LoadButton" type="Button" parent="HSplitContainer/MapeditorContainer/Toolbar"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 0.15 -text = "Load" - [node name="DrawRectangle" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 text = "Rectangle" @@ -209,9 +210,9 @@ script = ExtResource("5_he816") [connection signal="ready" from="." to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_mapeditor_ready"] [connection signal="zoom_level_changed" from="." to="HSplitContainer/MapeditorContainer/Toolbar/ZoomScroller" method="_on_mapeditor_zoom_level_changed"] +[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/CloseButton" to="." method="_on_close_button_button_up"] [connection signal="zoom_level_changed" from="HSplitContainer/MapeditorContainer/Toolbar/ZoomScroller" to="." method="_on_zoom_scroller_zoom_level_changed"] -[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/SaveButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_save_button_button_up"] -[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/LoadButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_load_button_button_up"] +[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/SaveButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="save_map_json_file"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_draw_rectangle_toggled"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/Erase" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_erase_toggled"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/ShowBelow" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_show_below_toggled"] diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index b5dc4721..a80889c6 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -4,6 +4,7 @@ extends Control @export var collapseButton: Button = null @export var pupup_ID: Popup = null @export var popup_textedit: TextEdit = null +signal item_activated(strSource: String, itemID: String) var is_collapsed: bool = true var source: String = "": set(path): @@ -80,20 +81,33 @@ func load_dir(): while file_name != "": if !dir.current_is_dir() and file_name.get_extension() == "json": # Add all the filenames to the ContentItems list as child nodes - contentItems.add_item(file_name.replace(".json", "")) + var item_index: int = contentItems.add_item(file_name.replace(".json", "")) + #Add the ID as metadata which can be used to load the item data + contentItems.set_item_metadata(item_index, file_name.replace(".json", "")) file_name = dir.get_next() else: print_debug("An error occurred when trying to access the path: " + source) dir.list_dir_end() - +#Called after the user enters an ID into the popup textbox and presses OK func _on_ok_button_up(): pupup_ID.hide() + if popup_textedit.text == "": + return; if source.ends_with(".json"): print_debug("Here should be code that adds an item to the json file") else: create_new_json_file(popup_textedit.text) - +#Called after the users presses cancel on the popup asking for an ID func _on_cancel_button_up(): pupup_ID.hide() + + +func _on_content_items_item_activated(index): + var strItemID: String = contentItems.get_item_metadata(index) + if strItemID: + item_activated.emit(source, strItemID) + else: + print_debug("Tried to signal that item with ID (" + str(index) + ") was activated,\ + but the item has no metadata") diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index 47e58a84..3b4fdc68 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -1,19 +1,22 @@ extends Control @onready var contentList: PackedScene = preload("res://Scenes/ContentManager/content_list.tscn") +@onready var mapEditor: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/mapeditor.tscn") var selectedMod: String = "Core" @export var content: VBoxContainer = null +@export var tabContainer: TabContainer = null # Called when the node enters the scene tree for the first time. #This function will instatiate a tileScene, set the source property and add it as a child to the content VBoxContainer. The source property should be set to "./Mods/Core/Maps/" func _ready(): # Instantiate a tileScene - var contentListInstance = contentList.instantiate() + var contentListInstance: Control = contentList.instantiate() # Set the source property contentListInstance.source = "./Mods/Core/Maps/" contentListInstance.header = "Maps" + contentListInstance.connect("item_activated", _on_content_item_activated) # Add it as a child to the content VBoxContainer content.add_child(contentListInstance) @@ -21,3 +24,21 @@ func _ready(): func _on_back_button_button_up(): get_tree().change_scene_to_file("res://Scenes/ContentManager/contentmanager.tscn") + +#The user has doubleclicked or pressed enter on one of the items in the content lists +#Depending on wether the source is a JSON file, we are going to load the relevant content +#If strSource is a json file, we load an item from this file with the ID of itemText +#If the strSource is not a json file, we will assume it's a directory. +#If it's a directory, we will load the entire json file with the name of the item ID +func _on_content_item_activated(strSource: String, itemID: String): + if strSource == "" or itemID == "": + print_debug("Tried to load the selected contentitem, but either strSource ("+strSource+")\ + or itemID ("+itemID+") is empty") + return + if strSource.ends_with(".json"): + print_debug("There should be code here to load the item from a json file") + else: + var newMapEditor: Control = mapEditor.instantiate() + newMapEditor.name = itemID + tabContainer.add_child(newMapEditor) + newMapEditor.mapSource = strSource + itemID + ".json" diff --git a/Scenes/ContentManager/content_list.tscn b/Scenes/ContentManager/content_list.tscn index 9c7895ac..ba3ea5c9 100644 --- a/Scenes/ContentManager/content_list.tscn +++ b/Scenes/ContentManager/content_list.tscn @@ -45,7 +45,6 @@ text = "+" custom_minimum_size = Vector2(200, 200) layout_mode = 2 size_flags_vertical = 3 -max_columns = 2 [node name="ID_Input" type="Popup" parent="."] title = "Input ID" @@ -91,5 +90,6 @@ text = "Cancel" [connection signal="button_up" from="Content/HBoxContainer/CollapseButton" to="." method="_on_collapse_button_button_up"] [connection signal="button_up" from="Content/HBoxContainer/AddButton" to="." method="_on_add_button_button_up"] +[connection signal="item_activated" from="Content/ContentItems" to="." method="_on_content_items_item_activated"] [connection signal="button_up" from="ID_Input/VBoxContainer/HBoxContainer/OK" to="." method="_on_ok_button_up"] [connection signal="button_up" from="ID_Input/VBoxContainer/HBoxContainer/Cancel" to="." method="_on_cancel_button_up"] diff --git a/Scenes/ContentManager/contenteditor.tscn b/Scenes/ContentManager/contenteditor.tscn index 4832777c..335b7e0f 100644 --- a/Scenes/ContentManager/contenteditor.tscn +++ b/Scenes/ContentManager/contenteditor.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=3 format=3 uid="uid://480xqusluqrk"] +[gd_scene load_steps=2 format=3 uid="uid://480xqusluqrk"] [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/contenteditor.gd" id="1_65sl4"] -[ext_resource type="PackedScene" uid="uid://d3001f5xxpup1" path="res://Scenes/ContentManager/Mapeditor/mapeditor.tscn" id="1_rwi67"] -[node name="contenteditor" type="Control" node_paths=PackedStringArray("content")] +[node name="contenteditor" type="Control" node_paths=PackedStringArray("content", "tabContainer")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -12,6 +11,7 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_65sl4") content = NodePath("HSplitContainer/ContentLists/TabContainer2/Content") +tabContainer = NodePath("HSplitContainer/TabContainer") [node name="HSplitContainer" type="HSplitContainer" parent="."] layout_mode = 1 @@ -86,8 +86,4 @@ Click the + sign: Allows you to add new content to the mod. Enter the name and a [font_size=22][b]Content editing[/b][/font_size] On the right a content editor will be displayed that allows you to edit the selected item. Multiple editors can be opened in tabs. Use the controls to edit the content and press save to save your edits" -[node name="generic_house" parent="HSplitContainer/TabContainer" instance=ExtResource("1_rwi67")] -visible = false -layout_mode = 2 - [connection signal="button_up" from="HSplitContainer/ContentLists/BackButton" to="." method="_on_back_button_button_up"] From 50f510d1ee93c0663f09874dc0b15cb3b550bdfa Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 23 Nov 2023 19:48:27 +0100 Subject: [PATCH 005/138] Can now save and load maps in editor --- Mods/Core/Maps/urbanroad.json | 1 + Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd | 2 +- Scenes/ContentManager/Scripts/contenteditor.gd | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Mods/Core/Maps/urbanroad.json diff --git a/Mods/Core/Maps/urbanroad.json b/Mods/Core/Maps/urbanroad.json new file mode 100644 index 00000000..30bc7f01 --- /dev/null +++ b/Mods/Core/Maps/urbanroad.json @@ -0,0 +1 @@ +{ "mapwidth": 32, "mapheight": 32, "levels": [[], [], [], [], [], [], [], [], [], [], [{ "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }], [], [], [], [], [], [], [], [], [], []] } \ No newline at end of file diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 8a0ceba5..1684fa9b 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -15,7 +15,7 @@ var erase: bool = false var showBelow: bool = false var showAbove: bool = false var snapAmount: float -const defaultMapData: Dictionary = {"mapwidth": 32, "mapheight": 32, "levels": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]} +var defaultMapData: Dictionary = {"mapwidth": 32, "mapheight": 32, "levels": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]} #Contains map metadata like size as well as the data on all levels var mapData: Dictionary = defaultMapData.duplicate(): set(data): diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index 3b4fdc68..ec642cea 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -41,4 +41,5 @@ func _on_content_item_activated(strSource: String, itemID: String): var newMapEditor: Control = mapEditor.instantiate() newMapEditor.name = itemID tabContainer.add_child(newMapEditor) + tabContainer.current_tab = tabContainer.get_child_count()-1 newMapEditor.mapSource = strSource + itemID + ".json" From cf5743a37a472ad285ede35d321a4d50087456be Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 23 Nov 2023 19:54:22 +0100 Subject: [PATCH 006/138] Load custom levels into main menu --- LevelGenerator.gd | 2 +- Scripts/scene_selector.gd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 77b9006e..d636aab8 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -33,7 +33,7 @@ func generate_level(): if level_name == "": get_level_json() else: - get_custom_level_json("user://levels/" + level_name) + get_custom_level_json("./Mods/Core/Maps/" + level_name) var level_number = 0 diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index 174b1128..c00b5ca8 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -6,7 +6,7 @@ var level_files : Array # Called when the node enters the scene tree for the first time. func _ready(): - dir_contents("user://levels") + dir_contents("./Mods/Core/Maps/") for level_file in level_files: option_levels.add_item(level_file) From 0676fe30170d6568945edb305851eaf330857d0e Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 23 Nov 2023 20:11:47 +0100 Subject: [PATCH 007/138] Fix scaling issue When the materials are generated, set the proper uv scaling so they are correctly visualized in-game. --- LevelGenerator.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index d636aab8..73a5b927 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -125,6 +125,7 @@ func load_tiles_material(): var texture := load("res://Mods/Core/Tiles/" + file_name) # Load the .png file as a texture var material := StandardMaterial3D.new() material.albedo_texture = texture # Set the texture of the material + material.uv1_scale = Vector3(3,2,1) tile_materials[file_name] = material # Add the material to the dictionary file_name = dir.get_next() else: From 4d92eea010a5d70cb545d41823c1e67fb62f3742 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 24 Nov 2023 16:15:07 +0100 Subject: [PATCH 008/138] Fix no scroll bug This fixes the situation where if two map editors are opened, only the last one receives input from the scroll wheel --- Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 1684fa9b..df77d16d 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -59,6 +59,8 @@ var snapLevel: Vector2 = Vector2(snapAmount, snapAmount).round() #When the user presses and holds the middle mousebutton and moves the mouse, change the parent's scroll_horizontal and scroll_vertical properties appropriately func _input(event): + if !mapEditor.visible: + return if event is InputEventMouseButton: match event.button_index: MOUSE_BUTTON_WHEEL_UP: From 94de13f1bf9739b0332bc010a32314db54e0d7a7 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:41:34 +0100 Subject: [PATCH 009/138] Added terraintile editor --- .../Scripts/TerrainTileEditor.gd | 69 +++++++++++++ .../Custom_Editors/TerrainTileEditor.tscn | 97 +++++++++++++++++++ .../Custom_Widgets/Editable_Item_List.tscn | 90 +++++++++++++++++ .../Scripts/Editable_Item_List.gd | 61 ++++++++++++ .../Mapeditor/Scripts/GridContainer.gd | 11 ++- .../Mapeditor/Scripts/mapeditor.gd | 4 +- Scenes/ContentManager/Scripts/content_list.gd | 81 +++++++++++++--- .../ContentManager/Scripts/contenteditor.gd | 37 ++++--- 8 files changed, 415 insertions(+), 35 deletions(-) create mode 100644 Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd create mode 100644 Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn create mode 100644 Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn create mode 100644 Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd new file mode 100644 index 00000000..9f1c7489 --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd @@ -0,0 +1,69 @@ +extends Control + +#This scene is intended to be used inside the content editor +#It is supposed to edit exactly one tile +#It expects to save the data to a JSON file that contains all tile data from a mod +#To load data, provide the name of the tile data file and an ID + + +@export var tileImageDisplay: TextureRect = null +@export var IDTextEdit: TextEdit = null +@export var NameTextEdit: TextEdit = null +@export var DescriptionTextEdit: TextEdit = null +@export var CategoriesList: Control = null + +#The JSON file to be edited +var contentSource: String = "": + set(value): + contentSource = value + load_tile_data() + +#This function will find an item in the contentSource JSOn file with an iD that is equal to self.name +#If an item is found, it will set all the elements in the editor with the corresponding values +func load_tile_data(): + if not FileAccess.file_exists(contentSource): + return + + var file = FileAccess.open(contentSource, FileAccess.READ) + var data = JSON.parse_string(file.get_as_text()) + file.close() + + for item in data: + if item["id"] == self.name: + if tileImageDisplay != null and item.has("imagePath"): + tileImageDisplay.texture = load(item["imagePath"]) + if IDTextEdit != null: + IDTextEdit.text = str(item["id"]) + if NameTextEdit != null and item.has("name"): + NameTextEdit.text = item["name"] + if DescriptionTextEdit != null and item.has("description"): + DescriptionTextEdit.text = item["description"] + if CategoriesList != null and item.has("categories"): + CategoriesList.clear_list() + for category in item["categories"]: + CategoriesList.add_item_to_list(category) + break + + +#The editor is closed, destroy the instance +#TODO: Check for unsaved changes +func _on_close_button_button_up(): + queue_free() + +#This function takes all data fro the form elements and writes it to the contentSource JSON file. +func _on_save_button_button_up(): + var file = FileAccess.open(contentSource, FileAccess.READ_WRITE) + var data = JSON.parse_string(file.get_as_text()) + file.close() + + for item in data: + if item["id"] == IDTextEdit.text: + item["imagePath"] = tileImageDisplay.texture.resource_path + item["name"] = NameTextEdit.text + item["description"] = DescriptionTextEdit.text + item["categories"] = CategoriesList.get_items() + break + + file = FileAccess.open(contentSource, FileAccess.WRITE) + file.store_string(JSON.stringify(data)) + file.close() diff --git a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn new file mode 100644 index 00000000..c7934077 --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn @@ -0,0 +1,97 @@ +[gd_scene load_steps=4 format=3 uid="uid://vfj2if40vf10"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd" id="1_wp6ou"] +[ext_resource type="PackedScene" uid="uid://b8i6wfk3fngy4" path="res://Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn" id="2_erosr"] +[ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_x7b0a"] + +[node name="TerrainTileEditor" type="Control" node_paths=PackedStringArray("tileImageDisplay", "IDTextEdit", "NameTextEdit", "DescriptionTextEdit", "CategoriesList")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_wp6ou") +tileImageDisplay = NodePath("VBoxContainer/FormGrid/TileImageDisplay") +IDTextEdit = NodePath("VBoxContainer/FormGrid/IDTextEdit") +NameTextEdit = NodePath("VBoxContainer/FormGrid/NameTextEdit") +DescriptionTextEdit = NodePath("VBoxContainer/FormGrid/DescriptionTextEdit") +CategoriesList = NodePath("VBoxContainer/FormGrid/Editable_Item_List") + +[node name="VBoxContainer" 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="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="CloseButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Close" + +[node name="SaveButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Save" + +[node name="FormGrid" type="GridContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +columns = 2 + +[node name="ImageLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Image:" + +[node name="TileImageDisplay" type="TextureRect" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_stretch_ratio = 0.4 +texture = ExtResource("2_x7b0a") +expand_mode = 3 + +[node name="IDLabel2" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "ID:" + +[node name="IDTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 + +[node name="NameLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Name" + +[node name="NameTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 + +[node name="DescriptionLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Description" + +[node name="DescriptionTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.9 + +[node name="CategoriesLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Categories:" + +[node name="Editable_Item_List" parent="VBoxContainer/FormGrid" instance=ExtResource("2_erosr")] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +header = "Categories" + +[connection signal="button_up" from="VBoxContainer/HBoxContainer/CloseButton" to="." method="_on_close_button_button_up"] +[connection signal="button_up" from="VBoxContainer/HBoxContainer/SaveButton" to="." method="_on_save_button_button_up"] diff --git a/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn b/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn new file mode 100644 index 00000000..86dc075d --- /dev/null +++ b/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn @@ -0,0 +1,90 @@ +[gd_scene load_steps=2 format=3 uid="uid://b8i6wfk3fngy4"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd" id="1_nx0sy"] + +[node name="Editable_Item_List" type="Control" node_paths=PackedStringArray("contentItems", "collapseButton", "pupup_window", "popup_textedit")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_nx0sy") +contentItems = NodePath("ListControls/ContentItems") +collapseButton = NodePath("ListControls/HBoxContainer/CollapseButton") +pupup_window = NodePath("New_Input") +popup_textedit = NodePath("New_Input/VBoxContainer/InputStringTextEdit") + +[node name="ListControls" 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="HBoxContainer" type="HBoxContainer" parent="ListControls"] +layout_mode = 2 + +[node name="CollapseButton" type="Button" parent="ListControls/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Items" + +[node name="AddButton" type="Button" parent="ListControls/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.15 +theme_override_font_sizes/font_size = 16 +text = "+" + +[node name="ContentItems" type="ItemList" parent="ListControls"] +custom_minimum_size = Vector2(200, 200) +layout_mode = 2 +size_flags_vertical = 3 + +[node name="New_Input" type="Popup" parent="."] +title = "Input ID" +initial_position = 2 +size = Vector2i(200, 150) +unresizable = false +borderless = false + +[node name="VBoxContainer" type="VBoxContainer" parent="New_Input"] +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 + +[node name="InputStringLabel" type="Label" parent="New_Input/VBoxContainer"] +layout_mode = 2 +text = "Input new item" + +[node name="InputStringTextEdit" type="TextEdit" parent="New_Input/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +scroll_fit_content_height = true + +[node name="OKCancelButtons" type="HBoxContainer" parent="New_Input/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="OK" type="Button" parent="New_Input/VBoxContainer/OKCancelButtons"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +text = "Ok" + +[node name="Cancel" type="Button" parent="New_Input/VBoxContainer/OKCancelButtons"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +text = "Cancel" + +[connection signal="button_up" from="ListControls/HBoxContainer/CollapseButton" to="." method="_on_collapse_button_button_up"] +[connection signal="button_up" from="ListControls/HBoxContainer/AddButton" to="." method="_on_add_button_button_up"] +[connection signal="button_up" from="New_Input/VBoxContainer/OKCancelButtons/OK" to="." method="_on_ok_button_up"] +[connection signal="button_up" from="New_Input/VBoxContainer/OKCancelButtons/Cancel" to="." method="_on_cancel_button_up"] diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd new file mode 100644 index 00000000..efd3e80a --- /dev/null +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd @@ -0,0 +1,61 @@ +extends Control + +#This scene is a generic widget that allows users to add an item to the list +#It is intended to be used in the content editor +#After instantiating, set the header to indicate its contents +#Use the get_items function to get an array of items +#Emits signal "item_activated" when an item is doubleclicked + +@export var contentItems: ItemList = null +@export var collapseButton: Button = null +@export var pupup_window: Popup = null +@export var popup_textedit: TextEdit = null +signal item_activated(itemText: String) +var is_collapsed: bool = true +@export var header: String = "Items": + set(newName): + header = newName + collapseButton.text = header + +#This function will collapse and expand the $Content/ContentItems when the collapse button is pressed +func _on_collapse_button_button_up(): + contentItems.visible = is_collapsed + is_collapsed = !is_collapsed + +#This function will show a pop-up asking the user to input an ID +func _on_add_button_button_up(): + pupup_window.show() + +#Called after the user enters a string into the popup textbox and presses OK +func _on_ok_button_up(): + pupup_window.hide() + if popup_textedit.text == "": + return; + contentItems.add_item(popup_textedit.text) + +#Called after the users presses cancel on the popup asking for a string +func _on_cancel_button_up(): + pupup_window.hide() + +#Called when an item in the list is activated by doubleclick or enter +func _on_content_items_item_activated(index): + var strItemText: String = contentItems.get_item_text(index) + if strItemText: + item_activated.emit(strItemText) + else: + print_debug("Tried to signal that item with index (" + str(index) + ") was activated,\ + but the item has no text") + +func clear_list(): + contentItems.clear() + +#This function returns all items in contentItems as an array +func get_items(contentItems): + var myArray: Array = [] + for item in contentItems.item_count: + myArray.append(contentItems.get_item_Text(item)) + return myArray + +func add_item_to_list(itemText: String): + contentItems.add_item(itemText) + diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index df77d16d..bbcb1ed4 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -59,6 +59,7 @@ var snapLevel: Vector2 = Vector2(snapAmount, snapAmount).round() #When the user presses and holds the middle mousebutton and moves the mouse, change the parent's scroll_horizontal and scroll_vertical properties appropriately func _input(event): + #The mapeditor may be invisible if the user selects another tab in the content editor if !mapEditor.visible: return if event is InputEventMouseButton: @@ -234,20 +235,20 @@ func _on_show_above_toggled(button_pressed): func save_map_json_file(): # Convert the TileGrid.mapData to a JSON string storeLevelData() - var map_data_json = str(mapData.duplicate()) + var map_data_json = JSON.stringify(mapData.duplicate()) # Save the JSON string to the selected file location - var file = FileAccess.open(mapEditor.mapSource, FileAccess.WRITE) + var file = FileAccess.open(mapEditor.contentSource, FileAccess.WRITE) if file: file.store_string(map_data_json) else: - print_debug("Unable to write file " + mapEditor.mapSource) + print_debug("Unable to write file " + mapEditor.contentSource) func load_map_json_file(): - var fileToLoad: String = mapEditor.mapSource + var fileToLoad: String = mapEditor.contentSource if fileToLoad == "": - print_debug("Tried to load mapdata, but mapEditor.mapSource is empty") + print_debug("Tried to load mapdata, but mapEditor.contentSource is empty") return; # Load the JSON string from the selected file location var file = FileAccess.open(fileToLoad, FileAccess.READ) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd index b54b251c..6801f875 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd @@ -9,9 +9,9 @@ signal zoom_level_changed(value: int) var tileSize: int = 128 var mapHeight: int = 32 var mapWidth: int = 32 -var mapSource: String = "": +var contentSource: String = "": set(newSource): - mapSource = newSource + contentSource = newSource tileGrid.load_map_json_file() diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index a80889c6..04386e47 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -1,5 +1,11 @@ extends Control +#This scene is a control which lists content from any loaded mods +#It allows users to select content for editing and creating new content +#This node should be used to load everything from one specific json file or one directory +#The json file or directory is specified by setting the source variable +#This node is intended to be used in the content editor + @export var contentItems: ItemList = null @export var collapseButton: Button = null @export var pupup_ID: Popup = null @@ -26,21 +32,23 @@ func _on_add_button_button_up(): # This function will take a string and create a new json file with just {} as the contents. -func create_new_json_file(filename: String = ""): +#If the file already exists, we do not overwrite it +func create_new_json_file(filename: String = "", isArray: bool = true): # If no string was provided, return without doing anything. if filename.is_empty(): return - var file_path = source + filename + ".json" - # If the file already exists, alert the user that the file already exists. - if FileAccess.file_exists(file_path): - print_debug("The file already exists: " + file_path) + if FileAccess.file_exists(filename): + print_debug("The file already exists: " + filename) return - var file = FileAccess.open(file_path, FileAccess.WRITE) - # The name of the json file will be the string that was passed as a parameter. - file.store_string("{}") + var file = FileAccess.open(filename, FileAccess.WRITE) + #The file cen contain either one object or one array with a list of objects + if isArray: + file.store_string("[]") + else: + file.store_string("{}") file.close() load_data() @@ -58,18 +66,18 @@ func load_data(): load_dir() func load_file(): + create_new_json_file(source) # Save the JSON string to the selected file location var file = FileAccess.open(source, FileAccess.READ) if file: - var data_json: Dictionary + var data_json: Array data_json = JSON.parse_string(file.get_as_text()) for item in data_json: - # get the name of the item, "missing_name" if not found - var item_name: String = item.get("name", "missing_name") + # get the id of the item, "missing_id" if not found + var item_id: String = item.get("id", "missing_id") #Add the item and save the index number - var item_index: int = contentItems.add_item(item_name) - #Add the ID as metadata which can be used to load the item data - contentItems.set_item_metadata(item_index, item.get("id", "missing_id")) + var item_index: int = contentItems.add_item(item_id) + contentItems.set_item_metadata(item_index, item_id) else: print_debug("Unable to load file: " + source) @@ -95,9 +103,9 @@ func _on_ok_button_up(): if popup_textedit.text == "": return; if source.ends_with(".json"): - print_debug("Here should be code that adds an item to the json file") + add_item_to_json_file(popup_textedit.text) else: - create_new_json_file(popup_textedit.text) + create_new_json_file(source + popup_textedit.text + ".json", false) #Called after the users presses cancel on the popup asking for an ID func _on_cancel_button_up(): @@ -111,3 +119,44 @@ func _on_content_items_item_activated(index): else: print_debug("Tried to signal that item with ID (" + str(index) + ") was activated,\ but the item has no metadata") + + +#This function enters a new item into the json file specified by the source variable +#The item will just be an object like this: {"id": id} +#If an item with that ID already exists in that file, do nothing +func add_item_to_json_file(id: String): +# If the source is not a JSON file, return without doing anything. + if !source.ends_with(".json"): + return + + # If the file does not exist, create a new JSON file. + if !FileAccess.file_exists(source): + create_new_json_file(source, true) + + # Open the file and load the JSON data. + var file = FileAccess.open(source, FileAccess.READ) + var data_json: Array + if file: + data_json = JSON.parse_string(file.get_as_text()) + file.close() + else: + print_debug("Unable to load file: " + source) + return + + # Check if an item with the given ID already exists in the file. + for item in data_json: + if item.get("id", "") == id: + print_debug("An item with ID (" + id + ") already exists in the file.") + return + + # If no item with the given ID exists, add a new item to the JSON data. + data_json.append({"id": id}) + + # Save the updated JSON data to the file. + file = FileAccess.open(source, FileAccess.WRITE) + if file: + file.store_string(JSON.stringify(data_json)) + file.close() + else: + print_debug("Unable to write to file: " + source) + load_data() diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index ec642cea..d6892ad8 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -2,6 +2,8 @@ extends Control @onready var contentList: PackedScene = preload("res://Scenes/ContentManager/content_list.tscn") @onready var mapEditor: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/mapeditor.tscn") +@onready var terrainTileEditor: PackedScene = preload("res://Scenes/ContentManager/\ +Custom_Editors/TerrainTileEditor.tscn") var selectedMod: String = "Core" @export var content: VBoxContainer = null @@ -10,18 +12,21 @@ var selectedMod: String = "Core" # Called when the node enters the scene tree for the first time. #This function will instatiate a tileScene, set the source property and add it as a child to the content VBoxContainer. The source property should be set to "./Mods/Core/Maps/" func _ready(): - # Instantiate a tileScene + load_content_list("./Mods/Core/Maps/", "Maps") + load_content_list("./Mods/Core/Tiles/Tiles.json", "Terrain Tiles") + +func load_content_list(strSource: String, strHeader: String): + # Instantiate a contentlist var contentListInstance: Control = contentList.instantiate() # Set the source property - contentListInstance.source = "./Mods/Core/Maps/" - contentListInstance.header = "Maps" + contentListInstance.source = strSource + contentListInstance.header = strHeader contentListInstance.connect("item_activated", _on_content_item_activated) # Add it as a child to the content VBoxContainer content.add_child(contentListInstance) - func _on_back_button_button_up(): get_tree().change_scene_to_file("res://Scenes/ContentManager/contentmanager.tscn") @@ -32,14 +37,22 @@ func _on_back_button_button_up(): #If it's a directory, we will load the entire json file with the name of the item ID func _on_content_item_activated(strSource: String, itemID: String): if strSource == "" or itemID == "": - print_debug("Tried to load the selected contentitem, but either strSource ("+strSource+")\ - or itemID ("+itemID+") is empty") + print_debug("Tried to load the selected contentitem, but either \ + strSource ("+strSource+") or itemID ("+itemID+") is empty") return if strSource.ends_with(".json"): - print_debug("There should be code here to load the item from a json file") + if strSource.begins_with("./Mods/Core/Tiles/"): + instantiate_editor(strSource, itemID, terrainTileEditor) else: - var newMapEditor: Control = mapEditor.instantiate() - newMapEditor.name = itemID - tabContainer.add_child(newMapEditor) - tabContainer.current_tab = tabContainer.get_child_count()-1 - newMapEditor.mapSource = strSource + itemID + ".json" + if strSource.begins_with("./Mods/Core/Maps/"): + instantiate_editor(strSource + itemID + ".json", itemID, mapEditor) + +#This will add an editor to the content editor tab view. +#The editor that should be instantiated is passed trough in the newEditor parameter +#It is important that the editor has the property contentSource so it can be set +func instantiate_editor(strSource: String, itemID: String, newEditor: PackedScene): + var newContentEditor: Control = newEditor.instantiate() + newContentEditor.name = itemID + tabContainer.add_child(newContentEditor) + tabContainer.current_tab = tabContainer.get_child_count()-1 + newContentEditor.contentSource = strSource From a869594403c4d7c090c1554af02551c73c88cc03 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 25 Nov 2023 11:33:31 +0100 Subject: [PATCH 010/138] Tile saving and loading works --- .../Scripts/TerrainTileEditor.gd | 70 +++++++++++++++++++ .../Custom_Editors/TerrainTileEditor.tscn | 62 +++++++++++++++- .../Scripts/Editable_Item_List.gd | 4 +- .../Mapeditor/Scripts/TilebrushList.gd | 4 +- .../Mapeditor/Scripts/tilebrush.gd | 9 +++ 5 files changed, 143 insertions(+), 6 deletions(-) diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd index 9f1c7489..1a788ec4 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd @@ -6,17 +6,23 @@ extends Control #To load data, provide the name of the tile data file and an ID +@onready var tileBrush: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/tilebrush.tscn") + @export var tileImageDisplay: TextureRect = null @export var IDTextEdit: TextEdit = null @export var NameTextEdit: TextEdit = null @export var DescriptionTextEdit: TextEdit = null @export var CategoriesList: Control = null +@export var tileSelector: Popup = null +@export var tileBrushList: HFlowContainer = null +@export var tilePathStringLabel: Label = null #The JSON file to be edited var contentSource: String = "": set(value): contentSource = value load_tile_data() + load_Brush_List() #This function will find an item in the contentSource JSOn file with an iD that is equal to self.name #If an item is found, it will set all the elements in the editor with the corresponding values @@ -32,6 +38,7 @@ func load_tile_data(): if item["id"] == self.name: if tileImageDisplay != null and item.has("imagePath"): tileImageDisplay.texture = load(item["imagePath"]) + tilePathStringLabel.text = item["imagePath"] if IDTextEdit != null: IDTextEdit.text = str(item["id"]) if NameTextEdit != null and item.has("name"): @@ -67,3 +74,66 @@ func _on_save_button_button_up(): file = FileAccess.open(contentSource, FileAccess.WRITE) file.store_string(JSON.stringify(data)) file.close() + + +#When the tileImageDisplay is clicked, the user will be prompted to select an image from +# "res://Mods/Core/Tiles/". The texture of the tileImageDisplay will change to the selected image +func _on_tile_image_display_gui_input(event): + if event is InputEventMouseButton and event.pressed: + tileSelector.show() + + +# this function will read all files in "res://Mods/Core/Tiles/" and for each file it will create a texturerect and assign the file as the texture of the texturerect. Then it will add the texturerect as a child to $HSplitContainer/EntitiesContainer/TilesList +func load_Brush_List(): + var tilesDir = "res://Mods/Core/Tiles/" + + var dir = DirAccess.open(tilesDir) + if dir: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + var extension = file_name.get_extension() + + if !dir.current_is_dir(): + if extension == "png": + # Create a TextureRect node + var brushInstance = tileBrush.instantiate() + + # Load the texture from file + var texture: Resource = load(tilesDir + file_name) + + # Assign the texture to the TextureRect + brushInstance.set_tile_texture(texture) + brushInstance.set_meta("path", tilesDir + file_name) + brushInstance.tilebrush_clicked.connect(tilebrush_clicked) + + # Add the TextureRect as a child to the TilesList + tileBrushList.add_child(brushInstance) + file_name = dir.get_next() + else: + print_debug("An error occurred when trying to access the path.") + dir.list_dir_end() + +#Called after the user selects a tile in the popup textbox and presses OK +func _on_ok_button_up(): + tileSelector.hide() + var children = tileBrushList.get_children() + for child in children: + if child.selected: + tileImageDisplay.texture = load(child.get_meta("path")) + tilePathStringLabel.text = child.get_meta("path") + +#Called after the users presses cancel on the popup asking for a tile +func _on_cancel_button_up(): + tileSelector.hide() + +func deselect_all_brushes(): + var children = tileBrushList.get_children() + for child in children: + child.set_selected(false) + +#Mark the clicked tilebrush as selected, but only after deselecting all other brushes +func tilebrush_clicked(tilebrush: Control) -> void: + deselect_all_brushes() + # If the clicked brush was not select it, we select it. Otherwise we deselect it + tilebrush.set_selected(true) diff --git a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn index c7934077..512fd27d 100644 --- a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn @@ -4,7 +4,7 @@ [ext_resource type="PackedScene" uid="uid://b8i6wfk3fngy4" path="res://Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn" id="2_erosr"] [ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_x7b0a"] -[node name="TerrainTileEditor" type="Control" node_paths=PackedStringArray("tileImageDisplay", "IDTextEdit", "NameTextEdit", "DescriptionTextEdit", "CategoriesList")] +[node name="TerrainTileEditor" type="Control" node_paths=PackedStringArray("tileImageDisplay", "IDTextEdit", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "tileSelector", "tileBrushList", "tilePathStringLabel")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -17,6 +17,9 @@ IDTextEdit = NodePath("VBoxContainer/FormGrid/IDTextEdit") NameTextEdit = NodePath("VBoxContainer/FormGrid/NameTextEdit") DescriptionTextEdit = NodePath("VBoxContainer/FormGrid/DescriptionTextEdit") CategoriesList = NodePath("VBoxContainer/FormGrid/Editable_Item_List") +tileSelector = NodePath("Tile_selector") +tileBrushList = NodePath("Tile_selector/VBoxContainer/ScrollContainer/TilebrushList") +tilePathStringLabel = NodePath("VBoxContainer/FormGrid/PathString") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -53,7 +56,7 @@ size_flags_stretch_ratio = 0.4 texture = ExtResource("2_x7b0a") expand_mode = 3 -[node name="IDLabel2" type="Label" parent="VBoxContainer/FormGrid"] +[node name="IDLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 text = "ID:" @@ -63,6 +66,13 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.1 +[node name="PathLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Path:" + +[node name="PathString" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 + [node name="NameLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 text = "Name" @@ -93,5 +103,53 @@ size_flags_horizontal = 3 size_flags_vertical = 3 header = "Categories" +[node name="Tile_selector" type="Popup" parent="."] +title = "Input ID" +initial_position = 2 +size = Vector2i(400, 400) +unresizable = false +borderless = false + +[node name="VBoxContainer" type="VBoxContainer" parent="Tile_selector"] +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 + +[node name="Label" type="Label" parent="Tile_selector/VBoxContainer"] +layout_mode = 2 +text = "Select a tile" + +[node name="ScrollContainer" type="ScrollContainer" parent="Tile_selector/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="TilebrushList" type="HFlowContainer" parent="Tile_selector/VBoxContainer/ScrollContainer"] +clip_contents = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="Tile_selector/VBoxContainer"] +layout_mode = 2 + +[node name="OK" type="Button" parent="Tile_selector/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +text = "Ok" + +[node name="Cancel" type="Button" parent="Tile_selector/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +text = "Cancel" + [connection signal="button_up" from="VBoxContainer/HBoxContainer/CloseButton" to="." method="_on_close_button_button_up"] [connection signal="button_up" from="VBoxContainer/HBoxContainer/SaveButton" to="." method="_on_save_button_button_up"] +[connection signal="gui_input" from="VBoxContainer/FormGrid/TileImageDisplay" to="." method="_on_tile_image_display_gui_input"] +[connection signal="button_up" from="Tile_selector/VBoxContainer/HBoxContainer/OK" to="." method="_on_ok_button_up"] +[connection signal="button_up" from="Tile_selector/VBoxContainer/HBoxContainer/Cancel" to="." method="_on_cancel_button_up"] diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd index efd3e80a..dae61644 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd @@ -50,10 +50,10 @@ func clear_list(): contentItems.clear() #This function returns all items in contentItems as an array -func get_items(contentItems): +func get_items(): var myArray: Array = [] for item in contentItems.item_count: - myArray.append(contentItems.get_item_Text(item)) + myArray.append(contentItems.get_item_text(item)) return myArray func add_item_to_list(itemText: String): diff --git a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd index 02513572..b5a9670a 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd @@ -47,11 +47,11 @@ func tilebrush_clicked(tilebrush: Control) -> void: # If the clicked brush was not select it, we select it. Otherwise we deselect it if selected_brush != tilebrush: selected_brush = tilebrush - selected_brush.modulate = Color(0.227, 0.635, 0.757) + selected_brush.set_selected(true) else: selected_brush = null func deselect_all_brushes(): var children = get_children() for child in children: - child.modulate = Color(1,1,1) + child.set_selected(false) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd b/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd index 7437278e..c7a0fedc 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd @@ -1,6 +1,7 @@ extends Control signal tilebrush_clicked(clicked_tile: Control) +var selected: bool = false #When the event was a left mouse button press, adjust the modulate property of the $TileSprite to be 3aa2c1 func _on_texture_rect_gui_input(event): @@ -13,3 +14,11 @@ func set_tile_texture(res: Resource) -> void: func get_texture() -> Resource: return $TileSprite.texture +#Mark the clicked tilebrush as selected +func set_selected(is_selected: bool) -> void: + selected = is_selected + if selected: + modulate = Color(0.227, 0.635, 0.757) + else: + modulate = Color(1,1,1) + From 5d62db058223ffcef19ed4e9d86c13d20dce5753 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 26 Nov 2023 00:06:26 +0100 Subject: [PATCH 011/138] Improved tile editor Improved saving loading, added duplicate and delete buttons, icons --- Mods/Core/Tiles/Tiles.json | 1 + .../Scripts/TerrainTileEditor.gd | 8 +- .../Custom_Editors/TerrainTileEditor.tscn | 7 +- .../Scripts/Editable_Item_List.gd | 7 +- Scenes/ContentManager/Scripts/content_list.gd | 186 ++++++++++++++++-- Scenes/ContentManager/content_list.tscn | 21 ++ Scenes/ContentManager/contenteditor.tscn | 2 +- 7 files changed, 204 insertions(+), 28 deletions(-) create mode 100644 Mods/Core/Tiles/Tiles.json diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json new file mode 100644 index 00000000..0578b836 --- /dev/null +++ b/Mods/Core/Tiles/Tiles.json @@ -0,0 +1 @@ +[{"categories":["Ground"],"description":"Field of grass","id":"grass_plain","imagePath":"res://Mods/Core/Tiles/1.png","name":"Plain grass\t"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_00","imagePath":"res://Mods/Core/Tiles/woodboards.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_01","imagePath":"res://Mods/Core/Tiles/woodboards1.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_02","imagePath":"res://Mods/Core/Tiles/woodboards2.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_00","imagePath":"res://Mods/Core/Tiles/woodboards3.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_01","imagePath":"res://Mods/Core/Tiles/woodboards4.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_02","imagePath":"res://Mods/Core/Tiles/woodboards5.png","name":"Low quality wood floor"}] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd index 1a788ec4..57866cd5 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd @@ -9,7 +9,7 @@ extends Control @onready var tileBrush: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/tilebrush.tscn") @export var tileImageDisplay: TextureRect = null -@export var IDTextEdit: TextEdit = null +@export var IDTextLabel: Label = null @export var NameTextEdit: TextEdit = null @export var DescriptionTextEdit: TextEdit = null @export var CategoriesList: Control = null @@ -39,8 +39,8 @@ func load_tile_data(): if tileImageDisplay != null and item.has("imagePath"): tileImageDisplay.texture = load(item["imagePath"]) tilePathStringLabel.text = item["imagePath"] - if IDTextEdit != null: - IDTextEdit.text = str(item["id"]) + if IDTextLabel != null: + IDTextLabel.text = str(item["id"]) if NameTextEdit != null and item.has("name"): NameTextEdit.text = item["name"] if DescriptionTextEdit != null and item.has("description"): @@ -64,7 +64,7 @@ func _on_save_button_button_up(): file.close() for item in data: - if item["id"] == IDTextEdit.text: + if item["id"] == IDTextLabel.text: item["imagePath"] = tileImageDisplay.texture.resource_path item["name"] = NameTextEdit.text item["description"] = DescriptionTextEdit.text diff --git a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn index 512fd27d..ec340533 100644 --- a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn @@ -4,7 +4,7 @@ [ext_resource type="PackedScene" uid="uid://b8i6wfk3fngy4" path="res://Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn" id="2_erosr"] [ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_x7b0a"] -[node name="TerrainTileEditor" type="Control" node_paths=PackedStringArray("tileImageDisplay", "IDTextEdit", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "tileSelector", "tileBrushList", "tilePathStringLabel")] +[node name="TerrainTileEditor" type="Control" node_paths=PackedStringArray("tileImageDisplay", "IDTextLabel", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "tileSelector", "tileBrushList", "tilePathStringLabel")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -13,7 +13,7 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_wp6ou") tileImageDisplay = NodePath("VBoxContainer/FormGrid/TileImageDisplay") -IDTextEdit = NodePath("VBoxContainer/FormGrid/IDTextEdit") +IDTextLabel = NodePath("VBoxContainer/FormGrid/IDTextLabel") NameTextEdit = NodePath("VBoxContainer/FormGrid/NameTextEdit") DescriptionTextEdit = NodePath("VBoxContainer/FormGrid/DescriptionTextEdit") CategoriesList = NodePath("VBoxContainer/FormGrid/Editable_Item_List") @@ -50,6 +50,7 @@ layout_mode = 2 text = "Image:" [node name="TileImageDisplay" type="TextureRect" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(128, 128) layout_mode = 2 size_flags_horizontal = 0 size_flags_stretch_ratio = 0.4 @@ -60,7 +61,7 @@ expand_mode = 3 layout_mode = 2 text = "ID:" -[node name="IDTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +[node name="IDTextLabel" type="Label" parent="VBoxContainer/FormGrid"] custom_minimum_size = Vector2(0, 30) layout_mode = 2 size_flags_horizontal = 3 diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd index dae61644..3f205a4f 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd @@ -56,6 +56,11 @@ func get_items(): myArray.append(contentItems.get_item_text(item)) return myArray -func add_item_to_list(itemText: String): +func add_item_to_list(itemText: String) -> void: contentItems.add_item(itemText) + +func get_selected_item_text() -> String: + if !contentItems.is_anything_selected(): + return "" + return contentItems.get_item_text(contentItems.get_selected_items()[0]) diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 04386e47..2a2bb3c4 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -12,6 +12,7 @@ extends Control @export var popup_textedit: TextEdit = null signal item_activated(strSource: String, itemID: String) var is_collapsed: bool = true +var popupAction: String = "" var source: String = "": set(path): source = path @@ -26,10 +27,6 @@ func _on_collapse_button_button_up(): $Content/ContentItems.visible = is_collapsed is_collapsed = !is_collapsed -#This function will show a pop-up asking the user to input an ID -func _on_add_button_button_up(): - pupup_ID.show() - # This function will take a string and create a new json file with just {} as the contents. #If the file already exists, we do not overwrite it @@ -40,7 +37,7 @@ func create_new_json_file(filename: String = "", isArray: bool = true): # If the file already exists, alert the user that the file already exists. if FileAccess.file_exists(filename): - print_debug("The file already exists: " + filename) +# print_debug("The file already exists: " + filename) return var file = FileAccess.open(filename, FileAccess.WRITE) @@ -78,6 +75,9 @@ func load_file(): #Add the item and save the index number var item_index: int = contentItems.add_item(item_id) contentItems.set_item_metadata(item_index, item_id) + + if item.has("imagePath"): + contentItems.set_item_icon(item_index,load(item["imagePath"])) else: print_debug("Unable to load file: " + source) @@ -97,20 +97,6 @@ func load_dir(): print_debug("An error occurred when trying to access the path: " + source) dir.list_dir_end() -#Called after the user enters an ID into the popup textbox and presses OK -func _on_ok_button_up(): - pupup_ID.hide() - if popup_textedit.text == "": - return; - if source.ends_with(".json"): - add_item_to_json_file(popup_textedit.text) - else: - create_new_json_file(source + popup_textedit.text + ".json", false) - -#Called after the users presses cancel on the popup asking for an ID -func _on_cancel_button_up(): - pupup_ID.hide() - func _on_content_items_item_activated(index): var strItemID: String = contentItems.get_item_metadata(index) @@ -160,3 +146,165 @@ func add_item_to_json_file(id: String): else: print_debug("Unable to write to file: " + source) load_data() + + + +#This function will show a pop-up asking the user to input an ID +func _on_add_button_button_up(): + popupAction = "Add" + popup_textedit.text = "" + pupup_ID.show() + +#This function requires that an item from the list is selected +#Once clicked, it will show pupup_ID to ask the user for a new ID +#If the user enters an ID and presses OK, it will read the file from the source variable +#And duplicate the item that has the same ID as the ID that was selected +#The duplicate item will recieve the ID that the user has entered in the popup +#Lastly, the new duplicated item will be added to contentItems +func _on_duplicate_button_button_up(): + var selected_id: String = get_selected_item_text() + if selected_id == "": + return + popupAction = "Duplicate" + popup_textedit.text = selected_id + pupup_ID.show() + + +#Called after the user enters an ID into the popup textbox and presses OK +func _on_ok_button_up(): + pupup_ID.hide() + if popup_textedit.text == "": + return; + if popupAction == "Add": + if source.ends_with(".json"): + add_item_to_json_file(popup_textedit.text) + else: + create_new_json_file(source + popup_textedit.text + ".json", false) + if popupAction == "Duplicate": + if source.ends_with(".json"): + duplicate_item_in_json_file(get_selected_item_text(), popup_textedit.text) + else: + print_debug("There should be code here for when a json file gets duplicated") + popupAction = "" + +#Called after the users presses cancel on the popup asking for an ID +func _on_cancel_button_up(): + pupup_ID.hide() + popupAction = "" + +#This function requires that an item from the list is selected +#Once clicked, the selected item will be removed from contentItems +#It will also remove the item from the json file specified by source +func _on_delete_button_button_up(): + var selected_id: String = get_selected_item_text() + if selected_id == "": + return + contentItems.remove_item(contentItems.get_selected_items()[0]) + if source.ends_with(".json"): + remove_item_from_json_file(selected_id) + else: + delete_json_file(source + selected_id + ".json") + + +#This function removes an item from the json file specified by the source variable +#If an item with that ID does not exist in that file, do nothing +func remove_item_from_json_file(id: String): + # If the source is not a JSON file, return without doing anything. + if !source.ends_with(".json"): + return + + # If the file does not exist, return without doing anything. + if !FileAccess.file_exists(source): + return + + # Open the file and load the JSON data. + var file = FileAccess.open(source, FileAccess.READ) + var data_json: Array + if file: + data_json = JSON.parse_string(file.get_as_text()) + file.close() + else: + print_debug("Unable to load file: " + source) + return + + # Check if an item with the given ID exists in the file. + for i in range(data_json.size()): + if data_json[i].get("id", "") == id: + data_json.remove_at(i) + break + + # Save the updated JSON data to the file. + file = FileAccess.open(source, FileAccess.WRITE) + if file: + file.store_string(JSON.stringify(data_json)) + file.close() + else: + print_debug("Unable to write to file: " + source) + load_data() + + +#This function will take two strings called ID and newID +#It will find an item with this ID in a json file specified by the source variable +#It will then duplicate that item into the json file and change the ID to newID +func duplicate_item_in_json_file(id: String, newID: String): + # If the source is not a JSON file, return without doing anything. + if !source.ends_with(".json"): + return + + # If the file does not exist, return without doing anything. + if !FileAccess.file_exists(source): + return + + # Open the file and load the JSON data. + var file = FileAccess.open(source, FileAccess.READ) + var data_json: Array + if file: + data_json = JSON.parse_string(file.get_as_text()) + file.close() + else: + print_debug("Unable to load file: " + source) + return + + # Check if an item with the given ID exists in the file. + var item_to_duplicate = null + for item in data_json: + if item.get("id", "") == id: + item_to_duplicate = item.duplicate() + break + + # If there is no item to duplicate, return without doing anything. + if item_to_duplicate == null: + return + + # Change the ID of the duplicated item. + item_to_duplicate["id"] = newID + + # Add the duplicated item to the JSON data. + data_json.append(item_to_duplicate) + + # Save the updated JSON data to the file. + file = FileAccess.open(source, FileAccess.WRITE) + if file: + file.store_string(JSON.stringify(data_json)) + file.close() + else: + print_debug("Unable to write to file: " + source) + load_data() + + +#This function will take a path to a json file and delete it +func delete_json_file(path: String): + var dir = DirAccess.open(path) + if dir: + # Delete the file + var err = dir.remove(path) + if err == OK: + print_debug("File deleted successfully: " + path) + else: + print_debug("An error occurred when trying to delete the file: " + path) + load_data() + +func get_selected_item_text() -> String: + if !contentItems.is_anything_selected(): + return "" + return contentItems.get_item_text(contentItems.get_selected_items()[0]) diff --git a/Scenes/ContentManager/content_list.tscn b/Scenes/ContentManager/content_list.tscn index ba3ea5c9..3c259820 100644 --- a/Scenes/ContentManager/content_list.tscn +++ b/Scenes/ContentManager/content_list.tscn @@ -32,19 +32,38 @@ layout_mode = 2 [node name="CollapseButton" type="Button" parent="Content/HBoxContainer"] layout_mode = 2 size_flags_horizontal = 3 +tooltip_text = "Click to collapse" text = "Items" [node name="AddButton" type="Button" parent="Content/HBoxContainer"] layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.15 +tooltip_text = "Add item" theme_override_font_sizes/font_size = 16 text = "+" +[node name="DuplicateButton" type="Button" parent="Content/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.15 +tooltip_text = "Duplicate item" +theme_override_font_sizes/font_size = 16 +text = "D" + +[node name="DeleteButton" type="Button" parent="Content/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.15 +tooltip_text = "Delete item" +theme_override_font_sizes/font_size = 16 +text = "-" + [node name="ContentItems" type="ItemList" parent="Content"] custom_minimum_size = Vector2(200, 200) layout_mode = 2 size_flags_vertical = 3 +fixed_icon_size = Vector2i(32, 32) [node name="ID_Input" type="Popup" parent="."] title = "Input ID" @@ -90,6 +109,8 @@ text = "Cancel" [connection signal="button_up" from="Content/HBoxContainer/CollapseButton" to="." method="_on_collapse_button_button_up"] [connection signal="button_up" from="Content/HBoxContainer/AddButton" to="." method="_on_add_button_button_up"] +[connection signal="button_up" from="Content/HBoxContainer/DuplicateButton" to="." method="_on_duplicate_button_button_up"] +[connection signal="button_up" from="Content/HBoxContainer/DeleteButton" to="." method="_on_delete_button_button_up"] [connection signal="item_activated" from="Content/ContentItems" to="." method="_on_content_items_item_activated"] [connection signal="button_up" from="ID_Input/VBoxContainer/HBoxContainer/OK" to="." method="_on_ok_button_up"] [connection signal="button_up" from="ID_Input/VBoxContainer/HBoxContainer/Cancel" to="." method="_on_cancel_button_up"] diff --git a/Scenes/ContentManager/contenteditor.tscn b/Scenes/ContentManager/contenteditor.tscn index 335b7e0f..552a1cc7 100644 --- a/Scenes/ContentManager/contenteditor.tscn +++ b/Scenes/ContentManager/contenteditor.tscn @@ -20,7 +20,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -split_offset = 200 +split_offset = 240 [node name="ContentLists" type="VBoxContainer" parent="HSplitContainer"] layout_mode = 2 From cb77aeda141373521b078f2b38af823a617408cb Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 26 Nov 2023 19:03:53 +0100 Subject: [PATCH 012/138] Contenteditor adjusted sizing, tab control --- Mods/Core/Tiles/Tiles.json | 2 +- .../Custom_Editors/TerrainTileEditor.tscn | 4 ++++ .../Custom_Widgets/Editable_Item_List.tscn | 15 +++++++++++++++ .../Custom_Widgets/Scripts/Editable_Item_List.gd | 10 ++++++++++ Scenes/ContentManager/Scripts/content_list.gd | 8 ++++++-- Scenes/ContentManager/content_list.tscn | 2 +- 6 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index 0578b836..40b07392 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -1 +1 @@ -[{"categories":["Ground"],"description":"Field of grass","id":"grass_plain","imagePath":"res://Mods/Core/Tiles/1.png","name":"Plain grass\t"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_00","imagePath":"res://Mods/Core/Tiles/woodboards.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_01","imagePath":"res://Mods/Core/Tiles/woodboards1.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_02","imagePath":"res://Mods/Core/Tiles/woodboards2.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_00","imagePath":"res://Mods/Core/Tiles/woodboards3.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_01","imagePath":"res://Mods/Core/Tiles/woodboards4.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_02","imagePath":"res://Mods/Core/Tiles/woodboards5.png","name":"Low quality wood floor"}] \ No newline at end of file +[{"categories":["Ground"],"description":"Field of grass","id":"grass_plain","imagePath":"res://Mods/Core/Tiles/1.png","name":"Plain grass\t"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_00","imagePath":"res://Mods/Core/Tiles/woodboards.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_01","imagePath":"res://Mods/Core/Tiles/woodboards1.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_02","imagePath":"res://Mods/Core/Tiles/woodboards2.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_00","imagePath":"res://Mods/Core/Tiles/woodboards3.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_01","imagePath":"res://Mods/Core/Tiles/woodboards4.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_02","imagePath":"res://Mods/Core/Tiles/woodboards5.png","name":"Low quality wood floor"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on","id":"road_asphalt_basic","imagePath":"res://Mods/Core/Tiles/asphalt_basic.png","name":"Basic asphalt road"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has diagonal markings","id":"road_asphalt_diagonal","imagePath":"res://Mods/Core/Tiles/asphalt_diag_middle.png","name":"Asphalt road with diagonal markings"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has markings indicating a west turn","id":"road_asphalt_turn_west","imagePath":"res://Mods/Core/Tiles/asphalt_horizontal_middle_downleft.png","name":"Asphalt road with markings turning west"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has markings indicating a east turn","id":"road_asphalt_turn_east","imagePath":"res://Mods/Core/Tiles/asphalt_horizontal_middle_upright.png","name":"Asphalt road with markings turning east"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has vertical markings","id":"road_asphalt_vertical","imagePath":"res://Mods/Core/Tiles/asphalt_middle.png","name":"Asphalt road with vertical markings"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has markings indicating a north turn","id":"road_asphalt_turn_north","imagePath":"res://Mods/Core/Tiles/asphalt_middle_downleft.png","name":"Asphalt road with markings turning north"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has horizontal markings","id":"road_asphalt_horizontal","imagePath":"res://Mods/Core/Tiles/asphalt_middle_horizontal.png","name":"Asphalt road with horizontal markings"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has markings indicating a south turn","id":"road_asphalt_turn_south","imagePath":"res://Mods/Core/Tiles/asphalt_middle_upright.png","name":"Asphalt road with markings turning south"},{"categories":["Floor","Urban"],"description":"A stone floor wihere the stones are shaped like an arch. Used in an urban environement.","id":"arc_stones_floor","imagePath":"res://Mods/Core/Tiles/arcstones.png","name":"Arc stones floor"},{"categories":["Ground"],"description":"Field of grass","id":"grass_plain_01","imagePath":"res://Mods/Core/Tiles/basegrass1.png","name":"Plain grass\t"}] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn index ec340533..cded26a1 100644 --- a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn @@ -83,6 +83,8 @@ custom_minimum_size = Vector2(0, 30) layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.1 +focus_next = NodePath("../DescriptionTextEdit") +focus_previous = NodePath("../TileImageDisplay") [node name="DescriptionLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 @@ -93,6 +95,8 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 size_flags_stretch_ratio = 0.9 +focus_next = NodePath("../Editable_Item_List") +focus_previous = NodePath("../NameTextEdit") [node name="CategoriesLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 diff --git a/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn b/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn index 86dc075d..0aa31b26 100644 --- a/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn +++ b/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn @@ -29,19 +29,33 @@ layout_mode = 2 [node name="CollapseButton" type="Button" parent="ListControls/HBoxContainer"] layout_mode = 2 size_flags_horizontal = 3 +focus_next = NodePath("../AddButton") text = "Items" [node name="AddButton" type="Button" parent="ListControls/HBoxContainer"] layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.15 +focus_next = NodePath("../RemoveButton") +focus_previous = NodePath("../CollapseButton") theme_override_font_sizes/font_size = 16 text = "+" +[node name="RemoveButton" type="Button" parent="ListControls/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.15 +focus_next = NodePath("../../ContentItems") +focus_previous = NodePath("../AddButton") +theme_override_font_sizes/font_size = 16 +text = "-" + [node name="ContentItems" type="ItemList" parent="ListControls"] custom_minimum_size = Vector2(200, 200) layout_mode = 2 size_flags_vertical = 3 +focus_next = NodePath("../HBoxContainer/CollapseButton") +focus_previous = NodePath("../HBoxContainer/RemoveButton") [node name="New_Input" type="Popup" parent="."] title = "Input ID" @@ -86,5 +100,6 @@ text = "Cancel" [connection signal="button_up" from="ListControls/HBoxContainer/CollapseButton" to="." method="_on_collapse_button_button_up"] [connection signal="button_up" from="ListControls/HBoxContainer/AddButton" to="." method="_on_add_button_button_up"] +[connection signal="button_up" from="ListControls/HBoxContainer/RemoveButton" to="." method="_on_delete_button_button_up"] [connection signal="button_up" from="New_Input/VBoxContainer/OKCancelButtons/OK" to="." method="_on_ok_button_up"] [connection signal="button_up" from="New_Input/VBoxContainer/OKCancelButtons/Cancel" to="." method="_on_cancel_button_up"] diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd index 3f205a4f..5335e6c8 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Editable_Item_List.gd @@ -64,3 +64,13 @@ func get_selected_item_text() -> String: if !contentItems.is_anything_selected(): return "" return contentItems.get_item_text(contentItems.get_selected_items()[0]) + + +#This function requires that an item from the list is selected +#Once clicked, the selected item will be removed from contentItems +#It will also remove the item from the json file specified by source +func _on_delete_button_button_up(): + var selected_id: String = get_selected_item_text() + if selected_id == "": + return + contentItems.remove_item(contentItems.get_selected_items()[0]) diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 2a2bb3c4..c2a481a7 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -11,7 +11,7 @@ extends Control @export var pupup_ID: Popup = null @export var popup_textedit: TextEdit = null signal item_activated(strSource: String, itemID: String) -var is_collapsed: bool = true +var is_collapsed: bool = false var popupAction: String = "" var source: String = "": set(path): @@ -24,7 +24,11 @@ var header: String = "Items": #This function will collapse and expand the $Content/ContentItems when the collapse button is pressed func _on_collapse_button_button_up(): - $Content/ContentItems.visible = is_collapsed + contentItems.visible = is_collapsed + if is_collapsed: + size_flags_vertical = Control.SIZE_EXPAND_FILL + else: + size_flags_vertical = Control.SIZE_SHRINK_BEGIN is_collapsed = !is_collapsed diff --git a/Scenes/ContentManager/content_list.tscn b/Scenes/ContentManager/content_list.tscn index 3c259820..d801867b 100644 --- a/Scenes/ContentManager/content_list.tscn +++ b/Scenes/ContentManager/content_list.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/content_list.gd" id="1_ly1kh"] [node name="ContentList" type="Control" node_paths=PackedStringArray("contentItems", "collapseButton", "pupup_ID", "popup_textedit")] -custom_minimum_size = Vector2(200, 100) +custom_minimum_size = Vector2(200, 30) layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 From 306b9f84f9cd2081f76241db00c0127f1ba1747b Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 27 Nov 2023 19:20:10 +0100 Subject: [PATCH 013/138] Added categories to map editor --- .../Scripts/Scrolling_Flow_Container.gd | 22 +++++ .../Scrolling_Flow_Container.tscn | 40 +++++++++ .../Mapeditor/Scripts/TilebrushList.gd | 85 +++++++++++++------ .../ContentManager/Mapeditor/mapeditor.tscn | 11 --- Scripts/Helper/json_helper.gd | 26 ++++++ 5 files changed, 146 insertions(+), 38 deletions(-) create mode 100644 Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd create mode 100644 Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn create mode 100644 Scripts/Helper/json_helper.gd diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd new file mode 100644 index 00000000..a997376a --- /dev/null +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd @@ -0,0 +1,22 @@ +extends Control + + +@export var contentItems: FlowContainer = null +@export var collapseButton: Button = null +var is_collapsed: bool = false +var header: String = "Items": + set(newName): + header = newName + collapseButton.text = header + +#This function will collapse and expand the $Content/ContentItems when the collapse button is pressed +func _on_collapse_button_button_up(): + contentItems.visible = is_collapsed + if is_collapsed: + size_flags_vertical = Control.SIZE_EXPAND_FILL + else: + size_flags_vertical = Control.SIZE_SHRINK_BEGIN + is_collapsed = !is_collapsed + +func add_content_item(item: Node): + contentItems.add_child(item) diff --git a/Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn b/Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn new file mode 100644 index 00000000..61f84100 --- /dev/null +++ b/Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=2 format=3 uid="uid://be62h2ytgw2kb"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd" id="1_4knl7"] + +[node name="Scrolling_Flow_Container" type="Control" node_paths=PackedStringArray("contentItems", "collapseButton")] +layout_mode = 3 +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_4knl7") +contentItems = NodePath("VBoxContainer/ScrollContainer/FlowContainer") +collapseButton = NodePath("VBoxContainer/CollapseButton") + +[node name="VBoxContainer" 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="CollapseButton" type="Button" parent="VBoxContainer"] +custom_minimum_size = Vector2(200, 30) +layout_mode = 2 +text = "Items" + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="FlowContainer" type="FlowContainer" parent="VBoxContainer/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[connection signal="button_up" from="VBoxContainer/CollapseButton" to="." method="_on_collapse_button_button_up"] diff --git a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd index b5a9670a..2a39f4f8 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd @@ -1,6 +1,11 @@ -extends HFlowContainer +extends VBoxContainer @onready var tileBrush: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/tilebrush.tscn") +@onready var scrolling_Flow_Container: PackedScene = preload("res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn") + +const json_Helper_Class = preload("res://Scripts/Helper/json_helper.gd") +var json_helper = null +var instanced_brushes: Array[Node] = [] signal tile_brush_selection_change(tilebrush: Control) var selected_brush: Control: @@ -9,37 +14,64 @@ var selected_brush: Control: tile_brush_selection_change.emit(selected_brush) func _ready(): + json_helper = json_Helper_Class.new() loadTiles() # this function will read all files in "res://Mods/Core/Tiles/" and for each file it will create a texturerect and assign the file as the texture of the texturerect. Then it will add the texturerect as a child to $HSplitContainer/EntitiesContainer/TilesList func loadTiles(): - var tilesDir = "res://Mods/Core/Tiles/" + var tilesFile = "res://Mods/Core/Tiles/Tiles.json" + var tileList: Array = json_helper.load_json_array_file(tilesFile) - var dir = DirAccess.open(tilesDir) - if dir: - dir.list_dir_begin() - var file_name = dir.get_next() - while file_name != "": - var extension = file_name.get_extension() - - if !dir.current_is_dir(): - if extension == "png": - # Create a TextureRect node - var brushInstance = tileBrush.instantiate() - - # Load the texture from file - var texture: Resource = load(tilesDir + file_name) - # Assign the texture to the TextureRect - brushInstance.set_tile_texture(texture) - brushInstance.tilebrush_clicked.connect(tilebrush_clicked) + for item in tileList: + if item.has("imagePath"): + #We need to put the tiles the right catecory + #Each tile can have 0 or more categories + for category in item["categories"]: + #Check if the category was already added + var newTilesList: Control = find_list_by_category(category) + if !newTilesList: + newTilesList = scrolling_Flow_Container.instantiate() + newTilesList.header = category + add_child(newTilesList) + # Load the texture from file + var texture: Resource = load(item["imagePath"]) + # Create a TextureRect node + var brushInstance = tileBrush.instantiate() + # Assign the texture to the TextureRect + brushInstance.set_tile_texture(texture) + brushInstance.tilebrush_clicked.connect(tilebrush_clicked) - # Add the TextureRect as a child to the TilesList - add_child(brushInstance) - file_name = dir.get_next() - else: - print_debug("An error occurred when trying to access the path.") - dir.list_dir_end() + # Add the TextureRect as a child to the TilesList + newTilesList.add_content_item(brushInstance) + instanced_brushes.append(brushInstance) +# if item["id"] == self.name: +# if tileImageDisplay != null and item.has("imagePath"): +# tileImageDisplay.texture = load(item["imagePath"]) +# tilePathStringLabel.text = item["imagePath"] +# if IDTextLabel != null: +# IDTextLabel.text = str(item["id"]) +# if NameTextEdit != null and item.has("name"): +# NameTextEdit.text = item["name"] +# if DescriptionTextEdit != null and item.has("description"): +# DescriptionTextEdit.text = item["description"] +# if CategoriesList != null and item.has("categories"): +# CategoriesList.clear_list() +# for category in item["categories"]: +# CategoriesList.add_item_to_list(category) +# break + +#Find the list associated with the category +func find_list_by_category(category: String) -> Control: + var currentCategories: Array[Node] = get_children() + var categoryFound: Control = null + #Check if the category was already added + for categoryList in currentCategories: + if categoryList.header == category: + categoryFound = categoryList + break + return categoryFound + #Mark the clicked tilebrush as selected, but only after deselecting all other brushes func tilebrush_clicked(tilebrush: Control) -> void: @@ -52,6 +84,5 @@ func tilebrush_clicked(tilebrush: Control) -> void: selected_brush = null func deselect_all_brushes(): - var children = get_children() - for child in children: + for child in instanced_brushes: child.set_selected(false) diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 4f0b61d0..2d0116cd 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -196,16 +196,6 @@ rounded = true layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.2 - -[node name="ScrollContainer" type="ScrollContainer" parent="HSplitContainer/EntitiesContainer"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="TilebrushList" type="HFlowContainer" parent="HSplitContainer/EntitiesContainer/ScrollContainer"] -clip_contents = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 script = ExtResource("5_he816") [connection signal="ready" from="." to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_mapeditor_ready"] @@ -221,4 +211,3 @@ script = ExtResource("5_he816") [connection signal="zoom_level_changed" from="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" to="." method="_on_tile_grid_zoom_level_changed"] [connection signal="value_changed" from="HSplitContainer/MapeditorContainer/HBoxContainer/Levelscroller/LevelScrollbar" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_level_scrollbar_value_changed"] [connection signal="value_changed" from="HSplitContainer/MapeditorContainer/HBoxContainer/Levelscroller/LevelScrollbar" to="HSplitContainer/MapeditorContainer/HBoxContainer/Levelscroller" method="_on_level_scrollbar_value_changed"] -[connection signal="tile_brush_selection_change" from="HSplitContainer/EntitiesContainer/ScrollContainer/TilebrushList" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_tilebrush_list_tile_brush_selection_change"] diff --git a/Scripts/Helper/json_helper.gd b/Scripts/Helper/json_helper.gd new file mode 100644 index 00000000..34206472 --- /dev/null +++ b/Scripts/Helper/json_helper.gd @@ -0,0 +1,26 @@ +extends Node + +#This script is a generic helper script to load and manipulate JSOn files. +#In another script, you can load an instance of this script using: +#const json_Helper_Class = preload("res://Scripts/Helper/json_helper.gd") +#var json_helper: Resource = null + +#func _ready() -> void: +# json_helper := json_Helper_Class.new() + + +#This function takes the path to a json file and returns its contents as an array +#It should check if the contents is an array or not. If it is not an array, +#it should return an empty array +func load_json_array_file(source: String) -> Array: + var data_json: Array = [] + var file = FileAccess.open(source, FileAccess.READ) + if file: + var parsed_data = JSON.parse_string(file.get_as_text()) + if typeof(parsed_data) == TYPE_ARRAY: + data_json = parsed_data + else: + print_debug("The file does not contain a JSON array: " + source) + else: + print_debug("Unable to load file: " + source) + return data_json From af4e1f2a65b615c82235f065c97a1389a0b33529 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 28 Nov 2023 20:19:47 +0100 Subject: [PATCH 014/138] Polishing --- Mods/Core/Maps/urbanroad.json | 2 +- .../Scrolling_Flow_Container.tscn | 1 + .../Mapeditor/Scripts/TilebrushList.gd | 10 ++++---- .../ContentManager/Mapeditor/mapeditor.tscn | 23 ++++++++++++------- .../ContentManager/Scripts/contenteditor.gd | 10 ++++---- Scenes/ContentManager/contenteditor.tscn | 8 ++++++- 6 files changed, 34 insertions(+), 20 deletions(-) diff --git a/Mods/Core/Maps/urbanroad.json b/Mods/Core/Maps/urbanroad.json index 30bc7f01..1d5f05f4 100644 --- a/Mods/Core/Maps/urbanroad.json +++ b/Mods/Core/Maps/urbanroad.json @@ -1 +1 @@ -{ "mapwidth": 32, "mapheight": 32, "levels": [[], [], [], [], [], [], [], [], [], [], [{ "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_middle_horizontal.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "asphalt_basic.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "2.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }, { "texture": "grassdirt.png", "rotation": 0 }], [], [], [], [], [], [], [], [], [], []] } \ No newline at end of file +{"levels":[[],[],[],[],[],[],[],[],[],[],[{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"}],[],[],[],[],[],[],[],[],[],[]],"mapheight":32,"mapwidth":32} \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn b/Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn index 61f84100..619cb99f 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn +++ b/Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn @@ -3,6 +3,7 @@ [ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd" id="1_4knl7"] [node name="Scrolling_Flow_Container" type="Control" node_paths=PackedStringArray("contentItems", "collapseButton")] +custom_minimum_size = Vector2(200, 35) layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 diff --git a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd index 2a39f4f8..3f237431 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd @@ -1,9 +1,11 @@ extends VBoxContainer -@onready var tileBrush: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/tilebrush.tscn") -@onready var scrolling_Flow_Container: PackedScene = preload("res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn") +#@onready var tileBrush: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/tilebrush.tscn") +#@onready var scrolling_Flow_Container: PackedScene = preload("res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn") +@export var scrolling_Flow_Container: PackedScene = null +@export var json_Helper_Class: GDScript = null +@export var tileBrush: PackedScene = null -const json_Helper_Class = preload("res://Scripts/Helper/json_helper.gd") var json_helper = null var instanced_brushes: Array[Node] = [] @@ -33,7 +35,7 @@ func loadTiles(): if !newTilesList: newTilesList = scrolling_Flow_Container.instantiate() newTilesList.header = category - add_child(newTilesList) + add_child(newTilesList) # Load the texture from file var texture: Resource = load(item["imagePath"]) # Create a TextureRect node diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 2d0116cd..3be361c7 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -1,10 +1,13 @@ -[gd_scene load_steps=8 format=3 uid="uid://d3001f5xxpup1"] +[gd_scene load_steps=11 format=3 uid="uid://d3001f5xxpup1"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd" id="1_0c7s4"] [ext_resource type="PackedScene" uid="uid://bswccbbg6ijep" path="res://Scenes/ContentManager/Mapeditor/Toolbar/mapeditorzoomscroller.tscn" id="1_0ytmu"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd" id="2_sf17m"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/Levelscroller.gd" id="3_i1qbw"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd" id="5_he816"] +[ext_resource type="Script" path="res://Scripts/Helper/json_helper.gd" id="6_ecso8"] +[ext_resource type="PackedScene" uid="uid://be62h2ytgw2kb" path="res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn" id="6_onaby"] +[ext_resource type="PackedScene" uid="uid://cccnrdolr1bfo" path="res://Scenes/ContentManager/Mapeditor/tilebrush.tscn" id="8_o4x7s"] [sub_resource type="Gradient" id="Gradient_x1sdl"] @@ -51,6 +54,12 @@ size_flags_horizontal = 3 size_flags_stretch_ratio = 0.15 text = "Close" +[node name="SaveButton" type="Button" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.15 +text = "Save" + [node name="ZoomScroller" parent="HSplitContainer/MapeditorContainer/Toolbar" instance=ExtResource("1_0ytmu")] layout_mode = 2 size_flags_horizontal = 3 @@ -79,12 +88,6 @@ theme_override_constants/line_spacing = 0 theme_override_font_sizes/font_size = 16 text = "32" -[node name="SaveButton" type="Button" parent="HSplitContainer/MapeditorContainer/Toolbar"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 0.15 -text = "Save" - [node name="DrawRectangle" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 text = "Rectangle" @@ -197,12 +200,15 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.2 script = ExtResource("5_he816") +scrolling_Flow_Container = ExtResource("6_onaby") +json_Helper_Class = ExtResource("6_ecso8") +tileBrush = ExtResource("8_o4x7s") [connection signal="ready" from="." to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_mapeditor_ready"] [connection signal="zoom_level_changed" from="." to="HSplitContainer/MapeditorContainer/Toolbar/ZoomScroller" method="_on_mapeditor_zoom_level_changed"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/CloseButton" to="." method="_on_close_button_button_up"] -[connection signal="zoom_level_changed" from="HSplitContainer/MapeditorContainer/Toolbar/ZoomScroller" to="." method="_on_zoom_scroller_zoom_level_changed"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/SaveButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="save_map_json_file"] +[connection signal="zoom_level_changed" from="HSplitContainer/MapeditorContainer/Toolbar/ZoomScroller" to="." method="_on_zoom_scroller_zoom_level_changed"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_draw_rectangle_toggled"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/Erase" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_erase_toggled"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/ShowBelow" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_show_below_toggled"] @@ -211,3 +217,4 @@ script = ExtResource("5_he816") [connection signal="zoom_level_changed" from="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" to="." method="_on_tile_grid_zoom_level_changed"] [connection signal="value_changed" from="HSplitContainer/MapeditorContainer/HBoxContainer/Levelscroller/LevelScrollbar" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_level_scrollbar_value_changed"] [connection signal="value_changed" from="HSplitContainer/MapeditorContainer/HBoxContainer/Levelscroller/LevelScrollbar" to="HSplitContainer/MapeditorContainer/HBoxContainer/Levelscroller" method="_on_level_scrollbar_value_changed"] +[connection signal="tile_brush_selection_change" from="HSplitContainer/EntitiesContainer" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_tilebrush_list_tile_brush_selection_change"] diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index d6892ad8..36f2c60c 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -1,13 +1,11 @@ extends Control -@onready var contentList: PackedScene = preload("res://Scenes/ContentManager/content_list.tscn") -@onready var mapEditor: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/mapeditor.tscn") -@onready var terrainTileEditor: PackedScene = preload("res://Scenes/ContentManager/\ -Custom_Editors/TerrainTileEditor.tscn") -var selectedMod: String = "Core" - +@export var contentList: PackedScene = null +@export var mapEditor: PackedScene = null +@export var terrainTileEditor: PackedScene = null @export var content: VBoxContainer = null @export var tabContainer: TabContainer = null +var selectedMod: String = "Core" # Called when the node enters the scene tree for the first time. #This function will instatiate a tileScene, set the source property and add it as a child to the content VBoxContainer. The source property should be set to "./Mods/Core/Maps/" diff --git a/Scenes/ContentManager/contenteditor.tscn b/Scenes/ContentManager/contenteditor.tscn index 552a1cc7..d6716403 100644 --- a/Scenes/ContentManager/contenteditor.tscn +++ b/Scenes/ContentManager/contenteditor.tscn @@ -1,6 +1,9 @@ -[gd_scene load_steps=2 format=3 uid="uid://480xqusluqrk"] +[gd_scene load_steps=5 format=3 uid="uid://480xqusluqrk"] [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/contenteditor.gd" id="1_65sl4"] +[ext_resource type="PackedScene" uid="uid://bhh0v7x4fjsgi" path="res://Scenes/ContentManager/content_list.tscn" id="2_4f21i"] +[ext_resource type="PackedScene" uid="uid://d3001f5xxpup1" path="res://Scenes/ContentManager/Mapeditor/mapeditor.tscn" id="3_q062s"] +[ext_resource type="PackedScene" uid="uid://vfj2if40vf10" path="res://Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn" id="4_5nnw0"] [node name="contenteditor" type="Control" node_paths=PackedStringArray("content", "tabContainer")] layout_mode = 3 @@ -10,6 +13,9 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_65sl4") +contentList = ExtResource("2_4f21i") +mapEditor = ExtResource("3_q062s") +terrainTileEditor = ExtResource("4_5nnw0") content = NodePath("HSplitContainer/ContentLists/TabContainer2/Content") tabContainer = NodePath("HSplitContainer/TabContainer") From eebe6d34348c0a26ad712d12f749a154ad7781c4 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 28 Nov 2023 20:23:31 +0100 Subject: [PATCH 015/138] Remove comments --- .../Mapeditor/Scripts/TilebrushList.gd | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd index 3f237431..d9de9112 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd @@ -47,21 +47,6 @@ func loadTiles(): # Add the TextureRect as a child to the TilesList newTilesList.add_content_item(brushInstance) instanced_brushes.append(brushInstance) -# if item["id"] == self.name: -# if tileImageDisplay != null and item.has("imagePath"): -# tileImageDisplay.texture = load(item["imagePath"]) -# tilePathStringLabel.text = item["imagePath"] -# if IDTextLabel != null: -# IDTextLabel.text = str(item["id"]) -# if NameTextEdit != null and item.has("name"): -# NameTextEdit.text = item["name"] -# if DescriptionTextEdit != null and item.has("description"): -# DescriptionTextEdit.text = item["description"] -# if CategoriesList != null and item.has("categories"): -# CategoriesList.clear_list() -# for category in item["categories"]: -# CategoriesList.add_item_to_list(category) -# break #Find the list associated with the category func find_list_by_category(category: String) -> Control: From 9b7c849063ff965b017a97cefa40b7fdca4980c8 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 29 Nov 2023 00:25:27 +0100 Subject: [PATCH 016/138] Starting POC --- Mods/Core/OvermapTiles/1.png | Bin 0 -> 2582 bytes Mods/Core/OvermapTiles/1.png.import | 34 ++++ Mods/Core/OvermapTiles/arcstones1.png | Bin 0 -> 2422 bytes Mods/Core/OvermapTiles/arcstones1.png.import | 34 ++++ .../OvermapTiles/forestunderbrushscale5.png | Bin 0 -> 3079 bytes .../forestunderbrushscale5.png.import | 34 ++++ Mods/Core/OvermapTiles/rockyfloor4.png | Bin 0 -> 1768 bytes Mods/Core/OvermapTiles/rockyfloor4.png.import | 34 ++++ Scenes/Overmap/Overmap.tscn | 41 ++++ Scenes/Overmap/Scripts/Overmap.gd | 188 ++++++++++++++++++ 10 files changed, 365 insertions(+) create mode 100644 Mods/Core/OvermapTiles/1.png create mode 100644 Mods/Core/OvermapTiles/1.png.import create mode 100644 Mods/Core/OvermapTiles/arcstones1.png create mode 100644 Mods/Core/OvermapTiles/arcstones1.png.import create mode 100644 Mods/Core/OvermapTiles/forestunderbrushscale5.png create mode 100644 Mods/Core/OvermapTiles/forestunderbrushscale5.png.import create mode 100644 Mods/Core/OvermapTiles/rockyfloor4.png create mode 100644 Mods/Core/OvermapTiles/rockyfloor4.png.import create mode 100644 Scenes/Overmap/Overmap.tscn create mode 100644 Scenes/Overmap/Scripts/Overmap.gd diff --git a/Mods/Core/OvermapTiles/1.png b/Mods/Core/OvermapTiles/1.png new file mode 100644 index 0000000000000000000000000000000000000000..10aeec41991eb75ac0d347cbeb214a2567107cea GIT binary patch literal 2582 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 literal 0 HcmV?d00001 diff --git a/Mods/Core/OvermapTiles/arcstones1.png.import b/Mods/Core/OvermapTiles/arcstones1.png.import new file mode 100644 index 00000000..0dd2f1e2 --- /dev/null +++ b/Mods/Core/OvermapTiles/arcstones1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://br51vko5o7o6e" +path="res://.godot/imported/arcstones1.png-f1c80d77cdb940353593822e678fe7c8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/OvermapTiles/arcstones1.png" +dest_files=["res://.godot/imported/arcstones1.png-f1c80d77cdb940353593822e678fe7c8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Mods/Core/OvermapTiles/forestunderbrushscale5.png b/Mods/Core/OvermapTiles/forestunderbrushscale5.png new file mode 100644 index 0000000000000000000000000000000000000000..79bb0e967163b048b51d1facd75ddd76d87d8f7a GIT binary patch literal 3079 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 KMNUMnLSTY+T09E? literal 0 HcmV?d00001 diff --git a/Mods/Core/OvermapTiles/rockyfloor4.png.import b/Mods/Core/OvermapTiles/rockyfloor4.png.import new file mode 100644 index 00000000..42cfde53 --- /dev/null +++ b/Mods/Core/OvermapTiles/rockyfloor4.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ivc6violj6vr" +path="res://.godot/imported/rockyfloor4.png-91f26024c21cf174dcff99a521b7fd55.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/OvermapTiles/rockyfloor4.png" +dest_files=["res://.godot/imported/rockyfloor4.png-91f26024c21cf174dcff99a521b7fd55.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Scenes/Overmap/Overmap.tscn b/Scenes/Overmap/Overmap.tscn new file mode 100644 index 00000000..d9502c24 --- /dev/null +++ b/Scenes/Overmap/Overmap.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=2 format=3 uid="uid://bgswuol251m3u"] + +[ext_resource type="Script" path="res://Scenes/Overmap/Scripts/Overmap.gd" id="1_fmft1"] + +[node name="Overmap" type="Control" node_paths=PackedStringArray("positionLabel", "tilesContainer")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_fmft1") +positionLabel = NodePath("Label") +tilesContainer = NodePath("TilesContainer") + +[node name="TilesContainer" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Label" type="Label" parent="."] +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 = -11.5 +offset_right = 20.0 +offset_bottom = 11.5 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0, 0.898039, 0.356863, 1) +theme_override_font_sizes/font_size = 26 +text = "+" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd new file mode 100644 index 00000000..a2d44f15 --- /dev/null +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -0,0 +1,188 @@ +extends Control + +@export var positionLabel: Label = null +@export var tilesContainer: Control = null +var position_coord: Vector2 = Vector2(0, 0) +var last_position_coord: Vector2 = Vector2() +var tiles: Array = ["1.png", "arcstones1.png", "forestunderbrushscale5.png", "rockyfloor4.png"] +var chunks: Dictionary = {} +var noise = FastNoiseLite.new() +var chunk_height: int = 32 +var chunk_width: int = 32 +var chunk_size = 32 +var loaded_tiles: Array = [] +var tile_materials = {} # Create an empty dictionary to store materials + +#We will connect the position_coord to this function in the _ready function +func _ready(): + load_tiles_material() + noise.seed = randi() + noise.fractal_octaves = 4 + noise.domain_warp_amplitude = 20.0 + noise.fractal_gain = 0.5 + update_chunks() + connect("position_coord_changed", on_position_coord_changed) + draw_all_chunks() + +# The GDScript function `update_chunks()` updates the +# chunks in a 2D game world. It loops through a 4x4 grid +# centered on the current position, generating new chunks +# at each position if they don't already exist. After +# generating any necessary new chunks, it calls `unload_chunks()` +# to unload any chunks that are no longer needed. The +# `chunk_size` variable determines the size of each chunk, +# and `position_coord` is the current position in the +# game world. +func update_chunks(): + for x in range(-2, 2): + for y in range(-2, 2): + var chunk_position = position_coord + Vector2(x, y) * chunk_size + if not chunks.has(chunk_position): + generate_chunk(chunk_position, chunk_size) + unload_chunks() + +# This GDScript function, `generate_chunk`, generates +# a chunk of tiles at a given position with a specified +# size. First, it initializes an empty list, `chunk`, +# to store the tiles. Then, it iterates over the range +# of the new size in both the x and y dimensions. For +# each tile, it determines the tile type based on a 2D +# noise function, which takes the x and y coordinates +# (adjusted by the position of the chunk) as input. This +# noise value is then normalized (to be within the range +# of 0 to 1) and scaled by the size of the `tiles` array, +# then converted to an integer to serve as an index for +# the `tiles` array. The corresponding tile is added +# to the `chunk` list. Finally, the function stores the +# generated chunk in the `chunks` dictionary, using the +# position of the chunk as the key. This function is +# typically used in procedural generation of game maps, +# where each "chunk" represents a portion of the game +# world. +func generate_chunk(position_loc: Vector2, newSize: int): + var chunk = [] + for x in range(newSize): + for y in range(newSize): + var tile_type = noise.get_noise_2d(position_loc.x + x, position_loc.y + y) + tile_type = int((tile_type + 1) / 2 * tiles.size()) + chunk.append(tiles[tile_type]) + chunks[position_loc] = chunk + +func unload_chunks(): + for chunk_position in chunks.keys(): + if chunk_position.distance_to(position_coord) > 2 * chunk_size: + chunks.erase(chunk_position) + +var mouse_button_pressed: bool = false + +#We will emit this signal when the position_coords change +signal position_coord_changed(delta) + +#We will change the position_coords in the _input function +func _input(event): + if event is InputEventMouseButton: + match event.button_index: + MOUSE_BUTTON_MIDDLE: + if event.pressed: + mouse_button_pressed = true + else: + mouse_button_pressed = false + + if event is InputEventMouseMotion: + if mouse_button_pressed: + # Calculate the new position first. + var new_position_coord = position_coord - event.relative / 100 + # Now calculate delta based on the old and new positions. + var delta = new_position_coord - last_position_coord + # Update position_coord to the new position + position_coord = new_position_coord + # Pass the delta when emitting the signal + emit_signal("position_coord_changed", delta) + # Update last_position_coord for the next input event. + last_position_coord = position_coord + update_chunks() +# var delta = position_coord - last_position_coord +# print_debug(delta) +# position_coord += event.relative / 100 +# emit_signal("position_coord_changed", delta) +# last_position_coord = position_coord +# update_chunks() +# position_coord.x += event.relative.x / 100 +# position_coord.y += event.relative.y / 100 +# emit_signal("position_coord_changed") +# update_chunks() + +#This function is never called but is used to draw tile onto the screen +#We need to find when to call this function, probably after chunks are updated +func draw_all_chunks(): + for chunk_position in chunks.keys(): + var chunk = chunks[chunk_position] + for i in range(chunk.size()): + var tile_position = chunk_position + Vector2(i % 32, i / 32) + var tile_type = chunk[i] + var texture = tile_materials[tile_type] +# var texture = load("res://Mods/Core/OvermapTiles/" + tile_type + ".png") + var tile = TextureRect.new() + tile.texture = texture + tile.position = tile_position * 32 + tilesContainer.add_child(tile) + loaded_tiles.append(tile) + if positionLabel: + positionLabel.text = "Position: " + str(position_coord) + + +#This function will move all the tiles on screen when the position_coords change +#This will make it look like the user pans across the map +#When tiles move too far away the should be unloaded + +func update_tiles_position(delta): + for tile in loaded_tiles: + # Update each tile position by subtracting the delta to move them relative to the camera's movement. + tile.position -= delta * chunk_size + # Check if the tile has gone off the screen and should be unloaded. + if tile.position.x < -chunk_size or \ + tile.position.x > get_viewport().size.x + chunk_size or \ + tile.position.y < -chunk_size or \ + tile.position.y > get_viewport().size.y + chunk_size: + tile.queue_free() + loaded_tiles.erase(tile) +#func update_tiles_position(): +# for tile in loaded_tiles: +# tile.position += position_coord# * chunk_size +# if tile.position.x < -chunk_size or tile.position.x > get_viewport().size.x + chunk_size or tile.position.y < -chunk_size or tile.position.y > get_viewport().size.y + chunk_size: +# tile.queue_free() +# loaded_tiles.erase(tile) + +#We will call this function when the position_coords change +func on_position_coord_changed(delta): + update_tiles_position(delta) + update_chunks() + if positionLabel: + positionLabel.text = "Position: " + str(position_coord) +#func on_position_coord_changed(): +# update_tiles_position() +# update_chunks() +# if positionLabel: +# positionLabel.text = "Position: " + str(position_coord) + + + +# This function reads all the files in "res://Mods/Core/Tiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. +func load_tiles_material(): + var tilesDir = "res://Mods/Core/OvermapTiles/" + var dir = DirAccess.open(tilesDir) + if dir: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + var extension = file_name.get_extension() + + if !dir.current_is_dir(): + if extension == "png": + var texture := load("res://Mods/Core/OvermapTiles/" + file_name) # Load the .png file as a texture + tile_materials[file_name] = texture # Add the material to the dictionary + file_name = dir.get_next() + else: + print_debug("An error occurred when trying to access the path.") + dir.list_dir_end() + From d5836a2f051778e0ca731a8ee6de50a4f7868f8e Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 29 Nov 2023 20:46:26 +0100 Subject: [PATCH 017/138] Infinite panning now possible --- Scenes/Overmap/Scripts/Overmap.gd | 216 +++++++++++++++++------------- 1 file changed, 124 insertions(+), 92 deletions(-) diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index a2d44f15..4d10fb6e 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -10,11 +10,14 @@ var noise = FastNoiseLite.new() var chunk_height: int = 32 var chunk_width: int = 32 var chunk_size = 32 +var tile_size = 32 +var grid_pixel_size = chunk_size*tile_size var loaded_tiles: Array = [] var tile_materials = {} # Create an empty dictionary to store materials #We will connect the position_coord to this function in the _ready function func _ready(): + position_coord = positionLabel.position load_tiles_material() noise.seed = randi() noise.fractal_octaves = 4 @@ -22,7 +25,7 @@ func _ready(): noise.fractal_gain = 0.5 update_chunks() connect("position_coord_changed", on_position_coord_changed) - draw_all_chunks() +# draw_all_chunks() # The GDScript function `update_chunks()` updates the # chunks in a 2D game world. It loops through a 4x4 grid @@ -34,43 +37,69 @@ func _ready(): # and `position_coord` is the current position in the # game world. func update_chunks(): - for x in range(-2, 2): + # Convert the current camera or player position to grid coordinates based on the grid's pixel size (chunk size). + var grid_position = (position_coord / grid_pixel_size).floor() * grid_pixel_size + grid_position.x += grid_pixel_size+grid_pixel_size + grid_position.y += grid_pixel_size+grid_pixel_size + + for x in range(-2, 2): # Adjust the range based on how large you want the active area to be. for y in range(-2, 2): - var chunk_position = position_coord + Vector2(x, y) * chunk_size - if not chunks.has(chunk_position): - generate_chunk(chunk_position, chunk_size) + var chunk_grid_position = grid_position + Vector2(x, y) * grid_pixel_size + # Key used to store and look up the GridContainers within the chunks dictionary. + var key = chunk_grid_position +# var key = str(chunk_grid_position.x) + "," + str(chunk_grid_position.y) + + if not chunks.has(key): + generate_chunk(chunk_grid_position) + # Within context of where you handle chunk generation or updating: + var chunk_data = chunks[chunk_grid_position] # Retrieve the chunk data for the specific position. + # Use chunk data to create and fill the GridContainer. + var new_grid_container = create_and_fill_grid_container(chunk_data, Vector2(chunk_grid_position.x-position_coord.x,chunk_grid_position.y-position_coord.y)) + tilesContainer.add_child(new_grid_container) + # Store the GridContainer using the grid position as the key. + chunks[key] = new_grid_container + + # After generating new chunks, you may want to unload any that are off-screen. unload_chunks() - -# This GDScript function, `generate_chunk`, generates -# a chunk of tiles at a given position with a specified -# size. First, it initializes an empty list, `chunk`, -# to store the tiles. Then, it iterates over the range -# of the new size in both the x and y dimensions. For -# each tile, it determines the tile type based on a 2D -# noise function, which takes the x and y coordinates -# (adjusted by the position of the chunk) as input. This -# noise value is then normalized (to be within the range -# of 0 to 1) and scaled by the size of the `tiles` array, -# then converted to an integer to serve as an index for -# the `tiles` array. The corresponding tile is added -# to the `chunk` list. Finally, the function stores the -# generated chunk in the `chunks` dictionary, using the -# position of the chunk as the key. This function is -# typically used in procedural generation of game maps, -# where each "chunk" represents a portion of the game -# world. -func generate_chunk(position_loc: Vector2, newSize: int): +# +#func update_chunks(): +# var grid_position_coord = position_coord.snapped(Vector2(grid_pixel_size, grid_pixel_size)) +# var current_chunk_pos = grid_position_coord +# +# for x in range(-2, 2): +# for y in range(-2, 2): +# var chunk_position = current_chunk_pos# + Vector2(x*grid_pixel_size, y*grid_pixel_size) +# var world_chunk_position = chunk_position +## var world_chunk_position = chunk_position * chunk_size * tile_size +## var world_chunk_position = Vector2(grid_pixel_size*x, grid_pixel_size*y) +# var chunk_has_position: bool = chunks.has(world_chunk_position) +# if not chunk_has_position: +# generate_chunk(world_chunk_position) +# # Within context of where you handle chunk generation or updating: +# var chunk_data = chunks[chunk_position] # Retrieve the chunk data for the specific position. +# var grid_container = create_and_fill_grid_container(chunk_data, chunk_position) +# tilesContainer.add_child(grid_container) # Assuming tilesContainer is already added to the scene tree. +## draw_chunk(world_chunk_position, chunks[world_chunk_position]) +# unload_chunks() + +# +func generate_chunk(position_loc: Vector2): var chunk = [] - for x in range(newSize): - for y in range(newSize): + for x in range(chunk_size): + for y in range(chunk_size): var tile_type = noise.get_noise_2d(position_loc.x + x, position_loc.y + y) tile_type = int((tile_type + 1) / 2 * tiles.size()) chunk.append(tiles[tile_type]) chunks[position_loc] = chunk func unload_chunks(): + var dist = 0 + var range = 0 for chunk_position in chunks.keys(): - if chunk_position.distance_to(position_coord) > 2 * chunk_size: + dist = chunk_position.distance_to(position_coord) + range = 8 * grid_pixel_size + if dist > range: + chunks[chunk_position].queue_free() chunks.erase(chunk_position) var mouse_button_pressed: bool = false @@ -78,80 +107,63 @@ var mouse_button_pressed: bool = false #We will emit this signal when the position_coords change signal position_coord_changed(delta) -#We will change the position_coords in the _input function + func _input(event): if event is InputEventMouseButton: match event.button_index: MOUSE_BUTTON_MIDDLE: - if event.pressed: - mouse_button_pressed = true - else: - mouse_button_pressed = false - - if event is InputEventMouseMotion: - if mouse_button_pressed: - # Calculate the new position first. - var new_position_coord = position_coord - event.relative / 100 - # Now calculate delta based on the old and new positions. - var delta = new_position_coord - last_position_coord - # Update position_coord to the new position + mouse_button_pressed = event.is_pressed() + + if event is InputEventMouseMotion and mouse_button_pressed: + # Adjust the position based on the mouse movement, divided by 100 for sensitivity. + var motion = event.relative / 2 + + # Calculate the new position first. + var new_position_coord = position_coord - motion + + # Round the new_position_coord to the nearest integer. + new_position_coord = new_position_coord.round() + + # Calculate the delta based on the old and the rounded new positions. + var delta = new_position_coord - position_coord + + if delta != Vector2.ZERO: + # Update position_coord to the new rounded position. position_coord = new_position_coord - # Pass the delta when emitting the signal + + # Emit the signal to update other parts of the game that depend on the position. emit_signal("position_coord_changed", delta) + + # Call update_tiles_position to move the tiles on the screen. +# update_tiles_position(delta) + # Update last_position_coord for the next input event. last_position_coord = position_coord + + # Update the chunks based on the new position. update_chunks() -# var delta = position_coord - last_position_coord -# print_debug(delta) -# position_coord += event.relative / 100 -# emit_signal("position_coord_changed", delta) -# last_position_coord = position_coord -# update_chunks() -# position_coord.x += event.relative.x / 100 -# position_coord.y += event.relative.y / 100 -# emit_signal("position_coord_changed") -# update_chunks() - -#This function is never called but is used to draw tile onto the screen -#We need to find when to call this function, probably after chunks are updated -func draw_all_chunks(): - for chunk_position in chunks.keys(): - var chunk = chunks[chunk_position] - for i in range(chunk.size()): - var tile_position = chunk_position + Vector2(i % 32, i / 32) - var tile_type = chunk[i] - var texture = tile_materials[tile_type] -# var texture = load("res://Mods/Core/OvermapTiles/" + tile_type + ".png") - var tile = TextureRect.new() - tile.texture = texture - tile.position = tile_position * 32 - tilesContainer.add_child(tile) - loaded_tiles.append(tile) - if positionLabel: - positionLabel.text = "Position: " + str(position_coord) #This function will move all the tiles on screen when the position_coords change #This will make it look like the user pans across the map #When tiles move too far away the should be unloaded - func update_tiles_position(delta): - for tile in loaded_tiles: - # Update each tile position by subtracting the delta to move them relative to the camera's movement. - tile.position -= delta * chunk_size - # Check if the tile has gone off the screen and should be unloaded. - if tile.position.x < -chunk_size or \ - tile.position.x > get_viewport().size.x + chunk_size or \ - tile.position.y < -chunk_size or \ - tile.position.y > get_viewport().size.y + chunk_size: - tile.queue_free() - loaded_tiles.erase(tile) -#func update_tiles_position(): -# for tile in loaded_tiles: -# tile.position += position_coord# * chunk_size -# if tile.position.x < -chunk_size or tile.position.x > get_viewport().size.x + chunk_size or tile.position.y < -chunk_size or tile.position.y > get_viewport().size.y + chunk_size: -# tile.queue_free() -# loaded_tiles.erase(tile) + var dist = Vector2(3 * grid_pixel_size + position_coord.x, 3 * grid_pixel_size + position_coord.x) + for grid_container in tilesContainer.get_children(): + # Check if the node is indeed a GridContainer since the container might have other types of nodes. + if grid_container is GridContainer: + # Update the grid container's position by subtracting the delta to move it relative to the camera's movement. + grid_container.position -= delta + + # Remove GridContainer if it is too far from the viewport (off-screen) + # You need to define the bounds based on your game's design +# var grid_container_global_position = tilesContainer.rect_global_position + grid_container.rect_position +# var grid_container_global_position = grid_container.position +# +# # Change these values according to your viewport and map setup +# if grid_container_global_position.x < -dist.x or grid_container_global_position.x > get_viewport().size.x + dist.x or grid_container_global_position.y < -dist.y or grid_container_global_position.y > get_viewport().size.y + dist.y: +# grid_container.queue_free() # Use queue_free() to safely delete the node + #We will call this function when the position_coords change func on_position_coord_changed(delta): @@ -159,12 +171,31 @@ func on_position_coord_changed(delta): update_chunks() if positionLabel: positionLabel.text = "Position: " + str(position_coord) -#func on_position_coord_changed(): -# update_tiles_position() -# update_chunks() -# if positionLabel: -# positionLabel.text = "Position: " + str(position_coord) + + +func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): + # Create a new GridContainer node for this chunk. + var grid_container = GridContainer.new() + grid_container.columns = chunk_width # Set the number of columns to chunk_width. + grid_container.set("theme_override_constants/h_separation", 0) + grid_container.set("theme_override_constants/v_separation", 0) + + # Calculate the starting position for this chunk's set of tiles. + var chunk_pixel_position = chunk_position# * chunk_size * tile_size + + # Iterate over the chunk array to create and add TextureRects for each tile. + for i in range(chunk.size()): + var tile_type = chunk[i] + var texture = tile_materials[tile_type] # Retrieve the texture based on the tile type. + var tile = TextureRect.new() + tile.texture = texture + grid_container.add_child(tile) + # Set the position of the grid container in pixel space. + grid_container.position = chunk_pixel_position + + # Return the filled grid container. + return grid_container # This function reads all the files in "res://Mods/Core/Tiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. @@ -186,3 +217,4 @@ func load_tiles_material(): print_debug("An error occurred when trying to access the path.") dir.list_dir_end() + From 16d4ad9f148cc1a56d63a5c0e7ab687ef241bb48 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 30 Nov 2023 01:35:38 +0100 Subject: [PATCH 018/138] Now it's seamless --- Scenes/Overmap/Scripts/Overmap.gd | 74 +++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index 4d10fb6e..e4c211dc 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -17,12 +17,22 @@ var tile_materials = {} # Create an empty dictionary to store materials #We will connect the position_coord to this function in the _ready function func _ready(): - position_coord = positionLabel.position +# position_coord = positionLabel.position load_tiles_material() - noise.seed = randi() - noise.fractal_octaves = 4 - noise.domain_warp_amplitude = 20.0 +# noise.seed = randi() +# noise.fractal_octaves = 3 + + +# noise.seed = 2147483646 + noise.seed = randi() % 2147483646 +# noise.noise_type = FastNoiseLite.TYPE_SIMPLEX + noise.fractal_octaves = 5 noise.fractal_gain = 0.5 + noise.frequency = 0.04 +# noise.frequency = 0.02 +# noise.noise_type = noise.TYPE_CELLULAR +# noise.domain_warp_amplitude = 20.0 +# noise.fractal_gain = 0.5 update_chunks() connect("position_coord_changed", on_position_coord_changed) # draw_all_chunks() @@ -82,22 +92,59 @@ func update_chunks(): ## draw_chunk(world_chunk_position, chunks[world_chunk_position]) # unload_chunks() -# -func generate_chunk(position_loc: Vector2): + +func generate_chunk(grid_position: Vector2): var chunk = [] - for x in range(chunk_size): - for y in range(chunk_size): - var tile_type = noise.get_noise_2d(position_loc.x + x, position_loc.y + y) - tile_type = int((tile_type + 1) / 2 * tiles.size()) - chunk.append(tiles[tile_type]) - chunks[position_loc] = chunk + for y in range(chunk_size): # x goes from 0 to chunk_size - 1 + for x in range(chunk_size): # y goes from 0 to chunk_size - 1 + # We calculate global coordinates by offsetting the local coordinates by the grid_position (which is in 'chunk units') +# var global_x = chunk_size + x + 0 +# var global_y = chunk_size + y + 16 + var global_x = x + grid_position.x / tile_size + var global_y = y + grid_position.y / tile_size +# var global_x = grid_position.x / tile_size + x +# var global_y = grid_position.y / tile_size + y +# var global_x = grid_position.x * chunk_size + x +# var global_y = grid_position.y * chunk_size + y + var noise_value = noise.get_noise_2d(global_x, global_y) + if x == 0 and y == 0: + print_debug("Global_x = ("+str(global_x)+"), global_y = ("+str(global_y)+"), noise_value = ("+str(noise_value)+"), grid_position = ("+str(grid_position)+")") + if x == 31 and y == 31: + print_debug("Global_x = ("+str(global_x)+"), global_y = ("+str(global_y)+"), noise_value = ("+str(noise_value)+"), grid_position = ("+str(grid_position)+")") + # Scale noise_value to a valid index in the tiles array + # Ensure noise_value is scaled correctly based on the number of tiles. + var tile_index + if noise_value < -0.5: + tile_index = 0 + elif noise_value >-0.5 and noise_value <0: + tile_index = 1 + elif noise_value >0 and noise_value <0.5: + tile_index = 2 + elif noise_value >0.5: + tile_index = 3 +# var tile_index = int((noise_value + 1) / 2 * tiles.size()) % tiles.size() + chunk.append(tiles[tile_index]) + # Store the chunk using the grid_position as the key. + chunks[grid_position] = chunk +# +#func generate_chunk(position_loc: Vector2): +# var chunk = [] +# for x in range(position_loc.x, position_loc.x + chunk_size): +# for y in range(position_loc.y, position_loc.y + chunk_size): +# var tile_type = noise.get_noise_2d(x, y) +## var tile_type = noise.get_noise_2d(position_loc.x + x, position_loc.y + y) +# tile_type = int((tile_type + 1) / 2 * tiles.size()) +# chunk.append(tiles[tile_type]) +# chunks[position_loc] = chunk func unload_chunks(): var dist = 0 var range = 0 for chunk_position in chunks.keys(): dist = chunk_position.distance_to(position_coord) - range = 8 * grid_pixel_size + #Lowering this number 5 will cause newly created chunks + #to be instantly deleted and recreated + range = 5 * grid_pixel_size if dist > range: chunks[chunk_position].queue_free() chunks.erase(chunk_position) @@ -217,4 +264,3 @@ func load_tiles_material(): print_debug("An error occurred when trying to access the path.") dir.list_dir_end() - From 32e402a11bdd3a33b4dc3ce7808569d0e1efbf59 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 1 Dec 2023 00:46:58 +0100 Subject: [PATCH 019/138] Cleanup overmap script --- Scenes/Overmap/Scripts/Overmap.gd | 168 +++++++----------------------- 1 file changed, 38 insertions(+), 130 deletions(-) diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index e4c211dc..8c5355bf 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -5,156 +5,94 @@ extends Control var position_coord: Vector2 = Vector2(0, 0) var last_position_coord: Vector2 = Vector2() var tiles: Array = ["1.png", "arcstones1.png", "forestunderbrushscale5.png", "rockyfloor4.png"] -var chunks: Dictionary = {} +var chunks: Dictionary = {} #Stores references to tilegrids representing the map var noise = FastNoiseLite.new() -var chunk_height: int = 32 var chunk_width: int = 32 var chunk_size = 32 var tile_size = 32 var grid_pixel_size = chunk_size*tile_size -var loaded_tiles: Array = [] -var tile_materials = {} # Create an empty dictionary to store materials +var tile_materials = {} -#We will connect the position_coord to this function in the _ready function func _ready(): -# position_coord = positionLabel.position load_tiles_material() -# noise.seed = randi() -# noise.fractal_octaves = 3 - - -# noise.seed = 2147483646 - noise.seed = randi() % 2147483646 -# noise.noise_type = FastNoiseLite.TYPE_SIMPLEX + noise.seed = randi() noise.fractal_octaves = 5 noise.fractal_gain = 0.5 noise.frequency = 0.04 -# noise.frequency = 0.02 -# noise.noise_type = noise.TYPE_CELLULAR -# noise.domain_warp_amplitude = 20.0 -# noise.fractal_gain = 0.5 + noise.noise_type = FastNoiseLite.TYPE_SIMPLEX + update_chunks() connect("position_coord_changed", on_position_coord_changed) -# draw_all_chunks() -# The GDScript function `update_chunks()` updates the -# chunks in a 2D game world. It loops through a 4x4 grid -# centered on the current position, generating new chunks -# at each position if they don't already exist. After -# generating any necessary new chunks, it calls `unload_chunks()` +# This function updates the chunks. +# It loops through a 4x4 grid centered on the current position +# generating new chunks at each position if they don't already exist. +# After generating any necessary new chunks, it calls `unload_chunks()` # to unload any chunks that are no longer needed. The # `chunk_size` variable determines the size of each chunk, -# and `position_coord` is the current position in the -# game world. +# and `position_coord` is the current position in the world func update_chunks(): - # Convert the current camera or player position to grid coordinates based on the grid's pixel size (chunk size). + # Convert the current position to grid coordinates based on the grid's pixel size var grid_position = (position_coord / grid_pixel_size).floor() * grid_pixel_size + #The position is increase arbitrarily so it is more center of screen grid_position.x += grid_pixel_size+grid_pixel_size grid_position.y += grid_pixel_size+grid_pixel_size - for x in range(-2, 2): # Adjust the range based on how large you want the active area to be. + for x in range(-2, 2): for y in range(-2, 2): var chunk_grid_position = grid_position + Vector2(x, y) * grid_pixel_size - # Key used to store and look up the GridContainers within the chunks dictionary. - var key = chunk_grid_position -# var key = str(chunk_grid_position.x) + "," + str(chunk_grid_position.y) - if not chunks.has(key): + if not chunks.has(chunk_grid_position): generate_chunk(chunk_grid_position) - # Within context of where you handle chunk generation or updating: - var chunk_data = chunks[chunk_grid_position] # Retrieve the chunk data for the specific position. + # Retrieve the chunk data for the specific position. + var chunk_data = chunks[chunk_grid_position] # Use chunk data to create and fill the GridContainer. - var new_grid_container = create_and_fill_grid_container(chunk_data, Vector2(chunk_grid_position.x-position_coord.x,chunk_grid_position.y-position_coord.y)) + var localized_x: float = chunk_grid_position.x-position_coord.x + var localized_y: float = chunk_grid_position.y-position_coord.y + var new_grid_container = create_and_fill_grid_container(chunk_data,\ + Vector2(localized_x,localized_y)) tilesContainer.add_child(new_grid_container) # Store the GridContainer using the grid position as the key. - chunks[key] = new_grid_container + chunks[chunk_grid_position] = new_grid_container # After generating new chunks, you may want to unload any that are off-screen. unload_chunks() -# -#func update_chunks(): -# var grid_position_coord = position_coord.snapped(Vector2(grid_pixel_size, grid_pixel_size)) -# var current_chunk_pos = grid_position_coord -# -# for x in range(-2, 2): -# for y in range(-2, 2): -# var chunk_position = current_chunk_pos# + Vector2(x*grid_pixel_size, y*grid_pixel_size) -# var world_chunk_position = chunk_position -## var world_chunk_position = chunk_position * chunk_size * tile_size -## var world_chunk_position = Vector2(grid_pixel_size*x, grid_pixel_size*y) -# var chunk_has_position: bool = chunks.has(world_chunk_position) -# if not chunk_has_position: -# generate_chunk(world_chunk_position) -# # Within context of where you handle chunk generation or updating: -# var chunk_data = chunks[chunk_position] # Retrieve the chunk data for the specific position. -# var grid_container = create_and_fill_grid_container(chunk_data, chunk_position) -# tilesContainer.add_child(grid_container) # Assuming tilesContainer is already added to the scene tree. -## draw_chunk(world_chunk_position, chunks[world_chunk_position]) -# unload_chunks() func generate_chunk(grid_position: Vector2): var chunk = [] for y in range(chunk_size): # x goes from 0 to chunk_size - 1 for x in range(chunk_size): # y goes from 0 to chunk_size - 1 - # We calculate global coordinates by offsetting the local coordinates by the grid_position (which is in 'chunk units') -# var global_x = chunk_size + x + 0 -# var global_y = chunk_size + y + 16 + # We calculate global coordinates by + # offsetting the local coordinates by the grid_position var global_x = x + grid_position.x / tile_size var global_y = y + grid_position.y / tile_size -# var global_x = grid_position.x / tile_size + x -# var global_y = grid_position.y / tile_size + y -# var global_x = grid_position.x * chunk_size + x -# var global_y = grid_position.y * chunk_size + y var noise_value = noise.get_noise_2d(global_x, global_y) - if x == 0 and y == 0: - print_debug("Global_x = ("+str(global_x)+"), global_y = ("+str(global_y)+"), noise_value = ("+str(noise_value)+"), grid_position = ("+str(grid_position)+")") - if x == 31 and y == 31: - print_debug("Global_x = ("+str(global_x)+"), global_y = ("+str(global_y)+"), noise_value = ("+str(noise_value)+"), grid_position = ("+str(grid_position)+")") # Scale noise_value to a valid index in the tiles array # Ensure noise_value is scaled correctly based on the number of tiles. - var tile_index - if noise_value < -0.5: - tile_index = 0 - elif noise_value >-0.5 and noise_value <0: - tile_index = 1 - elif noise_value >0 and noise_value <0.5: - tile_index = 2 - elif noise_value >0.5: - tile_index = 3 -# var tile_index = int((noise_value + 1) / 2 * tiles.size()) % tiles.size() + var tile_index = int((noise_value + 1) / 2 * tiles.size()) % tiles.size() chunk.append(tiles[tile_index]) # Store the chunk using the grid_position as the key. chunks[grid_position] = chunk -# -#func generate_chunk(position_loc: Vector2): -# var chunk = [] -# for x in range(position_loc.x, position_loc.x + chunk_size): -# for y in range(position_loc.y, position_loc.y + chunk_size): -# var tile_type = noise.get_noise_2d(x, y) -## var tile_type = noise.get_noise_2d(position_loc.x + x, position_loc.y + y) -# tile_type = int((tile_type + 1) / 2 * tiles.size()) -# chunk.append(tiles[tile_type]) -# chunks[position_loc] = chunk +# The user will leave chunks behind as the map is panned around +# Chunks that are too far from the current position will be destoroyed func unload_chunks(): var dist = 0 - var range = 0 + var rangeLimit = 0 for chunk_position in chunks.keys(): dist = chunk_position.distance_to(position_coord) #Lowering this number 5 will cause newly created chunks #to be instantly deleted and recreated - range = 5 * grid_pixel_size - if dist > range: + rangeLimit = 5 * grid_pixel_size + if dist > rangeLimit: chunks[chunk_position].queue_free() chunks.erase(chunk_position) -var mouse_button_pressed: bool = false +var mouse_button_pressed: bool = false #We will emit this signal when the position_coords change signal position_coord_changed(delta) - - func _input(event): if event is InputEventMouseButton: match event.button_index: @@ -164,53 +102,27 @@ func _input(event): if event is InputEventMouseMotion and mouse_button_pressed: # Adjust the position based on the mouse movement, divided by 100 for sensitivity. var motion = event.relative / 2 - # Calculate the new position first. var new_position_coord = position_coord - motion - # Round the new_position_coord to the nearest integer. new_position_coord = new_position_coord.round() - # Calculate the delta based on the old and the rounded new positions. var delta = new_position_coord - position_coord - if delta != Vector2.ZERO: # Update position_coord to the new rounded position. position_coord = new_position_coord - # Emit the signal to update other parts of the game that depend on the position. emit_signal("position_coord_changed", delta) - - # Call update_tiles_position to move the tiles on the screen. -# update_tiles_position(delta) - # Update last_position_coord for the next input event. last_position_coord = position_coord - # Update the chunks based on the new position. - update_chunks() - -#This function will move all the tiles on screen when the position_coords change +#This function will move all the tilegrids on screen when the position_coords change #This will make it look like the user pans across the map -#When tiles move too far away the should be unloaded func update_tiles_position(delta): - var dist = Vector2(3 * grid_pixel_size + position_coord.x, 3 * grid_pixel_size + position_coord.x) for grid_container in tilesContainer.get_children(): - # Check if the node is indeed a GridContainer since the container might have other types of nodes. - if grid_container is GridContainer: - # Update the grid container's position by subtracting the delta to move it relative to the camera's movement. - grid_container.position -= delta - - # Remove GridContainer if it is too far from the viewport (off-screen) - # You need to define the bounds based on your game's design -# var grid_container_global_position = tilesContainer.rect_global_position + grid_container.rect_position -# var grid_container_global_position = grid_container.position -# -# # Change these values according to your viewport and map setup -# if grid_container_global_position.x < -dist.x or grid_container_global_position.x > get_viewport().size.x + dist.x or grid_container_global_position.y < -dist.y or grid_container_global_position.y > get_viewport().size.y + dist.y: -# grid_container.queue_free() # Use queue_free() to safely delete the node - + # Update the grid container's position by subtracting the delta + grid_container.position -= delta #We will call this function when the position_coords change func on_position_coord_changed(delta): @@ -221,15 +133,12 @@ func on_position_coord_changed(delta): func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): - # Create a new GridContainer node for this chunk. var grid_container = GridContainer.new() grid_container.columns = chunk_width # Set the number of columns to chunk_width. + #Make sure there is no space between the tiles grid_container.set("theme_override_constants/h_separation", 0) grid_container.set("theme_override_constants/v_separation", 0) - # Calculate the starting position for this chunk's set of tiles. - var chunk_pixel_position = chunk_position# * chunk_size * tile_size - # Iterate over the chunk array to create and add TextureRects for each tile. for i in range(chunk.size()): var tile_type = chunk[i] @@ -239,13 +148,13 @@ func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): grid_container.add_child(tile) # Set the position of the grid container in pixel space. - grid_container.position = chunk_pixel_position + grid_container.position = chunk_position # Return the filled grid container. return grid_container -# This function reads all the files in "res://Mods/Core/Tiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. +# This function reads all the files in "res://Mods/Core/OvermapTiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. func load_tiles_material(): var tilesDir = "res://Mods/Core/OvermapTiles/" var dir = DirAccess.open(tilesDir) @@ -254,13 +163,12 @@ func load_tiles_material(): var file_name = dir.get_next() while file_name != "": var extension = file_name.get_extension() - if !dir.current_is_dir(): if extension == "png": - var texture := load("res://Mods/Core/OvermapTiles/" + file_name) # Load the .png file as a texture + # Load the .png file as a texture + var texture := load("res://Mods/Core/OvermapTiles/" + file_name) tile_materials[file_name] = texture # Add the material to the dictionary file_name = dir.get_next() else: print_debug("An error occurred when trying to access the path.") dir.list_dir_end() - From 9c1cfa07a5419f44d14a2b4e451f97814db5ca87 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 3 Dec 2023 00:27:52 +0100 Subject: [PATCH 020/138] Refactor file names json function --- Scenes/ContentManager/Scripts/content_list.gd | 25 +++++++------------ Scenes/ContentManager/content_list.tscn | 4 ++- Scripts/Helper/json_helper.gd | 25 +++++++++++++++++++ 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index c2a481a7..5ea75566 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -10,6 +10,7 @@ extends Control @export var collapseButton: Button = null @export var pupup_ID: Popup = null @export var popup_textedit: TextEdit = null +@export var json_Helper_Class: GDScript = null signal item_activated(strSource: String, itemID: String) var is_collapsed: bool = false var popupAction: String = "" @@ -85,22 +86,14 @@ func load_file(): else: print_debug("Unable to load file: " + source) -func load_dir(): - var dir = DirAccess.open(source) - if dir: - dir.list_dir_begin() - var file_name = dir.get_next() - while file_name != "": - if !dir.current_is_dir() and file_name.get_extension() == "json": - # Add all the filenames to the ContentItems list as child nodes - var item_index: int = contentItems.add_item(file_name.replace(".json", "")) - #Add the ID as metadata which can be used to load the item data - contentItems.set_item_metadata(item_index, file_name.replace(".json", "")) - file_name = dir.get_next() - else: - print_debug("An error occurred when trying to access the path: " + source) - dir.list_dir_end() - +func load_dir() -> void: + var json_helper = json_Helper_Class.new() + var json_files: Array = json_helper.file_names_in_dir(source, ["json"]) + for file_name in json_files: + # Add all the filenames to the ContentItems list as child nodes + var item_index: int = contentItems.add_item(file_name.replace(".json", "")) + #Add the ID as metadata which can be used to load the item data + contentItems.set_item_metadata(item_index, file_name.replace(".json", "")) func _on_content_items_item_activated(index): var strItemID: String = contentItems.get_item_metadata(index) diff --git a/Scenes/ContentManager/content_list.tscn b/Scenes/ContentManager/content_list.tscn index d801867b..8e476978 100644 --- a/Scenes/ContentManager/content_list.tscn +++ b/Scenes/ContentManager/content_list.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=2 format=3 uid="uid://bhh0v7x4fjsgi"] +[gd_scene load_steps=3 format=3 uid="uid://bhh0v7x4fjsgi"] [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/content_list.gd" id="1_ly1kh"] +[ext_resource type="Script" path="res://Scripts/Helper/json_helper.gd" id="2_5gw28"] [node name="ContentList" type="Control" node_paths=PackedStringArray("contentItems", "collapseButton", "pupup_ID", "popup_textedit")] custom_minimum_size = Vector2(200, 30) @@ -17,6 +18,7 @@ contentItems = NodePath("Content/ContentItems") collapseButton = NodePath("Content/HBoxContainer/CollapseButton") pupup_ID = NodePath("ID_Input") popup_textedit = NodePath("ID_Input/VBoxContainer/TextEdit") +json_Helper_Class = ExtResource("2_5gw28") [node name="Content" type="VBoxContainer" parent="."] layout_mode = 1 diff --git a/Scripts/Helper/json_helper.gd b/Scripts/Helper/json_helper.gd index 34206472..da961d65 100644 --- a/Scripts/Helper/json_helper.gd +++ b/Scripts/Helper/json_helper.gd @@ -24,3 +24,28 @@ func load_json_array_file(source: String) -> Array: else: print_debug("Unable to load file: " + source) return data_json + + +# This function lists all the files in a specified directory. +# it takes two arguments: `dirName` (the path of the directory +# to list files from) and `extensionFilter` (an optional +# array of file extensions to filter by). +# If the `extensionFilter` is empty, all filenames will be returned. +# If not, it will only return filenames which file extentnion is in `extensionFilter` +func file_names_in_dir(dirName: String, extensionFilter: Array = []) -> Array: + var fileNames: Array = [] + var dir = DirAccess.open(dirName) + if dir: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + if !dir.current_is_dir(): + if extensionFilter.is_empty(): + fileNames.append(file_name) + elif file_name.get_extension() in extensionFilter: + fileNames.append(file_name) + file_name = dir.get_next() + else: + print_debug("An error occurred when trying to access the path: " + dirName) + dir.list_dir_end() + return fileNames From 8e2f9d1c7ebba39e138c313bbc65e9f103a3fc98 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 3 Dec 2023 01:02:24 +0100 Subject: [PATCH 021/138] Switch level from overmap --- Scenes/Overmap/Overmap.tscn | 6 +++- Scenes/Overmap/OvermapTile.tscn | 25 ++++++++++++++++ Scenes/Overmap/Scripts/Overmap.gd | 42 +++++++++++++++++++++++---- Scenes/Overmap/Scripts/OvermapTile.gd | 41 ++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 Scenes/Overmap/OvermapTile.tscn create mode 100644 Scenes/Overmap/Scripts/OvermapTile.gd diff --git a/Scenes/Overmap/Overmap.tscn b/Scenes/Overmap/Overmap.tscn index d9502c24..568ce016 100644 --- a/Scenes/Overmap/Overmap.tscn +++ b/Scenes/Overmap/Overmap.tscn @@ -1,6 +1,8 @@ -[gd_scene load_steps=2 format=3 uid="uid://bgswuol251m3u"] +[gd_scene load_steps=4 format=3 uid="uid://bgswuol251m3u"] [ext_resource type="Script" path="res://Scenes/Overmap/Scripts/Overmap.gd" id="1_fmft1"] +[ext_resource type="Script" path="res://Scripts/Helper/json_helper.gd" id="2_yuf0t"] +[ext_resource type="PackedScene" uid="uid://budsoodfdkaea" path="res://Scenes/Overmap/OvermapTile.tscn" id="3_uq0vr"] [node name="Overmap" type="Control" node_paths=PackedStringArray("positionLabel", "tilesContainer")] layout_mode = 3 @@ -12,6 +14,8 @@ grow_vertical = 2 script = ExtResource("1_fmft1") positionLabel = NodePath("Label") tilesContainer = NodePath("TilesContainer") +json_Helper_Class = ExtResource("2_yuf0t") +overmapTile = ExtResource("3_uq0vr") [node name="TilesContainer" type="Control" parent="."] layout_mode = 1 diff --git a/Scenes/Overmap/OvermapTile.tscn b/Scenes/Overmap/OvermapTile.tscn new file mode 100644 index 00000000..daa755f9 --- /dev/null +++ b/Scenes/Overmap/OvermapTile.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=2 format=3 uid="uid://budsoodfdkaea"] + +[ext_resource type="Script" path="res://Scenes/Overmap/Scripts/OvermapTile.gd" id="1_kxuyw"] + +[node name="OvermapTile" type="Control"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 3 +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_kxuyw") + +[node name="TextureRect" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[connection signal="gui_input" from="TextureRect" to="." method="_on_texture_rect_gui_input"] diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index 8c5355bf..16a5a231 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -2,6 +2,8 @@ extends Control @export var positionLabel: Label = null @export var tilesContainer: Control = null +@export var json_Helper_Class: GDScript = null +@export var overmapTile: PackedScene = null var position_coord: Vector2 = Vector2(0, 0) var last_position_coord: Vector2 = Vector2() var tiles: Array = ["1.png", "arcstones1.png", "forestunderbrushscale5.png", "rockyfloor4.png"] @@ -12,9 +14,12 @@ var chunk_size = 32 var tile_size = 32 var grid_pixel_size = chunk_size*tile_size var tile_materials = {} +var all_map_files: Array = [] func _ready(): load_tiles_material() + #Remember the list of map files + all_map_files = json_Helper_Class.new().file_names_in_dir("./Mods/Core/Maps/", ["json"]) noise.seed = randi() noise.fractal_octaves = 5 noise.fractal_gain = 0.5 @@ -51,7 +56,8 @@ func update_chunks(): var localized_y: float = chunk_grid_position.y-position_coord.y var new_grid_container = create_and_fill_grid_container(chunk_data,\ Vector2(localized_x,localized_y)) - tilesContainer.add_child(new_grid_container) + tilesContainer.call_deferred("add_child",new_grid_container) +# tilesContainer.add_child(new_grid_container) # Store the GridContainer using the grid position as the key. chunks[chunk_grid_position] = new_grid_container @@ -86,7 +92,7 @@ func unload_chunks(): #to be instantly deleted and recreated rangeLimit = 5 * grid_pixel_size if dist > rangeLimit: - chunks[chunk_position].queue_free() + chunks[chunk_position].call_deferred("queue_free") chunks.erase(chunk_position) @@ -143,9 +149,12 @@ func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): for i in range(chunk.size()): var tile_type = chunk[i] var texture = tile_materials[tile_type] # Retrieve the texture based on the tile type. - var tile = TextureRect.new() - tile.texture = texture - grid_container.add_child(tile) + var tile = overmapTile.instantiate() +# var tile = TextureRect.new() + assign_map_to_tile(tile) + tile.set_texture(texture) + tile.connect("tile_clicked", _on_tile_clicked) + grid_container.call_deferred("add_child",tile) # Set the position of the grid container in pixel space. grid_container.position = chunk_position @@ -172,3 +181,26 @@ func load_tiles_material(): else: print_debug("An error occurred when trying to access the path.") dir.list_dir_end() + + +#This function takes a TextureRect as an argument +#For a chance of 1 in 100, it will modulate the TextureRect to be slightly red +#And it will write a random item from the all_map_files array to it's metadata +#Then it will make sure that when a user clicks on this slightly red tile, +#It will print the item from it's metadata + +func assign_map_to_tile(tile: Control): + var chance = randi_range(0, 100) + if chance < 1: + tile.set_color(Color(1, 0.8, 0.8)) # Make the tile slightly red + var random_index = randi() % all_map_files.size() + var random_file = all_map_files[random_index] + tile.set_meta("map_file", random_file) # Set the metadata of the tile + +##This function will be connected to the signal of the random red tiles +func _on_tile_clicked(clicked_tile): + var mapFile: String = clicked_tile.get_meta("map_file") + if mapFile: + print(mapFile) + Helper.current_level_name = mapFile + get_tree().change_scene_to_file("res://level_generation.tscn") diff --git a/Scenes/Overmap/Scripts/OvermapTile.gd b/Scenes/Overmap/Scripts/OvermapTile.gd new file mode 100644 index 00000000..4eb1f9ea --- /dev/null +++ b/Scenes/Overmap/Scripts/OvermapTile.gd @@ -0,0 +1,41 @@ +extends Control + +const defaultTileData: Dictionary = {"texture": ""} +const defaultTexture: String = "./Scenes/ContentManager/Mapeditor/Images/emptyTile.png" +var tileData: Dictionary = defaultTileData.duplicate(): + set(data): + tileData = data + if tileData.texture != "": + $TextureRect.texture = load("./Mods/Core/OvermapTiles/" + tileData.texture) + else: + $TextureRect.texture = load(defaultTexture) +signal tile_clicked(clicked_tile: Control) + +func _on_texture_rect_gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton: + match event.button_index: + MOUSE_BUTTON_LEFT: + if event.pressed: + tile_clicked.emit(self) + +func set_texture(res: Resource) -> void: + $TextureRect.texture = res + var path: String = res.resource_path + tileData.texture = path.replace("./Mods/Core/OvermapTiles/","") + +func set_default() -> void: + tileData = defaultTileData.duplicate() + +func highlight() -> void: + $TextureRect.modulate = Color(0.227, 0.635, 0.757) + +func unhighlight() -> void: + $TextureRect.modulate = Color(1,1,1) + +func set_color(myColor: Color) -> void: + $TextureRect.modulate = myColor + +func set_clickable(clickable: bool): + if !clickable: + mouse_filter = MOUSE_FILTER_IGNORE + $TextureRect.mouse_filter = MOUSE_FILTER_IGNORE From 866b2c49376d4f7b06a2e58e535f7897f266d313 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 3 Dec 2023 01:23:02 +0100 Subject: [PATCH 022/138] Can switch levels in-game --- Scenes/Overmap/Scripts/Overmap.gd | 2 ++ Scripts/hud.gd | 6 ++++++ hud.tscn | 9 +++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index 16a5a231..ea103894 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -100,6 +100,8 @@ var mouse_button_pressed: bool = false #We will emit this signal when the position_coords change signal position_coord_changed(delta) func _input(event): + if !visible: + return if event is InputEventMouseButton: match event.button_index: MOUSE_BUTTON_MIDDLE: diff --git a/Scripts/hud.gd b/Scripts/hud.gd index b13951f7..5fcc416b 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -22,6 +22,7 @@ extends CanvasLayer @export var building_menu: NodePath @export var crafting_menu : NodePath +@export var overmap: Control var is_building_menu_open = false @@ -64,6 +65,11 @@ func _input(event): if event.is_action_pressed("crafting_menu"): get_node(crafting_menu).visible = !get_node(crafting_menu).visible + if event.is_action_pressed("overmap"): + if overmap.visible: + overmap.hide() + else: + overmap.show() # Called when the node enters the scene tree for the first time. diff --git a/hud.tscn b/hud.tscn index f18f969e..a75ea9e6 100644 --- a/hud.tscn +++ b/hud.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=22 format=3 uid="uid://clhj525tmme3k"] +[gd_scene load_steps=23 format=3 uid="uid://clhj525tmme3k"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="1_pxloi"] [ext_resource type="Script" path="res://Scripts/hud.gd" id="1_s3xoj"] @@ -18,6 +18,7 @@ [ext_resource type="Script" path="res://Scripts/CraftingMenu.gd" id="14_g3fif"] [ext_resource type="PackedScene" uid="uid://cpcn3qq8okj12" path="res://item_craft_button.tscn" id="15_otw1a"] [ext_resource type="ButtonGroup" uid="uid://bcjuavqvre6mk" path="res://crafting_recipes_button_group.tres" id="16_2oloe"] +[ext_resource type="PackedScene" uid="uid://bgswuol251m3u" path="res://Scenes/Overmap/Overmap.tscn" id="19_oomhy"] [sub_resource type="Theme" id="Theme_xn5t2"] default_font = ExtResource("1_pxloi") @@ -30,7 +31,7 @@ default_font_size = 13 [sub_resource type="StyleBoxLine" id="StyleBoxLine_xekk0"] color = Color(1, 1, 1, 1) -[node name="HUD" type="CanvasLayer"] +[node name="HUD" type="CanvasLayer" node_paths=PackedStringArray("overmap")] script = ExtResource("1_s3xoj") head_health = NodePath("Doll/Head") right_arm_health = NodePath("Doll/Rightarm") @@ -48,6 +49,7 @@ inventory_control = NodePath("CtrlInventoryGridEx") inventory = NodePath("InventoryGridStacked") building_menu = NodePath("BuildingMenu") crafting_menu = NodePath("CraftingMenu") +overmap = NodePath("Overmap") tooltip = NodePath("Tooltip") tooltip_item_name = NodePath("Tooltip/Panel/ItemName") tooltip_item_description = NodePath("Tooltip/Panel2/Description") @@ -417,6 +419,9 @@ text = "Required items " autowrap_mode = 3 +[node name="Overmap" parent="." instance=ExtResource("19_oomhy")] +visible = false + [connection signal="timeout" from="ProgressBar/ProgressBarTimer" to="." method="_on_progress_bar_timer_timeout"] [connection signal="mouse_entered" from="OutsideOfHUD" to="OutsideOfHUD" method="_on_mouse_entered"] [connection signal="mouse_exited" from="OutsideOfHUD" to="OutsideOfHUD" method="_on_mouse_exited"] From a6e0691a40213c6a2112c1785b060344b23ba7f2 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 3 Dec 2023 19:05:43 +0100 Subject: [PATCH 023/138] Add gui elements to overmap Add name and description labels to show info on a tile --- Scenes/Overmap/Overmap.tscn | 66 ++++++++++++++++++++++--------- Scenes/Overmap/Scripts/Overmap.gd | 36 +++++++++++------ 2 files changed, 73 insertions(+), 29 deletions(-) diff --git a/Scenes/Overmap/Overmap.tscn b/Scenes/Overmap/Overmap.tscn index 568ce016..49256ce1 100644 --- a/Scenes/Overmap/Overmap.tscn +++ b/Scenes/Overmap/Overmap.tscn @@ -4,42 +4,72 @@ [ext_resource type="Script" path="res://Scripts/Helper/json_helper.gd" id="2_yuf0t"] [ext_resource type="PackedScene" uid="uid://budsoodfdkaea" path="res://Scenes/Overmap/OvermapTile.tscn" id="3_uq0vr"] -[node name="Overmap" type="Control" node_paths=PackedStringArray("positionLabel", "tilesContainer")] +[node name="Overmap" type="Control" node_paths=PackedStringArray("positionLabel", "tilesContainer", "travelButton", "overmapTileLabel")] layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 +anchor_left = 0.2 +anchor_top = 0.2 +anchor_right = 0.8 +anchor_bottom = 0.8 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_fmft1") -positionLabel = NodePath("Label") -tilesContainer = NodePath("TilesContainer") +positionLabel = NodePath("MarginContainer/HBoxContainer/VBoxContainer/Label") +tilesContainer = NodePath("MarginContainer/HBoxContainer/TilesContainer") json_Helper_Class = ExtResource("2_yuf0t") overmapTile = ExtResource("3_uq0vr") +travelButton = NodePath("MarginContainer/HBoxContainer/VBoxContainer/TravelButton") +overmapTileLabel = NodePath("MarginContainer/HBoxContainer/VBoxContainer/OvermapTileLabel") -[node name="TilesContainer" type="Control" parent="."] +[node name="ColorRect" type="ColorRect" parent="."] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +color = Color(0.129412, 0.14902, 0.180392, 1) -[node name="Label" type="Label" parent="."] +[node name="MarginContainer" type="MarginContainer" parent="."] 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 = -11.5 -offset_right = 20.0 -offset_bottom = 11.5 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +theme_override_constants/margin_left = 16 +theme_override_constants/margin_top = 16 +theme_override_constants/margin_right = 16 +theme_override_constants/margin_bottom = 16 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +clip_contents = true +layout_mode = 2 + +[node name="TilesContainer" type="Control" parent="MarginContainer/HBoxContainer"] +clip_contents = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.8 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +layout_mode = 2 +size_flags_stretch_ratio = 0.2 + +[node name="OvermapTileLabel" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Name: Urbanroad +Environment: Forest +Challenge: Easy" + +[node name="Label" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 theme_override_colors/font_color = Color(0, 0.898039, 0.356863, 1) -theme_override_font_sizes/font_size = 26 text = "+" horizontal_alignment = 1 vertical_alignment = 1 + +[node name="TravelButton" type="Button" parent="MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Travel to location" + +[connection signal="button_up" from="MarginContainer/HBoxContainer/VBoxContainer/TravelButton" to="." method="_on_travel_button_button_up"] diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index ea103894..be2b4d0c 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -4,6 +4,8 @@ extends Control @export var tilesContainer: Control = null @export var json_Helper_Class: GDScript = null @export var overmapTile: PackedScene = null +@export var travelButton: Button = null +@export var overmapTileLabel: Label = null var position_coord: Vector2 = Vector2(0, 0) var last_position_coord: Vector2 = Vector2() var tiles: Array = ["1.png", "arcstones1.png", "forestunderbrushscale5.png", "rockyfloor4.png"] @@ -40,11 +42,11 @@ func update_chunks(): # Convert the current position to grid coordinates based on the grid's pixel size var grid_position = (position_coord / grid_pixel_size).floor() * grid_pixel_size #The position is increase arbitrarily so it is more center of screen - grid_position.x += grid_pixel_size+grid_pixel_size - grid_position.y += grid_pixel_size+grid_pixel_size + grid_position.x += grid_pixel_size + grid_position.y += grid_pixel_size - for x in range(-2, 2): - for y in range(-2, 2): + for x in range(-1, 1): + for y in range(-1, 1): var chunk_grid_position = grid_position + Vector2(x, y) * grid_pixel_size if not chunks.has(chunk_grid_position): @@ -90,7 +92,7 @@ func unload_chunks(): dist = chunk_position.distance_to(position_coord) #Lowering this number 5 will cause newly created chunks #to be instantly deleted and recreated - rangeLimit = 5 * grid_pixel_size + rangeLimit = 3 * grid_pixel_size if dist > rangeLimit: chunks[chunk_position].call_deferred("queue_free") chunks.erase(chunk_position) @@ -190,7 +192,6 @@ func load_tiles_material(): #And it will write a random item from the all_map_files array to it's metadata #Then it will make sure that when a user clicks on this slightly red tile, #It will print the item from it's metadata - func assign_map_to_tile(tile: Control): var chance = randi_range(0, 100) if chance < 1: @@ -199,10 +200,23 @@ func assign_map_to_tile(tile: Control): var random_file = all_map_files[random_index] tile.set_meta("map_file", random_file) # Set the metadata of the tile -##This function will be connected to the signal of the random red tiles +#This function will be connected to the signal of the tiles func _on_tile_clicked(clicked_tile): - var mapFile: String = clicked_tile.get_meta("map_file") - if mapFile: - print(mapFile) + if clicked_tile.has_meta("map_file"): + var mapFile = clicked_tile.get_meta("map_file") + var textureString: String = clicked_tile.tileData.texture + var nameString: String = "Name: " + mapFile + var envString: String = clicked_tile.tileData.texture + envString = envString.replace("res://Mods/Core/OvermapTiles/","") + envString = "\nEnvironment: " + envString + var challengeString: String = "\nChallenge: Easy" + overmapTileLabel.text = nameString + envString + challengeString Helper.current_level_name = mapFile - get_tree().change_scene_to_file("res://level_generation.tscn") + travelButton.disabled = false + else: + travelButton.disabled = true + overmapTileLabel.text = "Select a valid target" + + +func _on_travel_button_button_up(): + get_tree().change_scene_to_file("res://level_generation.tscn") From c513d77aaf2d203ebe31b74603a1ffa22934769c Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 3 Dec 2023 22:43:18 +0100 Subject: [PATCH 024/138] Create gamedata singleton --- LevelGenerator.gd | 32 ++++---------------------------- Scripts/gamedata.gd | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 28 deletions(-) create mode 100644 Scripts/gamedata.gd diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 73a5b927..9ccd233c 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -16,14 +16,12 @@ var level_height : int = 32 @export var level_manager : Node3D @export var block_scenes : Array[PackedScene] @export_file var default_level_json -var tile_materials = {} # Create an empty dictionary to store materials # Called when the node enters the scene tree for the first time. func _ready(): level_name = Helper.current_level_name - load_tiles_material() generate_level() $"../NavigationRegion3D".bake_navigation_mesh() @@ -69,8 +67,8 @@ func generate_level(): # block = create_block_with_material(textureName) var block: StaticBody3D = defaultBlock.instantiate() - if textureName in tile_materials: - var material = tile_materials[textureName] + if textureName in Gamedata.tile_materials: + var material = Gamedata.tile_materials[textureName] block.update_texture(material) # block = block_scenes[layer["data"][current_block]-1].instantiate() level_node.add_child(block) @@ -104,30 +102,8 @@ func get_custom_level_json(level_path): #This function takes a filename and create a new instance of block_scenes[0] which is a StaticBody3D. It will then take the material from the material dictionary based on the provided filename and apply it to the instance of StaticBody3D. Lastly it will return the StaticBody3D. func create_block_with_material(filename: String) -> StaticBody3D: var block: StaticBody3D = defaultBlock.instantiate() - if filename in tile_materials: - var material = tile_materials[filename] + if filename in Gamedata.tile_materials: + var material = Gamedata.tile_materials[filename] block.update_texture(material) return block - -# This function reads all the files in "res://Mods/Core/Tiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. -func load_tiles_material(): - var tilesDir = "res://Mods/Core/Tiles/" - var dir = DirAccess.open(tilesDir) - if dir: - dir.list_dir_begin() - var file_name = dir.get_next() - while file_name != "": - var extension = file_name.get_extension() - - if !dir.current_is_dir(): - if extension == "png": - var texture := load("res://Mods/Core/Tiles/" + file_name) # Load the .png file as a texture - var material := StandardMaterial3D.new() - material.albedo_texture = texture # Set the texture of the material - material.uv1_scale = Vector3(3,2,1) - tile_materials[file_name] = material # Add the material to the dictionary - file_name = dir.get_next() - else: - print_debug("An error occurred when trying to access the path.") - dir.list_dir_end() diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd new file mode 100644 index 00000000..fc24fe2a --- /dev/null +++ b/Scripts/gamedata.gd @@ -0,0 +1,36 @@ +extends Node + +var tile_materials = {} # Create an empty dictionary to store materials + +# Called when the node enters the scene tree for the first time. +func _ready(): + load_tiles_material() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass + + + +# This function reads all the files in "res://Mods/Core/Tiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. +func load_tiles_material(): + var tilesDir = "res://Mods/Core/Tiles/" + var dir = DirAccess.open(tilesDir) + if dir: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + var extension = file_name.get_extension() + + if !dir.current_is_dir(): + if extension == "png": + var texture := load("res://Mods/Core/Tiles/" + file_name) # Load the .png file as a texture + var material := StandardMaterial3D.new() + material.albedo_texture = texture # Set the texture of the material + material.uv1_scale = Vector3(3,2,1) + tile_materials[file_name] = material # Add the material to the dictionary + file_name = dir.get_next() + else: + print_debug("An error occurred when trying to access the path.") + dir.list_dir_end() From 2b11e383da1496ff0115c81bb768e79dead2e3b6 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 3 Dec 2023 23:09:53 +0100 Subject: [PATCH 025/138] Refactor some json loading --- .../Mapeditor/Scripts/TilebrushList.gd | 5 +-- .../ContentManager/Mapeditor/mapeditor.tscn | 4 +- Scenes/ContentManager/Scripts/content_list.gd | 4 +- Scenes/Overmap/Overmap.tscn | 4 +- Scenes/Overmap/Scripts/Overmap.gd | 27 ++--------- Scripts/Helper.gd | 10 ++--- Scripts/Helper/json_helper.gd | 8 +--- Scripts/gamedata.gd | 45 +++++++++---------- 8 files changed, 33 insertions(+), 74 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd index d9de9112..25c96218 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd @@ -3,10 +3,8 @@ extends VBoxContainer #@onready var tileBrush: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/tilebrush.tscn") #@onready var scrolling_Flow_Container: PackedScene = preload("res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn") @export var scrolling_Flow_Container: PackedScene = null -@export var json_Helper_Class: GDScript = null @export var tileBrush: PackedScene = null -var json_helper = null var instanced_brushes: Array[Node] = [] signal tile_brush_selection_change(tilebrush: Control) @@ -16,13 +14,12 @@ var selected_brush: Control: tile_brush_selection_change.emit(selected_brush) func _ready(): - json_helper = json_Helper_Class.new() loadTiles() # this function will read all files in "res://Mods/Core/Tiles/" and for each file it will create a texturerect and assign the file as the texture of the texturerect. Then it will add the texturerect as a child to $HSplitContainer/EntitiesContainer/TilesList func loadTiles(): var tilesFile = "res://Mods/Core/Tiles/Tiles.json" - var tileList: Array = json_helper.load_json_array_file(tilesFile) + var tileList: Array = Helper.json_helper.load_json_array_file(tilesFile) for item in tileList: diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 3be361c7..871e3eeb 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -1,11 +1,10 @@ -[gd_scene load_steps=11 format=3 uid="uid://d3001f5xxpup1"] +[gd_scene load_steps=10 format=3 uid="uid://d3001f5xxpup1"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd" id="1_0c7s4"] [ext_resource type="PackedScene" uid="uid://bswccbbg6ijep" path="res://Scenes/ContentManager/Mapeditor/Toolbar/mapeditorzoomscroller.tscn" id="1_0ytmu"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd" id="2_sf17m"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/Levelscroller.gd" id="3_i1qbw"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd" id="5_he816"] -[ext_resource type="Script" path="res://Scripts/Helper/json_helper.gd" id="6_ecso8"] [ext_resource type="PackedScene" uid="uid://be62h2ytgw2kb" path="res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn" id="6_onaby"] [ext_resource type="PackedScene" uid="uid://cccnrdolr1bfo" path="res://Scenes/ContentManager/Mapeditor/tilebrush.tscn" id="8_o4x7s"] @@ -201,7 +200,6 @@ size_flags_horizontal = 3 size_flags_stretch_ratio = 0.2 script = ExtResource("5_he816") scrolling_Flow_Container = ExtResource("6_onaby") -json_Helper_Class = ExtResource("6_ecso8") tileBrush = ExtResource("8_o4x7s") [connection signal="ready" from="." to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_mapeditor_ready"] diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 5ea75566..21bebd3a 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -10,7 +10,6 @@ extends Control @export var collapseButton: Button = null @export var pupup_ID: Popup = null @export var popup_textedit: TextEdit = null -@export var json_Helper_Class: GDScript = null signal item_activated(strSource: String, itemID: String) var is_collapsed: bool = false var popupAction: String = "" @@ -87,8 +86,7 @@ func load_file(): print_debug("Unable to load file: " + source) func load_dir() -> void: - var json_helper = json_Helper_Class.new() - var json_files: Array = json_helper.file_names_in_dir(source, ["json"]) + var json_files: Array = Helper.json_helper.file_names_in_dir(source, ["json"]) for file_name in json_files: # Add all the filenames to the ContentItems list as child nodes var item_index: int = contentItems.add_item(file_name.replace(".json", "")) diff --git a/Scenes/Overmap/Overmap.tscn b/Scenes/Overmap/Overmap.tscn index 49256ce1..5c8f4fd1 100644 --- a/Scenes/Overmap/Overmap.tscn +++ b/Scenes/Overmap/Overmap.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=4 format=3 uid="uid://bgswuol251m3u"] +[gd_scene load_steps=3 format=3 uid="uid://bgswuol251m3u"] [ext_resource type="Script" path="res://Scenes/Overmap/Scripts/Overmap.gd" id="1_fmft1"] -[ext_resource type="Script" path="res://Scripts/Helper/json_helper.gd" id="2_yuf0t"] [ext_resource type="PackedScene" uid="uid://budsoodfdkaea" path="res://Scenes/Overmap/OvermapTile.tscn" id="3_uq0vr"] [node name="Overmap" type="Control" node_paths=PackedStringArray("positionLabel", "tilesContainer", "travelButton", "overmapTileLabel")] @@ -15,7 +14,6 @@ grow_vertical = 2 script = ExtResource("1_fmft1") positionLabel = NodePath("MarginContainer/HBoxContainer/VBoxContainer/Label") tilesContainer = NodePath("MarginContainer/HBoxContainer/TilesContainer") -json_Helper_Class = ExtResource("2_yuf0t") overmapTile = ExtResource("3_uq0vr") travelButton = NodePath("MarginContainer/HBoxContainer/VBoxContainer/TravelButton") overmapTileLabel = NodePath("MarginContainer/HBoxContainer/VBoxContainer/OvermapTileLabel") diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index be2b4d0c..f9b08dcf 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -2,7 +2,6 @@ extends Control @export var positionLabel: Label = null @export var tilesContainer: Control = null -@export var json_Helper_Class: GDScript = null @export var overmapTile: PackedScene = null @export var travelButton: Button = null @export var overmapTileLabel: Label = null @@ -15,13 +14,11 @@ var chunk_width: int = 32 var chunk_size = 32 var tile_size = 32 var grid_pixel_size = chunk_size*tile_size -var tile_materials = {} var all_map_files: Array = [] func _ready(): - load_tiles_material() #Remember the list of map files - all_map_files = json_Helper_Class.new().file_names_in_dir("./Mods/Core/Maps/", ["json"]) + all_map_files = Helper.json_helper.file_names_in_dir("./Mods/Core/Maps/", ["json"]) noise.seed = randi() noise.fractal_octaves = 5 noise.fractal_gain = 0.5 @@ -152,7 +149,8 @@ func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): # Iterate over the chunk array to create and add TextureRects for each tile. for i in range(chunk.size()): var tile_type = chunk[i] - var texture = tile_materials[tile_type] # Retrieve the texture based on the tile type. + # Retrieve the texture based on the tile type. + var texture = Gamedata.overmaptile_materials[tile_type] var tile = overmapTile.instantiate() # var tile = TextureRect.new() assign_map_to_tile(tile) @@ -167,24 +165,6 @@ func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): return grid_container -# This function reads all the files in "res://Mods/Core/OvermapTiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. -func load_tiles_material(): - var tilesDir = "res://Mods/Core/OvermapTiles/" - var dir = DirAccess.open(tilesDir) - if dir: - dir.list_dir_begin() - var file_name = dir.get_next() - while file_name != "": - var extension = file_name.get_extension() - if !dir.current_is_dir(): - if extension == "png": - # Load the .png file as a texture - var texture := load("res://Mods/Core/OvermapTiles/" + file_name) - tile_materials[file_name] = texture # Add the material to the dictionary - file_name = dir.get_next() - else: - print_debug("An error occurred when trying to access the path.") - dir.list_dir_end() #This function takes a TextureRect as an argument @@ -204,7 +184,6 @@ func assign_map_to_tile(tile: Control): func _on_tile_clicked(clicked_tile): if clicked_tile.has_meta("map_file"): var mapFile = clicked_tile.get_meta("map_file") - var textureString: String = clicked_tile.tileData.texture var nameString: String = "Name: " + mapFile var envString: String = clicked_tile.tileData.texture envString = envString.replace("res://Mods/Core/OvermapTiles/","") diff --git a/Scripts/Helper.gd b/Scripts/Helper.gd index 4ab0f310..90c49acf 100644 --- a/Scripts/Helper.gd +++ b/Scripts/Helper.gd @@ -1,17 +1,13 @@ extends Node3D var current_level_name : String - +const json_Helper_Class = preload("res://Scripts/Helper/json_helper.gd") +var json_helper: Node = null # Called when the node enters the scene tree for the first time. func _ready(): - pass # Replace with function body. - + json_helper = json_Helper_Class.new() -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass - func switch_level(level_name): current_level_name = level_name get_tree().change_scene_to_file("res://level_generation.tscn") diff --git a/Scripts/Helper/json_helper.gd b/Scripts/Helper/json_helper.gd index da961d65..95a750b6 100644 --- a/Scripts/Helper/json_helper.gd +++ b/Scripts/Helper/json_helper.gd @@ -1,12 +1,8 @@ extends Node #This script is a generic helper script to load and manipulate JSOn files. -#In another script, you can load an instance of this script using: -#const json_Helper_Class = preload("res://Scripts/Helper/json_helper.gd") -#var json_helper: Resource = null - -#func _ready() -> void: -# json_helper := json_Helper_Class.new() +#In Helper.gd, this script is loaded on game start +#It can be accessed trough Helper.json_helper #This function takes the path to a json file and returns its contents as an array diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index fc24fe2a..cfe386ff 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -1,36 +1,33 @@ extends Node var tile_materials = {} # Create an empty dictionary to store materials +var overmaptile_materials = {} # Create an empty dictionary to store materials # Called when the node enters the scene tree for the first time. func _ready(): load_tiles_material() - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass + load_overmaptiles_material() # This function reads all the files in "res://Mods/Core/Tiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. func load_tiles_material(): - var tilesDir = "res://Mods/Core/Tiles/" - var dir = DirAccess.open(tilesDir) - if dir: - dir.list_dir_begin() - var file_name = dir.get_next() - while file_name != "": - var extension = file_name.get_extension() - - if !dir.current_is_dir(): - if extension == "png": - var texture := load("res://Mods/Core/Tiles/" + file_name) # Load the .png file as a texture - var material := StandardMaterial3D.new() - material.albedo_texture = texture # Set the texture of the material - material.uv1_scale = Vector3(3,2,1) - tile_materials[file_name] = material # Add the material to the dictionary - file_name = dir.get_next() - else: - print_debug("An error occurred when trying to access the path.") - dir.list_dir_end() + var tilesDir = "./Mods/Core/Tiles/" + var png_files: Array = Helper.json_helper.file_names_in_dir(tilesDir, ["png"]) + for png_file in png_files: + var texture := load(tilesDir + png_file) # Load the .png file as a texture + var material := StandardMaterial3D.new() + material.albedo_texture = texture # Set the texture of the material + material.uv1_scale = Vector3(3,2,1) + tile_materials[png_file] = material # Add the material to the dictionary + + +# This function reads all the files in "res://Mods/Core/OvermapTiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. +func load_overmaptiles_material(): + var tilesDir = "./Mods/Core/OvermapTiles/" + var png_files: Array = Helper.json_helper.file_names_in_dir(tilesDir, ["png"]) + for png_file in png_files: + # Load the .png file as a texture + var texture := load(tilesDir + png_file) + # Add the material to the dictionary + overmaptile_materials[png_file] = texture From adf11f52659a54aec346a2a284c4a9388bc0a6fc Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 5 Dec 2023 08:53:51 +0100 Subject: [PATCH 026/138] overmap is consistent Overmap chunks will stay consistent even after changing scenes. --- Blocks/grass_001.gd | 3 + LevelGenerator.gd | 68 +++++++++++++++--- Scenes/Overmap/Scripts/Overmap.gd | 100 ++++++++++++++++---------- Scripts/Enemy.gd | 11 +-- Scripts/Helper.gd | 14 +++- Scripts/Helper/json_helper.gd | 26 +++++++ Scripts/Helper/save_helper.gd | 113 ++++++++++++++++++++++++++++++ Scripts/gamedata.gd | 9 ++- level_generation.tscn | 4 ++ project.godot | 7 ++ 10 files changed, 300 insertions(+), 55 deletions(-) create mode 100644 Scripts/Helper/save_helper.gd diff --git a/Blocks/grass_001.gd b/Blocks/grass_001.gd index eeed8586..c840bfd3 100644 --- a/Blocks/grass_001.gd +++ b/Blocks/grass_001.gd @@ -4,3 +4,6 @@ extends StaticBody3D func update_texture(material: BaseMaterial3D) -> void: $MeshInstance3D.mesh = BoxMesh.new() $MeshInstance3D.mesh.surface_set_material(0, material) + +func get_texture_string() -> String: + return $MeshInstance3D.mesh.material.albedo_texture.resource_path diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 9ccd233c..477ae640 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -1,18 +1,20 @@ extends Node3D -var level_name var level_json_as_text var level_levels : Array +var map_save_folder: String var level_width : int = 32 var level_height : int = 32 @onready var defaultBlock: PackedScene = preload("res://Blocks/grass_001.tscn") +@export var defaultEnemy: PackedScene +@export var defaultItem: PackedScene @export var level_manager : Node3D @export var block_scenes : Array[PackedScene] @export_file var default_level_json @@ -21,17 +23,61 @@ var level_height : int = 32 # Called when the node enters the scene tree for the first time. func _ready(): - level_name = Helper.current_level_name - generate_level() + generate_map() $"../NavigationRegion3D".bake_navigation_mesh() -func generate_level(): +func generate_map(): + map_save_folder = get_saved_map_folder() + generate_level() + generate_enemies() + generate_items() +func get_saved_map_folder() -> String: + var level_name: String = Helper.current_level_name + var level_pos: Vector2 = Helper.current_level_pos + var current_save_folder: String = Helper.save_helper.current_save_folder + var dir = DirAccess.open(current_save_folder) + var map_folder = "map_x" + str(level_pos.x) + "_y" + str(level_pos.y) + var target_folder = current_save_folder+ "/" + map_folder + if dir.dir_exists(map_folder): + return map_folder + return "" + +func generate_enemies() -> void: + if map_save_folder == "": + return + var enemiesArray = Helper.json_helper.load_json_array_file(map_save_folder + "/enemies.json") + for enemy in enemiesArray: + var newEnemy: CharacterBody3D = defaultEnemy.instantiate() + newEnemy.global_position.x = enemy.global_position_x + newEnemy.global_position.y = enemy.global_position_y + newEnemy.global_position.z = enemy.global_position_z + newEnemy.add_to_group("Enemies") + get_tree().get_root().add_child(newEnemy) + + +func generate_items() -> void: + if map_save_folder == "": + return + var itemsArray = Helper.json_helper.load_json_array_file(map_save_folder + "/items.json") + for item in itemsArray: + var newItem: CharacterBody3D = defaultItem.instantiate() + newItem.global_position.x = item.global_position_x + newItem.global_position.y = item.global_position_y + newItem.global_position.z = item.global_position_z + newItem.add_to_group("mapitems") + get_tree().get_root().add_child(newItem) + +func generate_level() -> void: + var level_name: String = Helper.current_level_name var textureName: String = "" if level_name == "": get_level_json() else: - get_custom_level_json("./Mods/Core/Maps/" + level_name) + if map_save_folder == "": + get_custom_level_json("./Mods/Core/Maps/" + level_name) + else: + get_custom_level_json(map_save_folder + "/map.json") var level_number = 0 @@ -39,6 +85,7 @@ func generate_level(): for level in level_levels: if level != []: var level_node = Node3D.new() + level_node.add_to_group("maplevels") level_manager.add_child(level_node) level_node.global_position.y = level_number-10 @@ -64,12 +111,12 @@ func generate_level(): if textureName != "": # var block : StaticBody3D ## block = block_scenes[0].instantiate() -# block = create_block_with_material(textureName) + var block = create_block_with_material(textureName) - var block: StaticBody3D = defaultBlock.instantiate() - if textureName in Gamedata.tile_materials: - var material = Gamedata.tile_materials[textureName] - block.update_texture(material) + #var block: StaticBody3D = defaultBlock.instantiate() + #if textureName in Gamedata.tile_materials: + #var material = Gamedata.tile_materials[textureName] + #block.update_texture(material) # block = block_scenes[layer["data"][current_block]-1].instantiate() level_node.add_child(block) @@ -79,7 +126,6 @@ func generate_level(): current_block += 1 level_number += 1 - diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index f9b08dcf..d4a94e22 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -8,18 +8,18 @@ extends Control var position_coord: Vector2 = Vector2(0, 0) var last_position_coord: Vector2 = Vector2() var tiles: Array = ["1.png", "arcstones1.png", "forestunderbrushscale5.png", "rockyfloor4.png"] -var chunks: Dictionary = {} #Stores references to tilegrids representing the map var noise = FastNoiseLite.new() +var grid_chunks: Dictionary = {} # Stores references to grid containers (visual tilegrids) var chunk_width: int = 32 var chunk_size = 32 var tile_size = 32 var grid_pixel_size = chunk_size*tile_size -var all_map_files: Array = [] +var selected_overmap_tile: Control = null func _ready(): - #Remember the list of map files - all_map_files = Helper.json_helper.file_names_in_dir("./Mods/Core/Maps/", ["json"]) - noise.seed = randi() + var gameFileJson: Dictionary = Helper.json_helper.load_json_dictionary_file(\ + Helper.save_helper.current_save_folder + "/game.json") + noise.seed = gameFileJson.mapseed noise.fractal_octaves = 5 noise.fractal_gain = 0.5 noise.frequency = 0.04 @@ -45,20 +45,22 @@ func update_chunks(): for x in range(-1, 1): for y in range(-1, 1): var chunk_grid_position = grid_position + Vector2(x, y) * grid_pixel_size - - if not chunks.has(chunk_grid_position): + # Use the separate noise_chunks Dictionary for retrieving the noise data + if not Helper.chunks.has(chunk_grid_position): generate_chunk(chunk_grid_position) - # Retrieve the chunk data for the specific position. - var chunk_data = chunks[chunk_grid_position] + # Retrieve the chunk data for the specific position. + var chunk_data = Helper.chunks[chunk_grid_position] + + if not grid_chunks.has(chunk_grid_position): # Use chunk data to create and fill the GridContainer. var localized_x: float = chunk_grid_position.x-position_coord.x var localized_y: float = chunk_grid_position.y-position_coord.y var new_grid_container = create_and_fill_grid_container(chunk_data,\ Vector2(localized_x,localized_y)) tilesContainer.call_deferred("add_child",new_grid_container) -# tilesContainer.add_child(new_grid_container) + # tilesContainer.add_child(new_grid_container) # Store the GridContainer using the grid position as the key. - chunks[chunk_grid_position] = new_grid_container + grid_chunks[chunk_grid_position] = new_grid_container # After generating new chunks, you may want to unload any that are off-screen. unload_chunks() @@ -76,23 +78,37 @@ func generate_chunk(grid_position: Vector2): # Scale noise_value to a valid index in the tiles array # Ensure noise_value is scaled correctly based on the number of tiles. var tile_index = int((noise_value + 1) / 2 * tiles.size()) % tiles.size() - chunk.append(tiles[tile_index]) + chunk.append({"tile": tiles[tile_index], "tacticalmap":\ + get_random_mapname_1_in_100()}) # Store the chunk using the grid_position as the key. - chunks[grid_position] = chunk + Helper.chunks[grid_position] = chunk + +func get_random_mapname_1_in_100() -> String: + var random_file: String = "" + var chance = randi_range(0, 100) + if chance < 1: + var random_index = randi() % Gamedata.all_map_files.size() + random_file = Gamedata.all_map_files[random_index] + return random_file + + # The user will leave chunks behind as the map is panned around # Chunks that are too far from the current position will be destoroyed +#This will only destroy the visual representation of the data stored in Helper.chunks func unload_chunks(): var dist = 0 var rangeLimit = 0 - for chunk_position in chunks.keys(): + for chunk_position in grid_chunks.keys(): dist = chunk_position.distance_to(position_coord) #Lowering this number 5 will cause newly created chunks #to be instantly deleted and recreated rangeLimit = 3 * grid_pixel_size if dist > rangeLimit: - chunks[chunk_position].call_deferred("queue_free") - chunks.erase(chunk_position) + #Distroy the grid itself + grid_chunks[chunk_position].call_deferred("queue_free") + #Remove the reference to the grid + grid_chunks.erase(chunk_position) var mouse_button_pressed: bool = false @@ -142,21 +158,41 @@ func on_position_coord_changed(delta): func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): var grid_container = GridContainer.new() grid_container.columns = chunk_width # Set the number of columns to chunk_width. - #Make sure there is no space between the tiles + # Make sure there is no space between the tiles grid_container.set("theme_override_constants/h_separation", 0) grid_container.set("theme_override_constants/v_separation", 0) + # Variables to keep track of the row and column position + var row: int = 0 + var column: int = 0 + # Iterate over the chunk array to create and add TextureRects for each tile. for i in range(chunk.size()): - var tile_type = chunk[i] + if i > 0 and i % chunk_width == 0: + row += 1 + column = 0 # Reset column at the start of a new row + + var tile_type = chunk[i].tile # Retrieve the texture based on the tile type. - var texture = Gamedata.overmaptile_materials[tile_type] + var texture = Gamedata.overmaptile_materials[tile_type] var tile = overmapTile.instantiate() -# var tile = TextureRect.new() - assign_map_to_tile(tile) + var local_x = column*tile_size + var local_y = row*tile_size + var global_x = chunk_position.x + local_x + var global_y = chunk_position.y + local_y + # Assign the tile's row and column information + tile.set_meta("global_pos", Vector2(global_x,global_y)) + tile.set_meta("local_pos", Vector2(local_x,local_y)) + if chunk[i].tacticalmap != "": + tile.set_meta("map_file", chunk[i].tacticalmap) # Set the metadata of the tile + tile.set_color(Color(1, 0.8, 0.8)) # Make the tile slightly red tile.set_texture(texture) tile.connect("tile_clicked", _on_tile_clicked) - grid_container.call_deferred("add_child",tile) + # Add the tile as a child to the grid container + grid_container.add_child(tile) + + # Increase column count after placing each tile + column += 1 # Set the position of the grid container in pixel space. grid_container.position = chunk_position @@ -167,22 +203,10 @@ func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): -#This function takes a TextureRect as an argument -#For a chance of 1 in 100, it will modulate the TextureRect to be slightly red -#And it will write a random item from the all_map_files array to it's metadata -#Then it will make sure that when a user clicks on this slightly red tile, -#It will print the item from it's metadata -func assign_map_to_tile(tile: Control): - var chance = randi_range(0, 100) - if chance < 1: - tile.set_color(Color(1, 0.8, 0.8)) # Make the tile slightly red - var random_index = randi() % all_map_files.size() - var random_file = all_map_files[random_index] - tile.set_meta("map_file", random_file) # Set the metadata of the tile - #This function will be connected to the signal of the tiles func _on_tile_clicked(clicked_tile): if clicked_tile.has_meta("map_file"): + selected_overmap_tile = clicked_tile var mapFile = clicked_tile.get_meta("map_file") var nameString: String = "Name: " + mapFile var envString: String = clicked_tile.tileData.texture @@ -190,12 +214,14 @@ func _on_tile_clicked(clicked_tile): envString = "\nEnvironment: " + envString var challengeString: String = "\nChallenge: Easy" overmapTileLabel.text = nameString + envString + challengeString - Helper.current_level_name = mapFile travelButton.disabled = false else: + selected_overmap_tile = null travelButton.disabled = true overmapTileLabel.text = "Select a valid target" func _on_travel_button_button_up(): - get_tree().change_scene_to_file("res://level_generation.tscn") + var mapFile = selected_overmap_tile.get_meta("map_file") + var global_pos: Vector2 = selected_overmap_tile.get_meta("global_pos") + Helper.switch_level(mapFile, global_pos) diff --git a/Scripts/Enemy.gd b/Scripts/Enemy.gd index 4d482936..848edf6b 100644 --- a/Scripts/Enemy.gd +++ b/Scripts/Enemy.gd @@ -27,8 +27,11 @@ func _get_hit(damage): _die() func _die(): - var corpse = corpse_scene.instantiate() - #$"../../../..".add_child(corpse) - get_tree().get_root().call_deferred("add_child", corpse) - corpse.global_position = global_position + add_corpse.call_deferred(global_position) queue_free() + +func add_corpse(pos: Vector3): + var corpse = corpse_scene.instantiate() + get_tree().get_root().add_child(corpse) + corpse.global_position = pos + corpse.add_to_group("mapitems") diff --git a/Scripts/Helper.gd b/Scripts/Helper.gd index 90c49acf..cdf82751 100644 --- a/Scripts/Helper.gd +++ b/Scripts/Helper.gd @@ -1,15 +1,27 @@ extends Node3D var current_level_name : String +var chunks: Dictionary = {} #Stores references to tilegrids representing the overmap +var current_level_pos: Vector2 = Vector2(0,0) +var current_map_seed: int = 0 const json_Helper_Class = preload("res://Scripts/Helper/json_helper.gd") var json_helper: Node = null +const save_Helper_Class = preload("res://Scripts/Helper/save_helper.gd") +var save_helper: Node = null # Called when the node enters the scene tree for the first time. func _ready(): json_helper = json_Helper_Class.new() + save_helper = save_Helper_Class.new() + add_child(save_helper) -func switch_level(level_name): +#Level_name is a filename in /mods/core/maps +#global_pos is the absolute position on the overmap +#see overmap.gd for how global_pos is used there +func switch_level(level_name: String, global_pos: Vector2) -> void: current_level_name = level_name + if global_pos != Vector2(0,0): + save_helper.save_current_level(global_pos) get_tree().change_scene_to_file("res://level_generation.tscn") diff --git a/Scripts/Helper/json_helper.gd b/Scripts/Helper/json_helper.gd index 95a750b6..e9ff1cb7 100644 --- a/Scripts/Helper/json_helper.gd +++ b/Scripts/Helper/json_helper.gd @@ -20,6 +20,22 @@ func load_json_array_file(source: String) -> Array: else: print_debug("Unable to load file: " + source) return data_json + +#This function takes the path to a json file and returns its contents as an array +#It should check if the contents is an array or not. If it is not an array, +#it should return an empty array +func load_json_dictionary_file(source: String) -> Dictionary: + var data_json: Dictionary = {} + var file = FileAccess.open(source, FileAccess.READ) + if file: + var parsed_data = JSON.parse_string(file.get_as_text()) + if typeof(parsed_data) == TYPE_DICTIONARY: + data_json = parsed_data + else: + print_debug("The file does not contain a JSON dictionary: " + source) + else: + print_debug("Unable to load file: " + source) + return data_json # This function lists all the files in a specified directory. @@ -45,3 +61,13 @@ func file_names_in_dir(dirName: String, extensionFilter: Array = []) -> Array: print_debug("An error occurred when trying to access the path: " + dirName) dir.list_dir_end() return fileNames + + +#This function takes a json string and saves it as a json file. +func write_json_file(path: String, json: String): + # Save the JSON string to the selected file location + var file = FileAccess.open(path, FileAccess.WRITE) + if file: + file.store_string(json) + else: + print_debug("Unable to write file " + path) diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd new file mode 100644 index 00000000..1400ab8c --- /dev/null +++ b/Scripts/Helper/save_helper.gd @@ -0,0 +1,113 @@ +extends Node + +#This script is loaded in to the helper.gd autoload singleton +#It can be accessed trough helper.save_helper +#This scipt provides functions to help transitioning between levels +#It has functions to save the current level and the location of items, enemies and tiles +#It also has functions to load saved data and place the items, enemies and tiles on the map + +var current_save_folder: String = "" + +# Function to save the current level state +func save_current_level(global_pos: Vector2) -> void: + var dir = DirAccess.open(current_save_folder) + var map_folder = "map_x" + str(global_pos.x) + "_y" + str(global_pos.y) + var target_folder = current_save_folder+ "/" + map_folder + if !dir.dir_exists(map_folder): + if !dir.make_dir(map_folder) == OK: + print_debug("Failed to create a folder for the current map") + return + + save_map_data(target_folder) + save_enemy_data(target_folder) + save_item_data(target_folder) + +#Creates a new save folder. The name of this folder will be the current date and time +#This is to make sure it is unique. The folder name is stored in order to perform +#save and load actions. Also, the map seed is created and stored +func create_new_save(): + var dir = DirAccess.open("user://") + var unique_folder_path := "save/" + Time.get_datetime_string_from_system() + var sanitized_path = unique_folder_path.replace(":","") + if dir.make_dir_recursive(sanitized_path) == OK: + current_save_folder = "user://" + sanitized_path + Helper.json_helper.write_json_file(current_save_folder + "/game.json",\ + JSON.stringify({"mapseed": randi()})) + else: + print_debug("Failed to create a unique folder for the demo.") + +#Save the type and position of all enemies on the map +func save_enemy_data(target_folder: String) -> void: + var enemyData: Array = [] + var defaultEnemy: Dictionary = {"enemyid": "enemy1", \ + "global_position_x": 0, "global_position_y": 0, "global_position_z": 0} + var mapEnemies = get_tree().get_nodes_in_group("Enemies") + var newEnemyData: Dictionary + for enemy in mapEnemies: + enemy.remove_from_group("Enemies") + newEnemyData = defaultEnemy.duplicate() + newEnemyData["global_position_x"] = enemy.global_position.x + newEnemyData["global_position_y"] = enemy.global_position.y + newEnemyData["global_position_z"] = enemy.global_position.z + enemyData.append(newEnemyData.duplicate()) + Helper.json_helper.write_json_file(target_folder + "/enemies.json",\ + JSON.stringify(enemyData)) + +#Save the type and position of all enemies on the map +func save_item_data(target_folder: String) -> void: + var itemData: Array = [] + var defaultitem: Dictionary = {"itemid": "item1", \ + "global_position_x": 0, "global_position_y": 0, "global_position_z": 0} + var mapitems = get_tree().get_nodes_in_group("mapitems") + var newitemData: Dictionary + for item in mapitems: + item.remove_from_group("mapitems") + newitemData = defaultitem.duplicate() + newitemData["global_position_x"] = item.global_position.x + newitemData["global_position_y"] = item.global_position.y + newitemData["global_position_z"] = item.global_position.z + itemData.append(newitemData.duplicate()) + Helper.json_helper.write_json_file(target_folder + "/items.json",\ + JSON.stringify(itemData)) + +#The current state of the map is saved to disk +#Starting from the bottom level (-10), loop over every level +#Not every level is fully populated with blocks, so we need +#to use the position of the block to store the map information +#If the level is fully populated by blocks, it will save all +#the blocks with a value in the "texture" field +#If the level is not fully populated (for example, the level only contains +#the walls of a house), we check every possible position where a block +#could be and check if the position matches the position of the first +#child in the level. If it matches, we move on to the next child. +#If it does not match, we save information about the empty block instead. +#If a level has no children, it will remain an empty array [] +func save_map_data(target_folder: String) -> void: + var level_width : int = 32 + var level_height : int = 32 + var mapData: Dictionary = {"mapwidth": 32, "mapheight": 32, "levels": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]} + #During map generation, the levels were added to the maplevels group + var tree: SceneTree = get_tree() + var mapLevels = tree.get_nodes_in_group("maplevels") + var i: int = 0 + var block: StaticBody3D + var current_block: int = 0 + for level: Node3D in mapLevels: + #The level will be destroyed after saving so we remove them from the group + level.remove_from_group("maplevels") + if level.get_child_count() > 0: + block = level.get_child(0) + # Loop over every row one by one + for h in level_height: + # this loop will process blocks from West to East + for w in level_width: + if block.global_position.y == h and block.global_position.x == w: + mapData.levels[i].append({ "texture": block.get_texture_string(),\ + "rotation": 0 }) + current_block += 1 + block = level.get_child(current_block) + else: + mapData.levels[i].append({ "texture": "","rotation": 0 }) + i += 1 + #Overwrite the file if it exists and otherwise create it + Helper.json_helper.write_json_file(target_folder + "/map.json", JSON.stringify(mapData)) diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index cfe386ff..5f16f9bf 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -1,12 +1,17 @@ extends Node -var tile_materials = {} # Create an empty dictionary to store materials -var overmaptile_materials = {} # Create an empty dictionary to store materials +#This autoload singleton loads all game data required to run the game +#It can be accessed by using Gamedata.property + +var tile_materials = {} # Materials used to represent tiles +var overmaptile_materials = {} # Materials used to represent overmap tiles +var all_map_files: Array = [] # Called when the node enters the scene tree for the first time. func _ready(): load_tiles_material() load_overmaptiles_material() + all_map_files = Helper.json_helper.file_names_in_dir("./Mods/Core/Maps/", ["json"]) diff --git a/level_generation.tscn b/level_generation.tscn index a2d14974..59441b65 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -4,6 +4,7 @@ [ext_resource type="Script" path="res://LevelManager.gd" id="2_gm6x7"] [ext_resource type="PackedScene" uid="uid://cpaa3ui52a23c" path="res://Blocks/grass_001.tscn" id="2_plpeq"] [ext_resource type="PackedScene" uid="uid://b5b2f24f6emf3" path="res://Blocks/concrete_wall001.tscn" id="3_1oyl1"] +[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://enemy_corpse.tscn" id="3_l8ooc"] [ext_resource type="PackedScene" uid="uid://cmjjw8pjtidpj" path="res://Blocks/concrete_wall002.tscn" id="4_pf75o"] [ext_resource type="PackedScene" uid="uid://dnsl5rk6de7na" path="res://Blocks/Stairs_to_N001.tscn" id="5_4om2c"] [ext_resource type="PackedScene" uid="uid://db73ys0cw3b2i" path="res://Blocks/Stairs_to_E001.tscn" id="6_x7pv6"] @@ -14,6 +15,7 @@ [ext_resource type="Script" path="res://Scripts/Camera.gd" id="9_gi6l6"] [ext_resource type="Texture2D" uid="uid://8uwpq1ai8qi4" path="res://Textures/survivor.png" id="10_alql8"] [ext_resource type="Script" path="res://Scripts/PlayerShooting.gd" id="11_6i2sa"] +[ext_resource type="PackedScene" uid="uid://b2r6nh12wv41k" path="res://enemy.tscn" id="11_tj1r0"] [ext_resource type="PackedScene" uid="uid://doyjc25kl7104" path="res://bullet_line.tscn" id="12_dip38"] [ext_resource type="AudioStream" uid="uid://gdwwxc0yvg5g" path="res://Sounds/Weapons/Shooting/pistol_shot.wav" id="13_fjasp"] [ext_resource type="AudioStream" uid="uid://cfmgnsm10aj4i" path="res://Sounds/Weapons/Reloading/pistol_reload_sound.mp3" id="14_x756n"] @@ -70,6 +72,8 @@ radius = 1.5 [node name="LevelGenerator" type="Node3D" parent="TacticalMap" node_paths=PackedStringArray("level_manager") groups=["level_generator"]] script = ExtResource("1_i8qa4") +defaultEnemy = ExtResource("11_tj1r0") +defaultItem = ExtResource("3_l8ooc") level_manager = NodePath("../NavigationRegion3D/LevelManager") block_scenes = Array[PackedScene]([ExtResource("2_plpeq"), ExtResource("3_1oyl1"), ExtResource("4_pf75o"), ExtResource("5_4om2c"), ExtResource("6_x7pv6"), ExtResource("7_nhyjt"), ExtResource("8_l45yd")]) default_level_json = "res://Mods/Core/Maps/Generichouse.json" diff --git a/project.godot b/project.godot index b363ba2b..063b07d2 100644 --- a/project.godot +++ b/project.godot @@ -18,6 +18,8 @@ config/icon="res://icon.svg" [autoload] Nakama="res://addons/com.heroiclabs.nakama/Nakama.gd" +Helper="*res://Scripts/Helper.gd" +Gamedata="*res://Scripts/gamedata.gd" GLoot="*res://addons/gloot/gloot_autoload.gd" ItemManager="*res://Scripts/item_manager.gd" General="*res://Scripts/general.gd" @@ -109,6 +111,11 @@ interact={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"echo":false,"script":null) ] } +overmap={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":77,"key_label":0,"unicode":109,"echo":false,"script":null) +] +} [layer_names] From 6ae5f4361df888cf8b7acd92645524d4a20253b2 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:02:08 +0100 Subject: [PATCH 027/138] Initial version of save load --- LevelGenerator.gd | 58 +++++++++++-------------------- Scenes/Overmap/Scripts/Overmap.gd | 6 ++-- Scripts/Detection.gd | 5 ++- Scripts/EnemyFollow.gd | 3 +- Scripts/Helper.gd | 5 +-- Scripts/Helper/save_helper.gd | 29 ++++++++++------ Scripts/scene_selector.gd | 10 ++++-- 7 files changed, 60 insertions(+), 56 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 477ae640..5ce177b0 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -1,10 +1,7 @@ extends Node3D - - var level_json_as_text - var level_levels : Array var map_save_folder: String @@ -40,33 +37,38 @@ func get_saved_map_folder() -> String: var map_folder = "map_x" + str(level_pos.x) + "_y" + str(level_pos.y) var target_folder = current_save_folder+ "/" + map_folder if dir.dir_exists(map_folder): - return map_folder + return target_folder return "" func generate_enemies() -> void: if map_save_folder == "": return var enemiesArray = Helper.json_helper.load_json_array_file(map_save_folder + "/enemies.json") - for enemy in enemiesArray: - var newEnemy: CharacterBody3D = defaultEnemy.instantiate() - newEnemy.global_position.x = enemy.global_position_x - newEnemy.global_position.y = enemy.global_position_y - newEnemy.global_position.z = enemy.global_position_z - newEnemy.add_to_group("Enemies") - get_tree().get_root().add_child(newEnemy) + for enemy: Dictionary in enemiesArray: + add_enemy_to_map.call_deferred(enemy) +func add_enemy_to_map(enemy: Dictionary): + var newEnemy: CharacterBody3D = defaultEnemy.instantiate() + newEnemy.add_to_group("Enemies") + get_tree().get_root().add_child(newEnemy) + newEnemy.global_position.x = enemy.global_position_x + newEnemy.global_position.y = enemy.global_position_y + newEnemy.global_position.z = enemy.global_position_z func generate_items() -> void: if map_save_folder == "": return var itemsArray = Helper.json_helper.load_json_array_file(map_save_folder + "/items.json") - for item in itemsArray: - var newItem: CharacterBody3D = defaultItem.instantiate() - newItem.global_position.x = item.global_position_x - newItem.global_position.y = item.global_position_y - newItem.global_position.z = item.global_position_z - newItem.add_to_group("mapitems") - get_tree().get_root().add_child(newItem) + for item: Dictionary in itemsArray: + add_item_to_map.call_deferred(item) + +func add_item_to_map(item: Dictionary): + var newItem: Node3D = defaultItem.instantiate() + newItem.add_to_group("mapitems") + get_tree().get_root().add_child(newItem) + newItem.global_position.x = item.global_position_x + newItem.global_position.y = item.global_position_y + newItem.global_position.z = item.global_position_z func generate_level() -> void: var level_name: String = Helper.current_level_name @@ -87,48 +89,30 @@ func generate_level() -> void: var level_node = Node3D.new() level_node.add_to_group("maplevels") level_manager.add_child(level_node) + #The lowest level starts at -10 which would be rock bottom level_node.global_position.y = level_number-10 - var current_block = 0 - # we will generate number equal to "layer_height" of horizontal rows of blocks for h in level_height: # this loop will generate blocks from West to East based on the tile number # in json file - for w in level_width: - # checking if we have tile from json in our block array containing packedscenes # of blocks that we need to instantiate. # If yes, then instantiate - -# if block_scenes[level["data"][current_block]-1]: if level[current_block]: textureName = level[current_block].texture if textureName != "": -# var block : StaticBody3D -## block = block_scenes[0].instantiate() var block = create_block_with_material(textureName) - - #var block: StaticBody3D = defaultBlock.instantiate() - #if textureName in Gamedata.tile_materials: - #var material = Gamedata.tile_materials[textureName] - #block.update_texture(material) - # block = block_scenes[layer["data"][current_block]-1].instantiate() level_node.add_child(block) - block.global_position.x = w - #block.global_position.y = layer_number block.global_position.z = h current_block += 1 - level_number += 1 - - # YEAH I KNOW THAT SHOULD BE ONE FUNCTION, BUT IT'S 2:30 AM and... I'm TIRED LOL func get_level_json(): var file = default_level_json diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index d4a94e22..2e345bd0 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -208,12 +208,14 @@ func _on_tile_clicked(clicked_tile): if clicked_tile.has_meta("map_file"): selected_overmap_tile = clicked_tile var mapFile = clicked_tile.get_meta("map_file") - var nameString: String = "Name: " + mapFile + var tilePos = clicked_tile.get_meta("global_pos") + var posString: String = "Pos: (" + str(tilePos.x)+","+str(tilePos.y)+")" + var nameString: String = "\nName: " + mapFile var envString: String = clicked_tile.tileData.texture envString = envString.replace("res://Mods/Core/OvermapTiles/","") envString = "\nEnvironment: " + envString var challengeString: String = "\nChallenge: Easy" - overmapTileLabel.text = nameString + envString + challengeString + overmapTileLabel.text = posString + nameString + envString + challengeString travelButton.disabled = false else: selected_overmap_tile = null diff --git a/Scripts/Detection.gd b/Scripts/Detection.gd index f52d347d..db3af821 100644 --- a/Scripts/Detection.gd +++ b/Scripts/Detection.gd @@ -29,7 +29,10 @@ func _process(delta): func _physics_process(delta): var space_state = get_world_3d().direct_space_state # TO-DO Change playerCol to group of players - var query = PhysicsRayQueryParameters3D.create(global_position, get_tree().get_first_node_in_group("Players").global_position, pow(2, 1-1) + pow(2, 3-1),[self]) + var playerInstance: CharacterBody3D = get_tree().get_first_node_in_group("Players") + if !playerInstance: + return + var query = PhysicsRayQueryParameters3D.create(global_position, playerInstance.global_position, pow(2, 1-1) + pow(2, 3-1),[self]) var result = space_state.intersect_ray(query) diff --git a/Scripts/EnemyFollow.gd b/Scripts/EnemyFollow.gd index d795a405..5d0e1f3a 100644 --- a/Scripts/EnemyFollow.gd +++ b/Scripts/EnemyFollow.gd @@ -27,7 +27,8 @@ func Physics_Update(delta: float): enemy.velocity = dir * get_node(stats).current_move_speed enemy.move_and_slide() - + if !targeted_player: + return var space_state = get_world_3d().direct_space_state # TO-DO Change playerCol to group of players var query = PhysicsRayQueryParameters3D.create(get_node(enemyCol).global_position, targeted_player.global_position, pow(2, 1-1) + pow(2, 3-1),[self]) diff --git a/Scripts/Helper.gd b/Scripts/Helper.gd index cdf82751..0aaca6c7 100644 --- a/Scripts/Helper.gd +++ b/Scripts/Helper.gd @@ -20,8 +20,9 @@ func _ready(): #see overmap.gd for how global_pos is used there func switch_level(level_name: String, global_pos: Vector2) -> void: current_level_name = level_name - if global_pos != Vector2(0,0): - save_helper.save_current_level(global_pos) + if current_level_pos != Vector2(0,0): + save_helper.save_current_level(current_level_pos) + current_level_pos = global_pos get_tree().change_scene_to_file("res://level_generation.tscn") diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 1400ab8c..a7a61c46 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -50,6 +50,7 @@ func save_enemy_data(target_folder: String) -> void: newEnemyData["global_position_y"] = enemy.global_position.y newEnemyData["global_position_z"] = enemy.global_position.z enemyData.append(newEnemyData.duplicate()) + enemy.queue_free() Helper.json_helper.write_json_file(target_folder + "/enemies.json",\ JSON.stringify(enemyData)) @@ -67,6 +68,7 @@ func save_item_data(target_folder: String) -> void: newitemData["global_position_y"] = item.global_position.y newitemData["global_position_z"] = item.global_position.z itemData.append(newitemData.duplicate()) + item.queue_free() Helper.json_helper.write_json_file(target_folder + "/items.json",\ JSON.stringify(itemData)) @@ -89,25 +91,32 @@ func save_map_data(target_folder: String) -> void: #During map generation, the levels were added to the maplevels group var tree: SceneTree = get_tree() var mapLevels = tree.get_nodes_in_group("maplevels") - var i: int = 0 var block: StaticBody3D var current_block: int = 0 + var level_y: int = 0 + var textureName: String = "" + var level_block_count: int = 0 for level: Node3D in mapLevels: #The level will be destroyed after saving so we remove them from the group level.remove_from_group("maplevels") - if level.get_child_count() > 0: - block = level.get_child(0) + #The bottom level will have y set at -10. The first item in the mapData + #array will be 0 so in this way we add the levels fom -10 to 10 + level_y = level.global_position.y+10 + level_block_count = level.get_child_count() + if level_block_count > 0: + current_block = 0 # Loop over every row one by one for h in level_height: # this loop will process blocks from West to East for w in level_width: - if block.global_position.y == h and block.global_position.x == w: - mapData.levels[i].append({ "texture": block.get_texture_string(),\ - "rotation": 0 }) - current_block += 1 - block = level.get_child(current_block) + block = level.get_child(current_block) + if block.global_position.z == h and block.global_position.x == w: + textureName = block.get_texture_string() + textureName = textureName.replace("res://./Mods/Core/Tiles/", "") + mapData.levels[level_y].append({ "texture": textureName,"rotation": 0 }) + if current_block < level_block_count-1: + current_block += 1 else: - mapData.levels[i].append({ "texture": "","rotation": 0 }) - i += 1 + mapData.levels[level_y].append({ "texture": "","rotation": 0 }) #Overwrite the file if it exists and otherwise create it Helper.json_helper.write_json_file(target_folder + "/map.json", JSON.stringify(mapData)) diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index c00b5ca8..76b8891a 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -34,11 +34,15 @@ func _process(delta): func _on_view_level_pressed(): - Helper.switch_level(level_files[option_levels.get_selected_id()]) - + Helper.switch_level(level_files[option_levels.get_selected_id()],Vector2(0,0)) +#When the play demo button is pressed +#Create a new folder in the user directory +#The name of the folder should be the current date and time so it's unique +#This unique folder will contain save data for this game and can be loaded later func _on_play_demo_pressed(): - Helper.switch_level("") + Helper.save_helper.create_new_save() + Helper.switch_level("Generichouse.json", Vector2(0, 0)) func _on_help_button_pressed(): get_tree().change_scene_to_file("res://documentation.tscn") From 3c6e92d9ac25cbeb2c077d750f8423b3bfed0d13 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 6 Dec 2023 20:00:21 +0100 Subject: [PATCH 028/138] remove editor complaints --- LevelGenerator.gd | 1 - Scripts/BuildManager.gd | 6 ++--- Scripts/Camera.gd | 11 --------- Scripts/Components/ComponentInteract.gd | 18 +++++++-------- Scripts/CraftingMenu.gd | 4 ---- Scripts/Detection.gd | 6 ++--- Scripts/Documentation.gd | 3 --- Scripts/EnemyAttack.gd | 4 ++-- Scripts/EnemyFollow.gd | 4 ++-- Scripts/EnemyIdle.gd | 6 ++--- Scripts/EnemyStats.gd | 2 +- Scripts/Helper.gd | 2 +- Scripts/Helper/save_helper.gd | 2 +- Scripts/ItemDetector.gd | 8 ------- Scripts/NonHUDclick.gd | 10 --------- Scripts/PlayerShooting.gd | 2 +- Scripts/container.gd | 7 ------ Scripts/crafting_recipes_manager.gd | 5 ----- Scripts/general.gd | 9 -------- Scripts/hud.gd | 8 +++---- Scripts/item_craft_button.gd | 4 ++-- Scripts/item_manager.gd | 8 ------- Scripts/player.gd | 30 ++++++++++++------------- Scripts/scene_selector.gd | 5 ----- level_generation.tscn | 6 ++--- 25 files changed, 49 insertions(+), 122 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 5ce177b0..574d9d39 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -30,7 +30,6 @@ func generate_map(): generate_items() func get_saved_map_folder() -> String: - var level_name: String = Helper.current_level_name var level_pos: Vector2 = Helper.current_level_pos var current_save_folder: String = Helper.save_helper.current_save_folder var dir = DirAccess.open(current_save_folder) diff --git a/Scripts/BuildManager.gd b/Scripts/BuildManager.gd index ecb639b3..f5b84154 100644 --- a/Scripts/BuildManager.gd +++ b/Scripts/BuildManager.gd @@ -25,7 +25,7 @@ func _ready(): # Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): +func _process(_delta): if is_building: ghost_sprite.visible = true @@ -33,7 +33,7 @@ func _process(delta): # ghost_sprite.global_position = get_global_mouse_position() -func _input(event): +func _input(_event): #3D # if Input.is_action_pressed("click") && is_building && get_node(hud).try_to_spend_item("plank", 2): @@ -49,7 +49,7 @@ func _input(event): func make_tile_ghost(): pass -func _on_hud_construction_chosen(construction: String): +func _on_hud_construction_chosen(_construction: String): print("Building test") is_building = true General.is_allowed_to_shoot = false diff --git a/Scripts/Camera.gd b/Scripts/Camera.gd index c43f1339..f5186ebe 100644 --- a/Scripts/Camera.gd +++ b/Scripts/Camera.gd @@ -1,16 +1,5 @@ extends Camera3D - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass - - func _input(event): if event.is_action_pressed("zoom_in"): size -= 2 diff --git a/Scripts/Components/ComponentInteract.gd b/Scripts/Components/ComponentInteract.gd index 92626b91..dad6be0c 100644 --- a/Scripts/Components/ComponentInteract.gd +++ b/Scripts/Components/ComponentInteract.gd @@ -1,11 +1,11 @@ extends Node3D - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass +# +## Called when the node enters the scene tree for the first time. +#func _ready(): + #pass # Replace with function body. +# +# +## Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): + #pass diff --git a/Scripts/CraftingMenu.gd b/Scripts/CraftingMenu.gd index df4f85c1..12aae3ff 100644 --- a/Scripts/CraftingMenu.gd +++ b/Scripts/CraftingMenu.gd @@ -31,10 +31,6 @@ func _ready(): button.crafting_menu = [self] -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass - func item_craft_button_clicked(recipe): active_recipe = recipe diff --git a/Scripts/Detection.gd b/Scripts/Detection.gd index db3af821..4098095b 100644 --- a/Scripts/Detection.gd +++ b/Scripts/Detection.gd @@ -19,20 +19,20 @@ func _ready(): # Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): +func _process(_delta): pass #3d # queue_redraw() -func _physics_process(delta): +func _physics_process(_delta): var space_state = get_world_3d().direct_space_state # TO-DO Change playerCol to group of players var playerInstance: CharacterBody3D = get_tree().get_first_node_in_group("Players") if !playerInstance: return - var query = PhysicsRayQueryParameters3D.create(global_position, playerInstance.global_position, pow(2, 1-1) + pow(2, 3-1),[self]) + var query = PhysicsRayQueryParameters3D.create(global_position, playerInstance.global_position, int(pow(2, 1-1) + pow(2, 3-1)),[self]) var result = space_state.intersect_ray(query) diff --git a/Scripts/Documentation.gd b/Scripts/Documentation.gd index d8065964..da1753ff 100644 --- a/Scripts/Documentation.gd +++ b/Scripts/Documentation.gd @@ -6,9 +6,6 @@ func _ready(): load_documentation_files() $CategoryTree.item_selected.connect(_on_CategoryTree_item_selected) -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass func load_documentation_files(): var resourceDir = "./Documentation" diff --git a/Scripts/EnemyAttack.gd b/Scripts/EnemyAttack.gd index 0992e819..39cf943a 100644 --- a/Scripts/EnemyAttack.gd +++ b/Scripts/EnemyAttack.gd @@ -19,12 +19,12 @@ func Enter(): func Exit(): pass -func Physics_Update(delta: float): +func Physics_Update(_delta: float): var space_state = get_world_3d().direct_space_state # TO-DO Change playerCol to group of players - var query = PhysicsRayQueryParameters3D.create(get_node(enemy).global_position, targeted_player.global_position, pow(2, 1-1) + pow(2, 3-1), [self]) + var query = PhysicsRayQueryParameters3D.create(get_node(enemy).global_position, targeted_player.global_position, int(pow(2, 1-1) + pow(2, 3-1)), [self]) var result = space_state.intersect_ray(query) diff --git a/Scripts/EnemyFollow.gd b/Scripts/EnemyFollow.gd index 5d0e1f3a..81567b88 100644 --- a/Scripts/EnemyFollow.gd +++ b/Scripts/EnemyFollow.gd @@ -22,7 +22,7 @@ func Enter(): func Exit(): pathfinding_timer.stop() -func Physics_Update(delta: float): +func Physics_Update(_delta: float): var dir = enemy.to_local(nav_agent.get_next_path_position()).normalized() enemy.velocity = dir * get_node(stats).current_move_speed enemy.move_and_slide() @@ -31,7 +31,7 @@ func Physics_Update(delta: float): return var space_state = get_world_3d().direct_space_state # TO-DO Change playerCol to group of players - var query = PhysicsRayQueryParameters3D.create(get_node(enemyCol).global_position, targeted_player.global_position, pow(2, 1-1) + pow(2, 3-1),[self]) + var query = PhysicsRayQueryParameters3D.create(get_node(enemyCol).global_position, targeted_player.global_position, int(pow(2, 1-1) + pow(2, 3-1)),[self]) var result = space_state.intersect_ray(query) diff --git a/Scripts/EnemyIdle.gd b/Scripts/EnemyIdle.gd index 76dd9f31..b209e08f 100644 --- a/Scripts/EnemyIdle.gd +++ b/Scripts/EnemyIdle.gd @@ -26,7 +26,7 @@ func Enter(): func Exit(): moving_timer.stop() -func Physics_Update(delta: float): +func Physics_Update(_delta: float): if is_looking_to_move: var dir = get_node(enemy).to_local(nav_agent.get_next_path_position()).normalized() get_node(enemy).velocity = dir * get_node(stats).current_idle_move_speed @@ -38,7 +38,7 @@ func Physics_Update(delta: float): -func _on_detection_player_spotted(player): +func _on_detection_player_spotted(_player): Transistioned.emit(self, "enemyfollow") @@ -50,7 +50,7 @@ func _on_moving_cooldown_timeout(): var space_state = get_world_3d().direct_space_state var random_dir = Vector3(rng.randf_range(-1,1), get_node(enemy).global_position.y, rng.randf_range(-1, 1)) - var query = PhysicsRayQueryParameters3D.create(get_node(enemy).global_position, get_node(enemy).global_position + (random_dir * move_distance), pow(2, 1-1) + pow(2, 3-1),[self]) + var query = PhysicsRayQueryParameters3D.create(get_node(enemy).global_position, get_node(enemy).global_position + (random_dir * move_distance), int(pow(2, 1-1) + pow(2, 3-1)),[self]) var result = space_state.intersect_ray(query) if !result: diff --git a/Scripts/EnemyStats.gd b/Scripts/EnemyStats.gd index 62fae365..fb3ab0d0 100644 --- a/Scripts/EnemyStats.gd +++ b/Scripts/EnemyStats.gd @@ -20,5 +20,5 @@ func _ready(): # Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): +func _process(_delta): pass diff --git a/Scripts/Helper.gd b/Scripts/Helper.gd index 0aaca6c7..b069982f 100644 --- a/Scripts/Helper.gd +++ b/Scripts/Helper.gd @@ -32,7 +32,7 @@ func line(pos1: Vector3, pos2: Vector3, color = Color.WHITE_SMOKE) -> MeshInstan var material := ORMMaterial3D.new() mesh_instance.mesh = immediate_mesh - mesh_instance.cast_shadow = 0 + mesh_instance.cast_shadow = mesh_instance.SHADOW_CASTING_SETTING_OFF immediate_mesh.surface_begin(Mesh.PRIMITIVE_LINES, material) immediate_mesh.surface_add_vertex(pos1) diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index a7a61c46..b05df3f6 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -101,7 +101,7 @@ func save_map_data(target_folder: String) -> void: level.remove_from_group("maplevels") #The bottom level will have y set at -10. The first item in the mapData #array will be 0 so in this way we add the levels fom -10 to 10 - level_y = level.global_position.y+10 + level_y = int(level.global_position.y+10) level_block_count = level.get_child_count() if level_block_count > 0: current_block = 0 diff --git a/Scripts/ItemDetector.gd b/Scripts/ItemDetector.gd index 4f3f07f0..b446d0ab 100644 --- a/Scripts/ItemDetector.gd +++ b/Scripts/ItemDetector.gd @@ -2,14 +2,6 @@ extends Area3D signal add_to_proximity_inventory signal remove_from_proximity_inventory -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass func _on_area_entered(area): diff --git a/Scripts/NonHUDclick.gd b/Scripts/NonHUDclick.gd index 1c3ac3b1..878fe4ce 100644 --- a/Scripts/NonHUDclick.gd +++ b/Scripts/NonHUDclick.gd @@ -1,16 +1,6 @@ extends Control -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass - - func _on_mouse_entered(): General.is_mouse_outside_HUD = true diff --git a/Scripts/PlayerShooting.gd b/Scripts/PlayerShooting.gd index e86b7818..184e6153 100644 --- a/Scripts/PlayerShooting.gd +++ b/Scripts/PlayerShooting.gd @@ -120,7 +120,7 @@ func _ready(): # Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): +func _process(_delta): # Reloading sound logic, basically we want to play the sound during the reloading phase, # not before or after reloading so the end of reloading sounds will align with end of the reloading phase diff --git a/Scripts/container.gd b/Scripts/container.gd index 3bffa50a..5cfb4a00 100644 --- a/Scripts/container.gd +++ b/Scripts/container.gd @@ -6,12 +6,6 @@ extends Node3D # Called when the node enters the scene tree for the first time. func _ready(): create_random_loot() - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass - func create_random_loot(): if get_node(inventory).get_children() == []: @@ -25,6 +19,5 @@ func create_random_loot(): item.set_property("assigned_id", ItemManager.assign_id()) - func get_items(): return get_node(inventory).get_children() diff --git a/Scripts/crafting_recipes_manager.gd b/Scripts/crafting_recipes_manager.gd index 4501f07c..f5f49c10 100644 --- a/Scripts/crafting_recipes_manager.gd +++ b/Scripts/crafting_recipes_manager.gd @@ -7,11 +7,6 @@ var crafting_recipes func _ready(): get_crafting_recipes_from_json() - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass - func get_crafting_recipes_from_json(): var file = "res://JSON/crafting_recipes.json" var json_as_text = FileAccess.get_file_as_string(file) diff --git a/Scripts/general.gd b/Scripts/general.gd index f9752fc9..3374490e 100644 --- a/Scripts/general.gd +++ b/Scripts/general.gd @@ -3,12 +3,3 @@ extends Node var is_mouse_outside_HUD = false var is_allowed_to_shoot = true - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass diff --git a/Scripts/hud.gd b/Scripts/hud.gd index 5fcc416b..a12b318c 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -80,7 +80,7 @@ func _ready(): # Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): +func _process(_delta): if is_showing_tooltip: get_node(tooltip).visible = true get_node(tooltip).global_position = get_node(tooltip).get_global_mouse_position() + Vector2(0, -5 - get_node(tooltip).size.y) @@ -145,7 +145,7 @@ func _on_inventory_item_mouse_entered(item): get_node(tooltip_item_name).text = str(item.get_property("name", "")) get_node(tooltip_item_description).text = item.get_property("description", "") -func _on_inventory_item_mouse_exited(item): +func _on_inventory_item_mouse_exited(_item): is_showing_tooltip = false func check_if_resources_are_available(item_id, amount_to_spend: int): @@ -154,7 +154,7 @@ func check_if_resources_are_available(item_id, amount_to_spend: int): print("checking if we have the item id in inv") if inventory_node.get_item_by_id(item_id): print("we have the item id") - var item_total_amount : int + var item_total_amount : int = 0 var current_amount_to_spend = amount_to_spend var items = inventory_node.get_items_by_id(item_id) @@ -169,7 +169,7 @@ func check_if_resources_are_available(item_id, amount_to_spend: int): func try_to_spend_item(item_id, amount_to_spend : int): var inventory_node = get_node(inventory) if inventory_node.get_item_by_id(item_id): - var item_total_amount : int + var item_total_amount : int = 0 var current_amount_to_spend = amount_to_spend var items = inventory_node.get_items_by_id(item_id) diff --git a/Scripts/item_craft_button.gd b/Scripts/item_craft_button.gd index 2e2404cd..ce25dd48 100644 --- a/Scripts/item_craft_button.gd +++ b/Scripts/item_craft_button.gd @@ -5,6 +5,6 @@ var recipe var crafting_menu -func _on_toggled(button_pressed): - if button_pressed: +func _on_toggled(currently_pressed: bool): + if currently_pressed: get_tree().call_group("CraftingMenu","item_craft_button_clicked", recipe) diff --git a/Scripts/item_manager.gd b/Scripts/item_manager.gd index 8ae0dccc..1750c372 100644 --- a/Scripts/item_manager.gd +++ b/Scripts/item_manager.gd @@ -36,14 +36,6 @@ var item_protoset : ItemProtoset "damage": "25" } -# Called when the node enters the scene tree for the first time. -func _ready(): - pass - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass - func assign_id(): item_id_to_assign += 1 return item_id_to_assign diff --git a/Scripts/player.gd b/Scripts/player.gd index c69687e1..16e68d5d 100644 --- a/Scripts/player.gd +++ b/Scripts/player.gd @@ -70,7 +70,7 @@ func _ready(): current_stamina = stamina -func _process(delta): +func _process(_delta): # if is_progress_bar_well_progressing_i_guess: # get_node(progress_bar_filling).scale.x = lerp(1, 0, get_node(progress_bar_timer).time_left / progress_bar_timer_max_time) @@ -191,20 +191,20 @@ func check_if_alive(): current_head_health = 0 die() - -func check_if_visible(target_position: Vector3): - - var space_state = get_world_3d().direct_space_state - # TO-DO Change playerCol to group of players - var query = PhysicsRayQueryParameters3D.create(global_position, target_position, pow(2, 1-1) + pow(2, 3-1) + pow(2, 2-1),[self]) - var result = space_state.intersect_ray(query) - - if result: - print("I see something!") - return false - else: - print("I see nothing!") - return true +# +#func check_if_visible(target_position: Vector3): + # + #var space_state = get_world_3d().direct_space_state + ## TO-DO Change playerCol to group of players + #var query = PhysicsRayQueryParameters3D.create(global_position, target_position, pow(2, 1-1) + pow(2, 3-1) + pow(2, 2-1),[self]) + #var result = space_state.intersect_ray(query) + # + #if result: + #print("I see something!") + #return false + #else: + #print("I see nothing!") + #return true func die(): print("Player died") diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index 76b8891a..5e727553 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -28,11 +28,6 @@ func dir_contents(path): print("An error occurred when trying to access the path.") -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - pass - - func _on_view_level_pressed(): Helper.switch_level(level_files[option_levels.get_selected_id()],Vector2(0,0)) diff --git a/level_generation.tscn b/level_generation.tscn index 59441b65..5925088d 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=31 format=3 uid="uid://drl78uuphij1l"] +[gd_scene load_steps=33 format=3 uid="uid://drl78uuphij1l"] [ext_resource type="Script" path="res://LevelGenerator.gd" id="1_i8qa4"] [ext_resource type="Script" path="res://LevelManager.gd" id="2_gm6x7"] @@ -34,7 +34,6 @@ reflected_light_source = 1 [sub_resource type="NavigationMesh" id="NavigationMesh_3licq"] geometry_parsed_geometry_type = 1 geometry_source_geometry_mode = 1 -cell_size = 0.1 agent_height = 0.5 agent_radius = 0.3 agent_max_slope = 46.0 @@ -55,10 +54,9 @@ size = Vector3(0.3, 1, 0.55) points = PackedVector3Array(0.15, 0.15, 0.275, -0.15, 0.15, 0.275, 0.15, -0.5, 0.275, 0.15, 0.15, -0.275, -0.15, 0.15, -0.275, -0.15, -0.5, 0.275, 0.15, -0.5, -0.275, -0.15, -0.5, -0.275) [sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_136pt"] -streams_count = 1 playback_mode = 1 random_pitch = 1.2 -random_volume_offset_db = 0.0 +streams_count = 1 stream_0/stream = ExtResource("13_fjasp") stream_0/weight = 1.0 From e2f8601ffe6ab6bf7e813a47787ad5d9f4fecbce Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 9 Dec 2023 00:18:43 +0100 Subject: [PATCH 029/138] Added the selectable sprite custom widget --- .../Scripts/Scrolling_Flow_Container.gd | 13 +++- .../Scripts/Selectable_Sprite_Widget.gd | 24 +++++++ .../Scripts/Sprite_Selector_Popup.gd | 62 +++++++++++++++++++ .../Selectable_Sprite_Widget.tscn | 24 +++++++ .../Custom_Widgets/Sprite_Selector_Popup.tscn | 47 ++++++++++++++ 5 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd create mode 100644 Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd create mode 100644 Scenes/ContentManager/Custom_Widgets/Selectable_Sprite_Widget.tscn create mode 100644 Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd index a997376a..90e3e78f 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd @@ -1,5 +1,9 @@ extends Control +#This script belongs to the Scrolling_Flow_Container scene +#It shows a flowcontianer in a scrollcontainer and optionally a collapse button +#Once instanced, set the collapse button text to the text you want +#If you set the header as empty it will hide the collapse button @export var contentItems: FlowContainer = null @export var collapseButton: Button = null @@ -7,7 +11,11 @@ var is_collapsed: bool = false var header: String = "Items": set(newName): header = newName - collapseButton.text = header + if newName == "": + collapseButton.hide() + else: + collapseButton.show() + collapseButton.text = header #This function will collapse and expand the $Content/ContentItems when the collapse button is pressed func _on_collapse_button_button_up(): @@ -20,3 +28,6 @@ func _on_collapse_button_button_up(): func add_content_item(item: Node): contentItems.add_child(item) + +func get_content_items() -> Array[Node]: + return contentItems.get_children() diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd new file mode 100644 index 00000000..d03707e7 --- /dev/null +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd @@ -0,0 +1,24 @@ +extends Control + +signal selectableSprite_clicked(clicked_sprite: Control) +var selected: bool = false + +#When the event was a left mouse button press, adjust emit a signal that it was clicked +func _on_texture_rect_gui_input(event): + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + selectableSprite_clicked.emit(self) + +func set_sprite_texture(res: Resource) -> void: + $SpriteImage.texture = res + +func get_texture() -> Resource: + return $SpriteImage.texture + +#Mark the clicked spritebrush as selected +func set_selected(is_selected: bool) -> void: + selected = is_selected + if selected: + modulate = Color(0.227, 0.635, 0.757) + else: + modulate = Color(1,1,1) + diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd new file mode 100644 index 00000000..8492a866 --- /dev/null +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd @@ -0,0 +1,62 @@ +extends Popup + +# This script is intended to be used in the Sprite_Selector_Popup widget. +# The goal is to show the user a list of sprites that the user can select from +# The user selects a sprite and presses OK or Cancel to confirm the choice +# The parent interface will then receive the resource path of the selected sprite +# In order to use the Sprite_Selector_Popup, set the Sprite Dir property to the +# Directory where sprites should be loaded from. Each sprite will be represented +# By a Selectable_Sprite_Widget that handles selecting and click signals + +#This will be instanced many times to make up the sprite list +@export var selectable_Sprite_Widget: PackedScene +#Reference to the Scrolling_flow_container that holds the sprites +@export var spriteList: Control = null +#Keep a reference to all the sprites that were instanced +var instanced_sprites: Array[Node] = [] +# The parent control has to provide a dictionary. This dictionary +# contains a list of textures with the name of the texture as a key +var sprites_dictionary: Dictionary = {}: + set(value): + sprites_dictionary = value + populate_sprite_list() +# Reference to one of the selectable_Sprite_Widgets that the user has selected +var selectedSprite: Control = null +#Will be sent when the user has selected a tile and pressed OK +signal sprite_selected_ok(clicked_sprite: Control) + + +# this function will read all files in SpriteDir and for each file it will create a +# selectable_Sprite_Widget and assign the file as the texture of the selectable_Sprite_Widget. +# Then it will add the selectable_Sprite_Widget as a child to spriteList +func populate_sprite_list(): + for filename in sprites_dictionary.keys(): + var material = sprites_dictionary[filename] + var selectableSpriteInstance = selectable_Sprite_Widget.instantiate() + # Assign the texture to the TextureRect + selectableSpriteInstance.set_sprite_texture(material) + selectableSpriteInstance.selectableSprite_clicked.connect(sprite_clicked) + spriteList.add_content_item(selectableSpriteInstance) + instanced_sprites.append(selectableSpriteInstance) + +# +# Called after the user selects a tile in the popup textbox and presses OK +func _on_ok_button_up(): + hide() + if selectedSprite: + sprite_selected_ok.emit(selectedSprite) + +# Called after the users presses cancel on the popup asking for a tile +func _on_cancel_button_up(): + hide() + +func deselect_all_sprites(): + for child in instanced_sprites: + child.set_selected(false) + +# Mark the clicked selectedSprite as selected, but only after deselecting all other sprites +func sprite_clicked(spite_selected: Control) -> void: + deselect_all_sprites() + selectedSprite = spite_selected + # If the clicked brush was not select it, we select it. Otherwise we deselect it + spite_selected.set_selected(true) diff --git a/Scenes/ContentManager/Custom_Widgets/Selectable_Sprite_Widget.tscn b/Scenes/ContentManager/Custom_Widgets/Selectable_Sprite_Widget.tscn new file mode 100644 index 00000000..3e4e6880 --- /dev/null +++ b/Scenes/ContentManager/Custom_Widgets/Selectable_Sprite_Widget.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=3 format=3 uid="uid://vc1hpsum7b2u"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd" id="1_ix6u3"] +[ext_resource type="Texture2D" uid="uid://ttmfel3ylg0w" path="res://Mods/Core/Tiles/arcstones1.png" id="2_5qjrc"] + +[node name="SelectableSprite" type="Control"] +custom_minimum_size = Vector2(64, 64) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_ix6u3") + +[node name="SpriteImage" type="TextureRect" parent="."] +custom_minimum_size = Vector2(64, 64) +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 +texture = ExtResource("2_5qjrc") +expand_mode = 3 + +[connection signal="gui_input" from="SpriteImage" to="." method="_on_texture_rect_gui_input"] diff --git a/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn b/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn new file mode 100644 index 00000000..1ae6eed3 --- /dev/null +++ b/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=4 format=3 uid="uid://d1h1rpwt8f807"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd" id="1_rag8d"] +[ext_resource type="PackedScene" uid="uid://vc1hpsum7b2u" path="res://Scenes/ContentManager/Custom_Widgets/Selectable_Sprite_Widget.tscn" id="2_wjnk7"] +[ext_resource type="PackedScene" uid="uid://be62h2ytgw2kb" path="res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn" id="3_nkgi6"] + +[node name="Sprite_selector" type="Popup" node_paths=PackedStringArray("spriteList")] +title = "Input ID" +initial_position = 2 +size = Vector2i(400, 400) +visible = true +unresizable = false +borderless = false +script = ExtResource("1_rag8d") +selectable_Sprite_Widget = ExtResource("2_wjnk7") +spriteList = NodePath("VBoxContainer/Scrolling_Flow_Container") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +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 + +[node name="Label" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Select a tile" + +[node name="Scrolling_Flow_Container" parent="VBoxContainer" instance=ExtResource("3_nkgi6")] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="OK" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +text = "Ok" + +[node name="Cancel" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 0 +text = "Cancel" From a459a661789c845669a00d1425049e72ad9f3ca6 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 10 Dec 2023 22:07:10 +0100 Subject: [PATCH 030/138] Add mobeditor, refactor contentlist --- .../Custom_Editors/MobEditor.tscn | 190 ++++++++++++++ .../Custom_Editors/Scripts/MobEditor.gd | 110 ++++++++ Scenes/ContentManager/Scripts/content_list.gd | 243 ++++-------------- .../ContentManager/Scripts/contenteditor.gd | 29 ++- Scenes/ContentManager/content_list.tscn | 4 +- Scenes/ContentManager/contenteditor.tscn | 4 +- Scripts/Helper/json_helper.gd | 58 +++++ Scripts/gamedata.gd | 119 ++++++++- 8 files changed, 545 insertions(+), 212 deletions(-) create mode 100644 Scenes/ContentManager/Custom_Editors/MobEditor.tscn create mode 100644 Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd diff --git a/Scenes/ContentManager/Custom_Editors/MobEditor.tscn b/Scenes/ContentManager/Custom_Editors/MobEditor.tscn new file mode 100644 index 00000000..ae8e3a2c --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/MobEditor.tscn @@ -0,0 +1,190 @@ +[gd_scene load_steps=4 format=3 uid="uid://drby7yfu8t38e"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd" id="1_ubw0i"] +[ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_woy6i"] +[ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="3_847a0"] + +[node name="MobEditor" type="Control" node_paths=PackedStringArray("mobImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "mobSelector", "melee_damage_numedit", "melee_range_numedit", "moveSpeed_numedit", "idle_move_speed_numedit", "sightRange_numedit", "senseRange_numedit", "hearingRange_numedit")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_ubw0i") +mobImageDisplay = NodePath("VBoxContainer/FormGrid/MobImageDisplay") +IDTextLabel = NodePath("VBoxContainer/FormGrid/IDTextLabel") +PathTextLabel = NodePath("VBoxContainer/FormGrid/PathTextLabel") +NameTextEdit = NodePath("VBoxContainer/FormGrid/NameTextEdit") +DescriptionTextEdit = NodePath("VBoxContainer/FormGrid/DescriptionTextEdit") +mobSelector = NodePath("Sprite_selector") +melee_damage_numedit = NodePath("VBoxContainer/FormGrid/MeleeDamageSpinBox") +melee_range_numedit = NodePath("VBoxContainer/FormGrid/MeleeRangeSpinbox") +moveSpeed_numedit = NodePath("VBoxContainer/FormGrid/MoveSpeedSpinBox") +idle_move_speed_numedit = NodePath("VBoxContainer/FormGrid/IdleMoveSpeedSpinBox") +sightRange_numedit = NodePath("VBoxContainer/FormGrid/SightRangeSpinBox") +senseRange_numedit = NodePath("VBoxContainer/FormGrid/SenseRangeSpinbox") +hearingRange_numedit = NodePath("VBoxContainer/FormGrid/HearingRangeSpinbox") + +[node name="VBoxContainer" 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="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="CloseButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Close" + +[node name="SaveButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Save" + +[node name="FormGrid" type="GridContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +columns = 2 + +[node name="ImageLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Image:" + +[node name="MobImageDisplay" type="TextureRect" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(128, 128) +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_stretch_ratio = 0.4 +texture = ExtResource("2_woy6i") +expand_mode = 3 + +[node name="PathLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Path:" + +[node name="PathTextLabel" type="Label" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 + +[node name="IDLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "ID:" + +[node name="IDTextLabel" type="Label" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 + +[node name="NameLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Name" + +[node name="NameTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 +focus_next = NodePath("../DescriptionTextEdit") +focus_previous = NodePath("../MobImageDisplay") +placeholder_text = "Scorpion " + +[node name="DescriptionLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Description" + +[node name="DescriptionTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.9 +focus_previous = NodePath("../NameTextEdit") +placeholder_text = "A very dangerous land animal often found in dry climates" + +[node name="HealthLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Health" + +[node name="HealthSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +value = 100.0 + +[node name="MeleeDamageLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Melee damage" + +[node name="MeleeDamageSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +value = 20.0 + +[node name="MeleeRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Melee range" + +[node name="MeleeRangeSpinbox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The maximum distance it can reach when attacking in melee" +step = 0.5 +value = 1.5 + +[node name="MoveSpeedLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Move speed" + +[node name="MoveSpeedSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The speed at which it moves" +value = 1.0 + +[node name="IdleMoveSpeedLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Idle move speed" + +[node name="IdleMoveSpeedSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The speed at which it moves when idle" +step = 0.5 +value = 0.5 + +[node name="SightRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Sight range" + +[node name="SightRangeSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The maximum distance it can visually detect other entities" +max_value = 500.0 +value = 200.0 + +[node name="SenseRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Sense range" + +[node name="SenseRangeSpinbox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The maximum distance at which it can detect entities with senses other then sight and hearing" +value = 50.0 + +[node name="HearingRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Hearing range" + +[node name="HearingRangeSpinbox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The maximum distance at which it can detect entities trough hearing" +max_value = 5000.0 +value = 1000.0 + +[node name="Sprite_selector" parent="." instance=ExtResource("3_847a0")] +visible = false + +[connection signal="button_up" from="VBoxContainer/HBoxContainer/CloseButton" to="." method="_on_close_button_button_up"] +[connection signal="button_up" from="VBoxContainer/HBoxContainer/SaveButton" to="." method="_on_save_button_button_up"] +[connection signal="gui_input" from="VBoxContainer/FormGrid/MobImageDisplay" to="." method="_on_mob_image_display_gui_input"] +[connection signal="sprite_selected_ok" from="Sprite_selector" to="." method="_on_sprite_selector_sprite_selected_ok"] diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd new file mode 100644 index 00000000..1374a639 --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd @@ -0,0 +1,110 @@ +extends Control + +#This scene is intended to be used inside the content editor +#It is supposed to edit exactly one mob (friend and foe) +#It expects to save the data to a JSON file that contains all data from a mod +#To load data, provide the name of the mob data file and an ID + +@export var mobImageDisplay: TextureRect = null +@export var IDTextLabel: Label = null +@export var PathTextLabel: Label = null +@export var NameTextEdit: TextEdit = null +@export var DescriptionTextEdit: TextEdit = null +@export var mobSelector: Popup = null +@export var melee_damage_numedit: SpinBox +@export var melee_range_numedit: SpinBox +@export var health_numedit: SpinBox +@export var moveSpeed_numedit: SpinBox +@export var idle_move_speed_numedit: SpinBox +@export var sightRange_numedit: SpinBox +@export var senseRange_numedit: SpinBox +@export var hearingRange_numedit: SpinBox + +#The JSON file to be edited +var contentSource: String = "": + set(value): + contentSource = value + load_mob_data() + mobSelector.sprites_dictionary = Gamedata.mob_materials + +#This function will find an item in the contentSource JSOn file with an iD that is equal to self.name +#If an item is found, it will set all the elements in the editor with the corresponding values +func load_mob_data() -> void: + if not FileAccess.file_exists(contentSource): + return + + var file = FileAccess.open(contentSource, FileAccess.READ) + var data = JSON.parse_string(file.get_as_text()) + file.close() + + for item in data: + if item["id"] == self.name: + if mobImageDisplay != null and item.has("imagePath"): + mobImageDisplay.texture = load(item["imagePath"]) + if IDTextLabel != null: + IDTextLabel.text = str(item["id"]) + if NameTextEdit != null and item.has("name"): + NameTextEdit.text = item["name"] + if DescriptionTextEdit != null and item.has("description"): + DescriptionTextEdit.text = item["description"] + if melee_damage_numedit != null and item.has("melee_damage"): + melee_damage_numedit.text = item["melee_damage"] + if melee_range_numedit != null and item.has("melee_range"): + melee_damage_numedit.text = item["melee_range"] + if health_numedit != null and item.has("health"): + health_numedit.text = item["health"] + if moveSpeed_numedit != null and item.has("move_speed"): + moveSpeed_numedit.text = item["move_speed"] + if idle_move_speed_numedit != null and item.has("idle_move_speed"): + idle_move_speed_numedit.text = item["idle_move_speed"] + if sightRange_numedit != null and item.has("sight_range"): + sightRange_numedit.text = item["sight_range"] + if senseRange_numedit != null and item.has("sense_range"): + senseRange_numedit.text = item["sense_range"] + if hearingRange_numedit != null and item.has("hearing_range"): + hearingRange_numedit.text = item["hearing_range"] + break + + +#The editor is closed, destroy the instance +#TODO: Check for unsaved changes +func _on_close_button_button_up() -> void: + queue_free() + +#This function takes all data fro the form elements and writes it to the contentSource JSON file. +func _on_save_button_button_up() -> void: + var file = FileAccess.open(contentSource, FileAccess.READ_WRITE) + var data = JSON.parse_string(file.get_as_text()) + file.close() + + for item in data: + if item["id"] == IDTextLabel.text: + item["imagePath"] = mobImageDisplay.texture.resource_path + item["name"] = NameTextEdit.text + item["description"] = DescriptionTextEdit.text + item["melee_damage"] = melee_damage_numedit.text + item["melee_range"] = melee_damage_numedit.text + item["health"] = health_numedit.text + item["move_speed"] = moveSpeed_numedit.text + item["idle_move_speed"] = idle_move_speed_numedit.text + item["sight_range"] = sightRange_numedit.text + item["sense_range"] = senseRange_numedit.text + item["hearing_range"] = hearingRange_numedit.text + break + + file = FileAccess.open(contentSource, FileAccess.WRITE) + file.store_string(JSON.stringify(data)) + file.close() + + +#When the mobImageDisplay is clicked, the user will be prompted to select an image from +# "res://Mods/Core/mobs/". The texture of the mobImageDisplay will change to the selected image +func _on_mob_image_display_gui_input(event) -> void: + if event is InputEventMouseButton and event.pressed: + mobSelector.show() + + +func _on_sprite_selector_sprite_selected_ok(clicked_sprite) -> void: + var mobTexture: Resource = clicked_sprite.get_texture() + mobImageDisplay.texture = mobTexture + PathTextLabel.text = mobTexture.resource_path diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 21bebd3a..3c4ea60c 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -10,26 +10,18 @@ extends Control @export var collapseButton: Button = null @export var pupup_ID: Popup = null @export var popup_textedit: TextEdit = null -signal item_activated(strSource: String, itemID: String) +signal item_activated(data: Array, itemID: String) var is_collapsed: bool = false var popupAction: String = "" -var source: String = "": - set(path): - source = path +var contentdata: Array = [""]: + set(newData): + contentdata = newData load_data() var header: String = "Items": set(newName): header = newName collapseButton.text = header -#This function will collapse and expand the $Content/ContentItems when the collapse button is pressed -func _on_collapse_button_button_up(): - contentItems.visible = is_collapsed - if is_collapsed: - size_flags_vertical = Control.SIZE_EXPAND_FILL - else: - size_flags_vertical = Control.SIZE_SHRINK_BEGIN - is_collapsed = !is_collapsed # This function will take a string and create a new json file with just {} as the contents. @@ -58,92 +50,51 @@ func create_new_json_file(filename: String = "", isArray: bool = true): #If the path is a directory, it will list all the files in the directory #If the path is a json file, it will list all the items in the json file func load_data(): - if source == "": + if contentdata.is_empty(): return contentItems.clear() - if source.ends_with(".json"): - load_file() + #If the first item is a string, it's a list of files. + #Otherwise, it's a list of objects representing some kind of data + if contentdata[0] is String: + make_file_list() else: - load_dir() - -func load_file(): - create_new_json_file(source) - # Save the JSON string to the selected file location - var file = FileAccess.open(source, FileAccess.READ) - if file: - var data_json: Array - data_json = JSON.parse_string(file.get_as_text()) - for item in data_json: - # get the id of the item, "missing_id" if not found - var item_id: String = item.get("id", "missing_id") - #Add the item and save the index number - var item_index: int = contentItems.add_item(item_id) - contentItems.set_item_metadata(item_index, item_id) - - if item.has("imagePath"): - contentItems.set_item_icon(item_index,load(item["imagePath"])) - else: - print_debug("Unable to load file: " + source) - -func load_dir() -> void: - var json_files: Array = Helper.json_helper.file_names_in_dir(source, ["json"]) - for file_name in json_files: + make_item_list() + +func make_item_list(): + for item in contentdata: + # get the id of the item, "missing_id" if not found + var item_id: String = item.get("id", "missing_id") + #Add the item and save the index number + var item_index: int = contentItems.add_item(item_id) + contentItems.set_item_metadata(item_index, item_id) + + if item.has("imagePath"): + contentItems.set_item_icon(item_index,load(item["imagePath"])) + +func make_file_list() -> void: + for file_name in contentdata: # Add all the filenames to the ContentItems list as child nodes var item_index: int = contentItems.add_item(file_name.replace(".json", "")) #Add the ID as metadata which can be used to load the item data contentItems.set_item_metadata(item_index, file_name.replace(".json", "")) -func _on_content_items_item_activated(index): +# Executed when an item in ContentItems is double-clicked or +# when the user selects an item in ContentItems and presses enter +# Index is the position in the ContentItems list starting from 0 +func _on_content_items_item_activated(index: int): + # Get the id of the item from the metadata var strItemID: String = contentItems.get_item_metadata(index) if strItemID: - item_activated.emit(source, strItemID) + item_activated.emit(contentdata, strItemID) else: print_debug("Tried to signal that item with ID (" + str(index) + ") was activated,\ but the item has no metadata") - -#This function enters a new item into the json file specified by the source variable -#The item will just be an object like this: {"id": id} -#If an item with that ID already exists in that file, do nothing -func add_item_to_json_file(id: String): -# If the source is not a JSON file, return without doing anything. - if !source.ends_with(".json"): - return - - # If the file does not exist, create a new JSON file. - if !FileAccess.file_exists(source): - create_new_json_file(source, true) - - # Open the file and load the JSON data. - var file = FileAccess.open(source, FileAccess.READ) - var data_json: Array - if file: - data_json = JSON.parse_string(file.get_as_text()) - file.close() - else: - print_debug("Unable to load file: " + source) - return - - # Check if an item with the given ID already exists in the file. - for item in data_json: - if item.get("id", "") == id: - print_debug("An item with ID (" + id + ") already exists in the file.") - return - - # If no item with the given ID exists, add a new item to the JSON data. - data_json.append({"id": id}) - - # Save the updated JSON data to the file. - file = FileAccess.open(source, FileAccess.WRITE) - if file: - file.store_string(JSON.stringify(data_json)) - file.close() - else: - print_debug("Unable to write to file: " + source) +#This function will append an item to the game data +func add_item_to_data(id: String): + Gamedata.add_id_to_data(contentdata, id) load_data() - - #This function will show a pop-up asking the user to input an ID func _on_add_button_button_up(): popupAction = "Add" @@ -168,19 +119,21 @@ func _on_duplicate_button_button_up(): #Called after the user enters an ID into the popup textbox and presses OK func _on_ok_button_up(): pupup_ID.hide() - if popup_textedit.text == "": + var myText = popup_textedit.text + if myText == "": return; if popupAction == "Add": - if source.ends_with(".json"): - add_item_to_json_file(popup_textedit.text) + if contentdata[0] is Dictionary: + Gamedata.add_id_to_data(contentdata, myText) else: - create_new_json_file(source + popup_textedit.text + ".json", false) + Gamedata.add_file_to_data(contentdata, myText) if popupAction == "Duplicate": - if source.ends_with(".json"): - duplicate_item_in_json_file(get_selected_item_text(), popup_textedit.text) + if contentdata[0] is Dictionary: + Gamedata.duplicate_item_in_data(contentdata,get_selected_item_text(),myText) else: - print_debug("There should be code here for when a json file gets duplicated") + print_debug("There should be code here for when a file in the gets duplicated") popupAction = "" + load_data() #Called after the users presses cancel on the popup asking for an ID func _on_cancel_button_up(): @@ -195,111 +148,19 @@ func _on_delete_button_button_up(): if selected_id == "": return contentItems.remove_item(contentItems.get_selected_items()[0]) - if source.ends_with(".json"): - remove_item_from_json_file(selected_id) - else: - delete_json_file(source + selected_id + ".json") - - -#This function removes an item from the json file specified by the source variable -#If an item with that ID does not exist in that file, do nothing -func remove_item_from_json_file(id: String): - # If the source is not a JSON file, return without doing anything. - if !source.ends_with(".json"): - return - - # If the file does not exist, return without doing anything. - if !FileAccess.file_exists(source): - return - - # Open the file and load the JSON data. - var file = FileAccess.open(source, FileAccess.READ) - var data_json: Array - if file: - data_json = JSON.parse_string(file.get_as_text()) - file.close() - else: - print_debug("Unable to load file: " + source) - return - - # Check if an item with the given ID exists in the file. - for i in range(data_json.size()): - if data_json[i].get("id", "") == id: - data_json.remove_at(i) - break - - # Save the updated JSON data to the file. - file = FileAccess.open(source, FileAccess.WRITE) - if file: - file.store_string(JSON.stringify(data_json)) - file.close() - else: - print_debug("Unable to write to file: " + source) - load_data() - - -#This function will take two strings called ID and newID -#It will find an item with this ID in a json file specified by the source variable -#It will then duplicate that item into the json file and change the ID to newID -func duplicate_item_in_json_file(id: String, newID: String): - # If the source is not a JSON file, return without doing anything. - if !source.ends_with(".json"): - return - - # If the file does not exist, return without doing anything. - if !FileAccess.file_exists(source): - return - - # Open the file and load the JSON data. - var file = FileAccess.open(source, FileAccess.READ) - var data_json: Array - if file: - data_json = JSON.parse_string(file.get_as_text()) - file.close() - else: - print_debug("Unable to load file: " + source) - return - - # Check if an item with the given ID exists in the file. - var item_to_duplicate = null - for item in data_json: - if item.get("id", "") == id: - item_to_duplicate = item.duplicate() - break - - # If there is no item to duplicate, return without doing anything. - if item_to_duplicate == null: - return - - # Change the ID of the duplicated item. - item_to_duplicate["id"] = newID - - # Add the duplicated item to the JSON data. - data_json.append(item_to_duplicate) - - # Save the updated JSON data to the file. - file = FileAccess.open(source, FileAccess.WRITE) - if file: - file.store_string(JSON.stringify(data_json)) - file.close() - else: - print_debug("Unable to write to file: " + source) - load_data() - - -#This function will take a path to a json file and delete it -func delete_json_file(path: String): - var dir = DirAccess.open(path) - if dir: - # Delete the file - var err = dir.remove(path) - if err == OK: - print_debug("File deleted successfully: " + path) - else: - print_debug("An error occurred when trying to delete the file: " + path) + Gamedata.remove_item_from_data(contentdata, selected_id) load_data() func get_selected_item_text() -> String: if !contentItems.is_anything_selected(): return "" return contentItems.get_item_text(contentItems.get_selected_items()[0]) + +#This function will collapse and expand the $Content/ContentItems when the collapse button is pressed +func _on_collapse_button_button_up(): + contentItems.visible = is_collapsed + if is_collapsed: + size_flags_vertical = Control.SIZE_EXPAND_FILL + else: + size_flags_vertical = Control.SIZE_SHRINK_BEGIN + is_collapsed = !is_collapsed diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index 36f2c60c..74f02314 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -3,6 +3,7 @@ extends Control @export var contentList: PackedScene = null @export var mapEditor: PackedScene = null @export var terrainTileEditor: PackedScene = null +@export var mobEditor: PackedScene = null @export var content: VBoxContainer = null @export var tabContainer: TabContainer = null var selectedMod: String = "Core" @@ -10,15 +11,16 @@ var selectedMod: String = "Core" # Called when the node enters the scene tree for the first time. #This function will instatiate a tileScene, set the source property and add it as a child to the content VBoxContainer. The source property should be set to "./Mods/Core/Maps/" func _ready(): - load_content_list("./Mods/Core/Maps/", "Maps") - load_content_list("./Mods/Core/Tiles/Tiles.json", "Terrain Tiles") + load_content_list(Gamedata.all_map_files, "Maps") + load_content_list(Gamedata.all_tiles, "Terrain Tiles") + load_content_list(Gamedata.all_mobs, "Mobs") -func load_content_list(strSource: String, strHeader: String): +func load_content_list(data: Array, strHeader: String): # Instantiate a contentlist var contentListInstance: Control = contentList.instantiate() # Set the source property - contentListInstance.source = strSource + contentListInstance.data = data contentListInstance.header = strHeader contentListInstance.connect("item_activated", _on_content_item_activated) @@ -33,17 +35,18 @@ func _on_back_button_button_up(): #If strSource is a json file, we load an item from this file with the ID of itemText #If the strSource is not a json file, we will assume it's a directory. #If it's a directory, we will load the entire json file with the name of the item ID -func _on_content_item_activated(strSource: String, itemID: String): - if strSource == "" or itemID == "": +func _on_content_item_activated(data: Array, itemID: String): + if data.is_empty() or itemID == "": print_debug("Tried to load the selected contentitem, but either \ - strSource ("+strSource+") or itemID ("+itemID+") is empty") + data (Array) or itemID ("+itemID+") is empty") return - if strSource.ends_with(".json"): - if strSource.begins_with("./Mods/Core/Tiles/"): - instantiate_editor(strSource, itemID, terrainTileEditor) - else: - if strSource.begins_with("./Mods/Core/Maps/"): - instantiate_editor(strSource + itemID + ".json", itemID, mapEditor) + var strSource: String = Gamedata.get_data_directory(data) + if data == Gamedata.all_tiles: + instantiate_editor(strSource, itemID, terrainTileEditor) + if data == Gamedata.all_mobs: + instantiate_editor(strSource, itemID, mobEditor) + if data == Gamedata.all_map_files: + instantiate_editor(strSource + itemID + ".json", itemID, mapEditor) #This will add an editor to the content editor tab view. #The editor that should be instantiated is passed trough in the newEditor parameter diff --git a/Scenes/ContentManager/content_list.tscn b/Scenes/ContentManager/content_list.tscn index 8e476978..d801867b 100644 --- a/Scenes/ContentManager/content_list.tscn +++ b/Scenes/ContentManager/content_list.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=3 format=3 uid="uid://bhh0v7x4fjsgi"] +[gd_scene load_steps=2 format=3 uid="uid://bhh0v7x4fjsgi"] [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/content_list.gd" id="1_ly1kh"] -[ext_resource type="Script" path="res://Scripts/Helper/json_helper.gd" id="2_5gw28"] [node name="ContentList" type="Control" node_paths=PackedStringArray("contentItems", "collapseButton", "pupup_ID", "popup_textedit")] custom_minimum_size = Vector2(200, 30) @@ -18,7 +17,6 @@ contentItems = NodePath("Content/ContentItems") collapseButton = NodePath("Content/HBoxContainer/CollapseButton") pupup_ID = NodePath("ID_Input") popup_textedit = NodePath("ID_Input/VBoxContainer/TextEdit") -json_Helper_Class = ExtResource("2_5gw28") [node name="Content" type="VBoxContainer" parent="."] layout_mode = 1 diff --git a/Scenes/ContentManager/contenteditor.tscn b/Scenes/ContentManager/contenteditor.tscn index d6716403..28437696 100644 --- a/Scenes/ContentManager/contenteditor.tscn +++ b/Scenes/ContentManager/contenteditor.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=5 format=3 uid="uid://480xqusluqrk"] +[gd_scene load_steps=6 format=3 uid="uid://480xqusluqrk"] [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/contenteditor.gd" id="1_65sl4"] [ext_resource type="PackedScene" uid="uid://bhh0v7x4fjsgi" path="res://Scenes/ContentManager/content_list.tscn" id="2_4f21i"] [ext_resource type="PackedScene" uid="uid://d3001f5xxpup1" path="res://Scenes/ContentManager/Mapeditor/mapeditor.tscn" id="3_q062s"] [ext_resource type="PackedScene" uid="uid://vfj2if40vf10" path="res://Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn" id="4_5nnw0"] +[ext_resource type="PackedScene" uid="uid://drby7yfu8t38e" path="res://Scenes/ContentManager/Custom_Editors/MobEditor.tscn" id="5_86se2"] [node name="contenteditor" type="Control" node_paths=PackedStringArray("content", "tabContainer")] layout_mode = 3 @@ -16,6 +17,7 @@ script = ExtResource("1_65sl4") contentList = ExtResource("2_4f21i") mapEditor = ExtResource("3_q062s") terrainTileEditor = ExtResource("4_5nnw0") +mobEditor = ExtResource("5_86se2") content = NodePath("HSplitContainer/ContentLists/TabContainer2/Content") tabContainer = NodePath("HSplitContainer/TabContainer") diff --git a/Scripts/Helper/json_helper.gd b/Scripts/Helper/json_helper.gd index e9ff1cb7..94cf4087 100644 --- a/Scripts/Helper/json_helper.gd +++ b/Scripts/Helper/json_helper.gd @@ -69,5 +69,63 @@ func write_json_file(path: String, json: String): var file = FileAccess.open(path, FileAccess.WRITE) if file: file.store_string(json) + file.close() else: print_debug("Unable to write file " + path) + +# This function will take a path and create a new json file with just {} or [] as the contents. +#If the file already exists, we do not overwrite it +func create_new_json_file(filename: String = "", isArray: bool = true): + # If no string was provided, return without doing anything. + if filename.is_empty(): + return + + # If the file already exists, alert the user that the file already exists. + if FileAccess.file_exists(filename): + return + + var file = FileAccess.open(filename, FileAccess.WRITE) + #The file cen contain either one object or one array with a list of objects + if isArray: + file.store_string("[]") + else: + file.store_string("{}") + file.close() + + + +#This function enters a new item into the json file specified by the source variable +#The item will just be an object like this: {"id": id} +#If an item with that ID already exists in that file, do nothing +func add_id_to_json_file(source: String, id: String): +# If the source is not a JSON file, return without doing anything. + if !source.ends_with(".json"): + return + + # If the file does not exist, create a new JSON file. + if !FileAccess.file_exists(source): + create_new_json_file(source, true) + + var data_json: Array = load_json_array_file(source) + + # Check if an item with the given ID already exists in the file. + for item in data_json: + if item.get("id", "") == id: + print_debug("An item with ID (" + id + ") already exists in the file.") + return + + # If no item with the given ID exists, add a new item to the JSON data. + data_json.append({"id": id}) + write_json_file(source, JSON.stringify(data_json)) + + +#This function will take a path to a json file and delete it +func delete_json_file(path: String): + var dir = DirAccess.open(path) + if dir: + # Delete the file + var err = dir.remove(path) + if err == OK: + print_debug("File deleted successfully: " + path) + else: + print_debug("An error occurred when trying to delete the file: " + path) diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index 5f16f9bf..92245872 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -3,17 +3,45 @@ extends Node #This autoload singleton loads all game data required to run the game #It can be accessed by using Gamedata.property -var tile_materials = {} # Materials used to represent tiles -var overmaptile_materials = {} # Materials used to represent overmap tiles +var tile_materials: Dictionary = {} # Materials used to represent tiles +var all_tiles: Array = [] # All data describing tiles +var overmaptile_materials: Dictionary = {} # Materials used to represent overmap tiles +var mob_materials: Dictionary = {} # Materials used to represent mobs +var all_mobs: Array = [] # All data describing mobs var all_map_files: Array = [] # Called when the node enters the scene tree for the first time. func _ready(): load_tiles_material() load_overmaptiles_material() + load_mobs_material() + load_mob_data() + load_tile_data() all_map_files = Helper.json_helper.file_names_in_dir("./Mods/Core/Maps/", ["json"]) +#Loads mob json data. If no json file exists, it will create an empty array in a new file +func load_mob_data(): + var mob_dir: String = "./Mods/Core/Mobs/Mobs.json" + Helper.json_helper.create_new_json_file(mob_dir) + all_mobs = Helper.json_helper.load_json_array_file(mob_dir) + +#Loads tile json data. If no json file exists, it will create an empty array in a new file +func load_tile_data(): + var tile_dir: String = "./Mods/Core/Tiles/Tiles.json" + Helper.json_helper.create_new_json_file(tile_dir) + all_tiles = Helper.json_helper.load_json_array_file(tile_dir) + +# This function reads all the files in "res://Mods/Core/Tiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. +func load_mobs_material(): + var mobsDir = "./Mods/Core/Mobs/" + var png_files: Array = Helper.json_helper.file_names_in_dir(mobsDir, ["png"]) + for png_file in png_files: + # Load the .png file as a texture + var texture := load(mobsDir + png_file) + # Add the material to the dictionary + mob_materials[png_file] = texture + # This function reads all the files in "res://Mods/Core/Tiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. func load_tiles_material(): @@ -25,8 +53,8 @@ func load_tiles_material(): material.albedo_texture = texture # Set the texture of the material material.uv1_scale = Vector3(3,2,1) tile_materials[png_file] = material # Add the material to the dictionary - - + + # This function reads all the files in "res://Mods/Core/OvermapTiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. func load_overmaptiles_material(): var tilesDir = "./Mods/Core/OvermapTiles/" @@ -36,3 +64,86 @@ func load_overmaptiles_material(): var texture := load(tilesDir + png_file) # Add the material to the dictionary overmaptile_materials[png_file] = texture + + +#This function will take two strings called ID and newID +#It will find an item with this ID in a json file specified by the source variable +#It will then duplicate that item into the json file and change the ID to newID +func duplicate_item_in_data(data: Array, id: String, newID: String): + # If the first item is a string, assume all items are strings and do nothing + if data[0] is String: + return + + # Check if an item with the given ID exists in the file. + var item_index: int = get_array_index_by_id(data,id) + if item_index == -1: + return + + # Duplicate the found item recursively + var item_to_duplicate = data[item_index].duplicate(true) + + # If there is no item to duplicate, return without doing anything. + if item_to_duplicate == null: + return + # Change the ID of the duplicated item. + item_to_duplicate["id"] = newID + # Add the duplicated item to the JSON data. + data.append(item_to_duplicate) + Helper.json_helper.write_json_file(get_data_directory(data),JSON.stringify(data)) + + +#This function appends a new object to an existing array +#Pass the array to this function and the value of the ID +#The object that will be appended will be nothing more then {"id": id} +#After the ID is added, the data array will be saved to disk +func add_id_to_data(data: Array, id: String): + if get_array_index_by_id(data,id) != -1: + print_debug("Tried to add an existing id to an array") + return + data.append({"id": id}) + Helper.json_helper.write_json_file(get_data_directory(data),JSON.stringify(data)) + +#This function appends a new filename to an existing array +#Pass the array to this function and the value of the filename +#The string that will be appended will be nothing more then the file name +#After the filename is added, the file will be saved to disk +func add_file_to_data(data: Array, fileName: String): + if fileName in data: + print_debug("Tried to add an existing file to a file array") + return + data.append(fileName) + #Create a new json file in the directory with only {} in the file + Helper.json_helper.create_new_json_file(get_data_directory(data) + fileName, false) + +# Will remove an item from the data +# If the first item in data is a dictionary, we remove an item that has the provided id +# If the first item in data is a string, we remove the string and the associated json file +func remove_item_from_data(data: Array, id: String): + if data[0] is Dictionary: + data.remove_at(get_array_index_by_id(data, id)) + elif data[0] is String: + data.erase(id) + Helper.json_helper.delete_json_file(get_data_directory(data), id) + else: + print_debug("Tried to remove item from data, but the data contains \ + neither Dictionary nor String") + +func get_data_directory(data: Array) -> String: + if data == all_tiles: + return "./Mods/Core/Tiles/Tiles.json" + if data == all_mobs: + return "./Mods/Core/Mobs/Mobs.json" + if data == all_map_files: + return "./Mods/Core/Maps/" + return "" + +func get_array_index_by_id(data: Array, id: String) -> int: + var myIndex: int = -1 + var i: int = 0 + for item in data: + if item.get("id", "") == id: + myIndex = i + break + i += 1 + return myIndex + From 01105d652732f0858626d36d9de8d55b6c010082 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 10 Dec 2023 22:18:07 +0100 Subject: [PATCH 031/138] layout, bugfix --- Mods/Core/Mobs/Mobs.json | 1 + Scenes/ContentManager/Scripts/content_list.gd | 2 +- Scenes/ContentManager/Scripts/contenteditor.gd | 2 +- Scenes/ContentManager/content_list.tscn | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Mods/Core/Mobs/Mobs.json diff --git a/Mods/Core/Mobs/Mobs.json b/Mods/Core/Mobs/Mobs.json new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/Mods/Core/Mobs/Mobs.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 3c4ea60c..9576def9 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -13,7 +13,7 @@ extends Control signal item_activated(data: Array, itemID: String) var is_collapsed: bool = false var popupAction: String = "" -var contentdata: Array = [""]: +var contentdata: Array = []: set(newData): contentdata = newData load_data() diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index 74f02314..a3b314bb 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -20,7 +20,7 @@ func load_content_list(data: Array, strHeader: String): var contentListInstance: Control = contentList.instantiate() # Set the source property - contentListInstance.data = data + contentListInstance.contentdata = data contentListInstance.header = strHeader contentListInstance.connect("item_activated", _on_content_item_activated) diff --git a/Scenes/ContentManager/content_list.tscn b/Scenes/ContentManager/content_list.tscn index d801867b..711b5b22 100644 --- a/Scenes/ContentManager/content_list.tscn +++ b/Scenes/ContentManager/content_list.tscn @@ -60,7 +60,7 @@ theme_override_font_sizes/font_size = 16 text = "-" [node name="ContentItems" type="ItemList" parent="Content"] -custom_minimum_size = Vector2(200, 200) +custom_minimum_size = Vector2(200, 30) layout_mode = 2 size_flags_vertical = 3 fixed_icon_size = Vector2i(32, 32) From eb98a0ad964500d3e80c69e879d3991272123d46 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 10 Dec 2023 22:43:59 +0100 Subject: [PATCH 032/138] small refactor of adding json items --- Scenes/ContentManager/Scripts/content_list.gd | 9 +- Scenes/ContentManager/contenteditor.tscn | 1 + Scripts/gamedata.gd | 84 ++++++++++--------- 3 files changed, 49 insertions(+), 45 deletions(-) diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 9576def9..95316dc1 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -122,16 +122,13 @@ func _on_ok_button_up(): var myText = popup_textedit.text if myText == "": return; + if contentdata.is_empty(): + print_debug("Tried to add a new item to contentlist, but contentdata is empty") + return if popupAction == "Add": - if contentdata[0] is Dictionary: Gamedata.add_id_to_data(contentdata, myText) - else: - Gamedata.add_file_to_data(contentdata, myText) if popupAction == "Duplicate": - if contentdata[0] is Dictionary: Gamedata.duplicate_item_in_data(contentdata,get_selected_item_text(),myText) - else: - print_debug("There should be code here for when a file in the gets duplicated") popupAction = "" load_data() diff --git a/Scenes/ContentManager/contenteditor.tscn b/Scenes/ContentManager/contenteditor.tscn index 28437696..6d8705ca 100644 --- a/Scenes/ContentManager/contenteditor.tscn +++ b/Scenes/ContentManager/contenteditor.tscn @@ -54,6 +54,7 @@ layout_mode = 2 size_flags_vertical = 3 [node name="Content" type="VBoxContainer" parent="HSplitContainer/ContentLists/TabContainer2"] +custom_minimum_size = Vector2(0, 200) layout_mode = 2 [node name="Recent" type="ItemList" parent="HSplitContainer/ContentLists/TabContainer2"] diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index 92245872..b0c065a4 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -70,50 +70,56 @@ func load_overmaptiles_material(): #It will find an item with this ID in a json file specified by the source variable #It will then duplicate that item into the json file and change the ID to newID func duplicate_item_in_data(data: Array, id: String, newID: String): - # If the first item is a string, assume all items are strings and do nothing - if data[0] is String: + if data.is_empty(): return + + if get_data_directory(data).ends_with((".json")): + # If the first item is a string, assume all items are strings and do nothing + if data[0] is String: + return + + # Check if an item with the given ID exists in the file. + var item_index: int = get_array_index_by_id(data,id) + if item_index == -1: + return - # Check if an item with the given ID exists in the file. - var item_index: int = get_array_index_by_id(data,id) - if item_index == -1: - return - - # Duplicate the found item recursively - var item_to_duplicate = data[item_index].duplicate(true) - - # If there is no item to duplicate, return without doing anything. - if item_to_duplicate == null: - return - # Change the ID of the duplicated item. - item_to_duplicate["id"] = newID - # Add the duplicated item to the JSON data. - data.append(item_to_duplicate) - Helper.json_helper.write_json_file(get_data_directory(data),JSON.stringify(data)) + # Duplicate the found item recursively + var item_to_duplicate = data[item_index].duplicate(true) + + # If there is no item to duplicate, return without doing anything. + if item_to_duplicate == null: + return + # Change the ID of the duplicated item. + item_to_duplicate["id"] = newID + # Add the duplicated item to the JSON data. + data.append(item_to_duplicate) + Helper.json_helper.write_json_file(get_data_directory(data),JSON.stringify(data)) + else: + print_debug("There should be code here for when a file in the gets duplicated") -#This function appends a new object to an existing array -#Pass the array to this function and the value of the ID -#The object that will be appended will be nothing more then {"id": id} -#After the ID is added, the data array will be saved to disk +# This function appends a new object to an existing array +# Pass the array to this function and the value of the ID +# If the data directory ends in .json, it will append an object +# The object that will be appended will be nothing more then {"id": id} +# if the data directory does not end in .json, a new file will be added +# This file will get the name as specified by id, so for example "myhouse" +# After the ID is added, the data array will be saved to disk func add_id_to_data(data: Array, id: String): - if get_array_index_by_id(data,id) != -1: - print_debug("Tried to add an existing id to an array") - return - data.append({"id": id}) - Helper.json_helper.write_json_file(get_data_directory(data),JSON.stringify(data)) - -#This function appends a new filename to an existing array -#Pass the array to this function and the value of the filename -#The string that will be appended will be nothing more then the file name -#After the filename is added, the file will be saved to disk -func add_file_to_data(data: Array, fileName: String): - if fileName in data: - print_debug("Tried to add an existing file to a file array") - return - data.append(fileName) - #Create a new json file in the directory with only {} in the file - Helper.json_helper.create_new_json_file(get_data_directory(data) + fileName, false) + if get_data_directory(data).ends_with((".json")): + if get_array_index_by_id(data,id) != -1: + print_debug("Tried to add an existing id to an array") + return + data.append({"id": id}) + Helper.json_helper.write_json_file(get_data_directory(data),JSON.stringify(data)) + else: + if id in data: + print_debug("Tried to add an existing file to a file array") + return + data.append(id) + #Create a new json file in the directory with only {} in the file + Helper.json_helper.create_new_json_file(get_data_directory(data) + id, false) + # Will remove an item from the data # If the first item in data is a dictionary, we remove an item that has the provided id From 143a3badb940101029e4ddc88ce2432259d15ecd Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 10 Dec 2023 23:05:18 +0100 Subject: [PATCH 033/138] Initial version of mob editor --- Mods/Core/Mobs/Mobs.json | 2 +- Mods/Core/Mobs/scrapwalker64.png | Bin 0 -> 5431 bytes Mods/Core/Mobs/scrapwalker64.png.import | 34 ++++++++++++++++++ .../Custom_Editors/MobEditor.tscn | 4 ++- .../Custom_Editors/Scripts/MobEditor.gd | 32 ++++++++--------- .../Scripts/Scrolling_Flow_Container.gd | 2 +- .../Custom_Widgets/Sprite_Selector_Popup.tscn | 6 +++- Scenes/ContentManager/Scripts/content_list.gd | 3 -- 8 files changed, 60 insertions(+), 23 deletions(-) create mode 100644 Mods/Core/Mobs/scrapwalker64.png create mode 100644 Mods/Core/Mobs/scrapwalker64.png.import diff --git a/Mods/Core/Mobs/Mobs.json b/Mods/Core/Mobs/Mobs.json index 0637a088..9a4ce3ca 100644 --- a/Mods/Core/Mobs/Mobs.json +++ b/Mods/Core/Mobs/Mobs.json @@ -1 +1 @@ -[] \ No newline at end of file +[{"description":"A small robot","health":"100","hearing_range":"1000","id":"scrapwalker","idle_move_speed":"0.5","imagePath":"res://./Mods/Core/Mobs/scrapwalker64.png","melee_damage":"20","melee_range":"20","move_speed":"1","name":"Scrap walker","sense_range":"50","sight_range":"200"}] \ No newline at end of file diff --git a/Mods/Core/Mobs/scrapwalker64.png b/Mods/Core/Mobs/scrapwalker64.png new file mode 100644 index 0000000000000000000000000000000000000000..f074fd02998250328172c74dac7a987e46976773 GIT binary patch literal 5431 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 literal 0 HcmV?d00001 diff --git a/Mods/Core/Mobs/scrapwalker64.png.import b/Mods/Core/Mobs/scrapwalker64.png.import new file mode 100644 index 00000000..76e7547d --- /dev/null +++ b/Mods/Core/Mobs/scrapwalker64.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ft533nal0bbc" +path="res://.godot/imported/scrapwalker64.png-04b94deaac0c6a440b0f7db25c7d78a5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Mobs/scrapwalker64.png" +dest_files=["res://.godot/imported/scrapwalker64.png-04b94deaac0c6a440b0f7db25c7d78a5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Scenes/ContentManager/Custom_Editors/MobEditor.tscn b/Scenes/ContentManager/Custom_Editors/MobEditor.tscn index ae8e3a2c..4de4efc3 100644 --- a/Scenes/ContentManager/Custom_Editors/MobEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/MobEditor.tscn @@ -4,7 +4,7 @@ [ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_woy6i"] [ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="3_847a0"] -[node name="MobEditor" type="Control" node_paths=PackedStringArray("mobImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "mobSelector", "melee_damage_numedit", "melee_range_numedit", "moveSpeed_numedit", "idle_move_speed_numedit", "sightRange_numedit", "senseRange_numedit", "hearingRange_numedit")] +[node name="MobEditor" type="Control" node_paths=PackedStringArray("mobImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "mobSelector", "melee_damage_numedit", "melee_range_numedit", "health_numedit", "moveSpeed_numedit", "idle_move_speed_numedit", "sightRange_numedit", "senseRange_numedit", "hearingRange_numedit")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -20,6 +20,7 @@ DescriptionTextEdit = NodePath("VBoxContainer/FormGrid/DescriptionTextEdit") mobSelector = NodePath("Sprite_selector") melee_damage_numedit = NodePath("VBoxContainer/FormGrid/MeleeDamageSpinBox") melee_range_numedit = NodePath("VBoxContainer/FormGrid/MeleeRangeSpinbox") +health_numedit = NodePath("VBoxContainer/FormGrid/HealthSpinBox") moveSpeed_numedit = NodePath("VBoxContainer/FormGrid/MoveSpeedSpinBox") idle_move_speed_numedit = NodePath("VBoxContainer/FormGrid/IdleMoveSpeedSpinBox") sightRange_numedit = NodePath("VBoxContainer/FormGrid/SightRangeSpinBox") @@ -104,6 +105,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 size_flags_stretch_ratio = 0.9 +focus_next = NodePath("../HealthSpinBox") focus_previous = NodePath("../NameTextEdit") placeholder_text = "A very dangerous land animal often found in dry climates" diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd index 1374a639..e88331ff 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd @@ -48,21 +48,21 @@ func load_mob_data() -> void: if DescriptionTextEdit != null and item.has("description"): DescriptionTextEdit.text = item["description"] if melee_damage_numedit != null and item.has("melee_damage"): - melee_damage_numedit.text = item["melee_damage"] + melee_damage_numedit.get_line_edit().text = item["melee_damage"] if melee_range_numedit != null and item.has("melee_range"): - melee_damage_numedit.text = item["melee_range"] + melee_damage_numedit.get_line_edit().text = item["melee_range"] if health_numedit != null and item.has("health"): - health_numedit.text = item["health"] + health_numedit.get_line_edit().text = item["health"] if moveSpeed_numedit != null and item.has("move_speed"): - moveSpeed_numedit.text = item["move_speed"] + moveSpeed_numedit.get_line_edit().text = item["move_speed"] if idle_move_speed_numedit != null and item.has("idle_move_speed"): - idle_move_speed_numedit.text = item["idle_move_speed"] + idle_move_speed_numedit.get_line_edit().text = item["idle_move_speed"] if sightRange_numedit != null and item.has("sight_range"): - sightRange_numedit.text = item["sight_range"] + sightRange_numedit.get_line_edit().text = item["sight_range"] if senseRange_numedit != null and item.has("sense_range"): - senseRange_numedit.text = item["sense_range"] + senseRange_numedit.get_line_edit().text = item["sense_range"] if hearingRange_numedit != null and item.has("hearing_range"): - hearingRange_numedit.text = item["hearing_range"] + hearingRange_numedit.get_line_edit().text = item["hearing_range"] break @@ -82,14 +82,14 @@ func _on_save_button_button_up() -> void: item["imagePath"] = mobImageDisplay.texture.resource_path item["name"] = NameTextEdit.text item["description"] = DescriptionTextEdit.text - item["melee_damage"] = melee_damage_numedit.text - item["melee_range"] = melee_damage_numedit.text - item["health"] = health_numedit.text - item["move_speed"] = moveSpeed_numedit.text - item["idle_move_speed"] = idle_move_speed_numedit.text - item["sight_range"] = sightRange_numedit.text - item["sense_range"] = senseRange_numedit.text - item["hearing_range"] = hearingRange_numedit.text + item["melee_damage"] = melee_damage_numedit.get_line_edit().text + item["melee_range"] = melee_damage_numedit.get_line_edit().text + item["health"] = health_numedit.get_line_edit().text + item["move_speed"] = moveSpeed_numedit.get_line_edit().text + item["idle_move_speed"] = idle_move_speed_numedit.get_line_edit().text + item["sight_range"] = sightRange_numedit.get_line_edit().text + item["sense_range"] = senseRange_numedit.get_line_edit().text + item["hearing_range"] = hearingRange_numedit.get_line_edit().text break file = FileAccess.open(contentSource, FileAccess.WRITE) diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd index 90e3e78f..80831bf1 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Scrolling_Flow_Container.gd @@ -8,7 +8,7 @@ extends Control @export var contentItems: FlowContainer = null @export var collapseButton: Button = null var is_collapsed: bool = false -var header: String = "Items": +@export var header: String = "Items": set(newName): header = newName if newName == "": diff --git a/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn b/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn index 1ae6eed3..fcdf5f23 100644 --- a/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn +++ b/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn @@ -26,10 +26,11 @@ size_flags_vertical = 3 [node name="Label" type="Label" parent="VBoxContainer"] layout_mode = 2 -text = "Select a tile" +text = "Select a sprite" [node name="Scrolling_Flow_Container" parent="VBoxContainer" instance=ExtResource("3_nkgi6")] layout_mode = 2 +header = "" [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] layout_mode = 2 @@ -45,3 +46,6 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 0 text = "Cancel" + +[connection signal="button_up" from="VBoxContainer/HBoxContainer/OK" to="." method="_on_ok_button_up"] +[connection signal="button_up" from="VBoxContainer/HBoxContainer/Cancel" to="." method="_on_cancel_button_up"] diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 95316dc1..9e06b94e 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -122,9 +122,6 @@ func _on_ok_button_up(): var myText = popup_textedit.text if myText == "": return; - if contentdata.is_empty(): - print_debug("Tried to add a new item to contentlist, but contentdata is empty") - return if popupAction == "Add": Gamedata.add_id_to_data(contentdata, myText) if popupAction == "Duplicate": From e5632c02ececbdeeab4c00bd4b29bd137d1676b5 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 10 Dec 2023 23:12:23 +0100 Subject: [PATCH 034/138] fix map editor bug when creating new map --- Scripts/gamedata.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index b0c065a4..e33f86a3 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -118,7 +118,7 @@ func add_id_to_data(data: Array, id: String): return data.append(id) #Create a new json file in the directory with only {} in the file - Helper.json_helper.create_new_json_file(get_data_directory(data) + id, false) + Helper.json_helper.create_new_json_file(get_data_directory(data) + id + ".json", false) # Will remove an item from the data From 1f37269be8477ec840cd8ae644134637a0aa0afe Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 13 Dec 2023 03:25:21 +0100 Subject: [PATCH 035/138] Refactor editor data management --- Mods/Core/Maps/Generichouse.json | 12319 +++++++++++++++- Mods/Core/Maps/urbanroad.json | 4125 +++++- Mods/Core/Mobs/Mobs.json | 17 +- Mods/Core/Tiles/Tiles.json | 157 +- .../Custom_Editors/Scripts/MobEditor.gd | 118 +- .../Scripts/TerrainTileEditor.gd | 145 +- .../Custom_Editors/TerrainTileEditor.tscn | 59 +- .../Scripts/Selectable_Sprite_Widget.gd | 5 +- .../Scripts/Sprite_Selector_Popup.gd | 9 +- .../Mapeditor/Scripts/GridContainer.gd | 51 +- .../Mapeditor/Scripts/TilebrushList.gd | 10 +- .../Mapeditor/Scripts/mapeditortile.gd | 2 +- .../ContentManager/Mapeditor/mapeditor.tscn | 4 +- .../ContentManager/Scripts/contenteditor.gd | 23 +- Scripts/Helper/json_helper.gd | 2 +- Scripts/gamedata.gd | 13 +- 16 files changed, 16776 insertions(+), 283 deletions(-) diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index 8ac8356c..e95ad28e 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -1 +1,12318 @@ -{ "mapwidth": 32, "mapheight": 32, "levels": [[], [], [], [], [], [], [], [], [], [], [{ "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "woodboards6.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "dirt3.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }, { "texture": "basegrass1.png", "rotation": 0 }], [{ "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "beehive1.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "arcstones1.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "brickroad.png", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }], [{ "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }, { "texture": "", "rotation": 0 }], [], [], [], [], [], [], [], []] } \ No newline at end of file +{ + "levels": [ + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "woodboards6.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "dirt3.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + } + ], + [ + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "beehive1.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "arcstones1.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "brickroad.png" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + } + ], + [ + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + }, + { + "rotation": 0, + "texture": "" + } + ], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "mapheight": 32, + "mapwidth": 32 +} \ No newline at end of file diff --git a/Mods/Core/Maps/urbanroad.json b/Mods/Core/Maps/urbanroad.json index 1d5f05f4..43011e61 100644 --- a/Mods/Core/Maps/urbanroad.json +++ b/Mods/Core/Maps/urbanroad.json @@ -1 +1,4124 @@ -{"levels":[[],[],[],[],[],[],[],[],[],[],[{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_middle_horizontal.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"asphalt_basic.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"2.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"},{"rotation":0,"texture":"basegrass1.png"}],[],[],[],[],[],[],[],[],[],[]],"mapheight":32,"mapwidth":32} \ No newline at end of file +{ + "levels": [ + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_middle_horizontal.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "asphalt_basic.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "2.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + }, + { + "rotation": 0, + "texture": "basegrass1.png" + } + ], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "mapheight": 32, + "mapwidth": 32 +} \ No newline at end of file diff --git a/Mods/Core/Mobs/Mobs.json b/Mods/Core/Mobs/Mobs.json index 9a4ce3ca..0b90d14d 100644 --- a/Mods/Core/Mobs/Mobs.json +++ b/Mods/Core/Mobs/Mobs.json @@ -1 +1,16 @@ -[{"description":"A small robot","health":"100","hearing_range":"1000","id":"scrapwalker","idle_move_speed":"0.5","imagePath":"res://./Mods/Core/Mobs/scrapwalker64.png","melee_damage":"20","melee_range":"20","move_speed":"1","name":"Scrap walker","sense_range":"50","sight_range":"200"}] \ No newline at end of file +[ + { + "description": "A small robot", + "health": "100", + "hearing_range": "1000", + "id": "scrapwalker", + "idle_move_speed": "0.5", + "imagePath": "./Mods/Core/Mobs/scrapwalker64.png", + "melee_damage": "20", + "melee_range": "20", + "move_speed": "1", + "name": "Scrap walker", + "sense_range": "50", + "sight_range": "200" + } +] \ No newline at end of file diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index 40b07392..e2412ba4 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -1 +1,156 @@ -[{"categories":["Ground"],"description":"Field of grass","id":"grass_plain","imagePath":"res://Mods/Core/Tiles/1.png","name":"Plain grass\t"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_00","imagePath":"res://Mods/Core/Tiles/woodboards.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_01","imagePath":"res://Mods/Core/Tiles/woodboards1.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_02","imagePath":"res://Mods/Core/Tiles/woodboards2.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_00","imagePath":"res://Mods/Core/Tiles/woodboards3.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_01","imagePath":"res://Mods/Core/Tiles/woodboards4.png","name":"Low quality wood floor"},{"categories":["Floor"],"description":"The floor is old and the boards are crooked","id":"floor_wood_shabby_dark_02","imagePath":"res://Mods/Core/Tiles/woodboards5.png","name":"Low quality wood floor"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on","id":"road_asphalt_basic","imagePath":"res://Mods/Core/Tiles/asphalt_basic.png","name":"Basic asphalt road"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has diagonal markings","id":"road_asphalt_diagonal","imagePath":"res://Mods/Core/Tiles/asphalt_diag_middle.png","name":"Asphalt road with diagonal markings"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has markings indicating a west turn","id":"road_asphalt_turn_west","imagePath":"res://Mods/Core/Tiles/asphalt_horizontal_middle_downleft.png","name":"Asphalt road with markings turning west"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has markings indicating a east turn","id":"road_asphalt_turn_east","imagePath":"res://Mods/Core/Tiles/asphalt_horizontal_middle_upright.png","name":"Asphalt road with markings turning east"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has vertical markings","id":"road_asphalt_vertical","imagePath":"res://Mods/Core/Tiles/asphalt_middle.png","name":"Asphalt road with vertical markings"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has markings indicating a north turn","id":"road_asphalt_turn_north","imagePath":"res://Mods/Core/Tiles/asphalt_middle_downleft.png","name":"Asphalt road with markings turning north"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has horizontal markings","id":"road_asphalt_horizontal","imagePath":"res://Mods/Core/Tiles/asphalt_middle_horizontal.png","name":"Asphalt road with horizontal markings"},{"categories":["Road"],"description":"A smooth surface for vehicles to drive on. It has markings indicating a south turn","id":"road_asphalt_turn_south","imagePath":"res://Mods/Core/Tiles/asphalt_middle_upright.png","name":"Asphalt road with markings turning south"},{"categories":["Floor","Urban"],"description":"A stone floor wihere the stones are shaped like an arch. Used in an urban environement.","id":"arc_stones_floor","imagePath":"res://Mods/Core/Tiles/arcstones.png","name":"Arc stones floor"},{"categories":["Ground"],"description":"Field of grass","id":"grass_plain_01","imagePath":"res://Mods/Core/Tiles/basegrass1.png","name":"Plain grass\t"}] \ No newline at end of file +[ + { + "categories": [ + "Ground" + ], + "description": "Field of grass", + "id": "grass_plain", + "imagePath": "./Mods/Core/Tiles/1.png", + "name": "Plain grass" + }, + { + "categories": [ + "Floor" + ], + "description": "The floor is old and the boards are crooked", + "id": "floor_wood_shabby_00", + "imagePath": "./Mods/Core/Tiles/woodboards.png", + "name": "Low quality wood floor" + }, + { + "categories": [ + "Floor" + ], + "description": "The floor is old and the boards are crooked", + "id": "floor_wood_shabby_01", + "imagePath": "./Mods/Core/Tiles/woodboards1.png", + "name": "Low quality wood floor" + }, + { + "categories": [ + "Floor" + ], + "description": "The floor is old and the boards are crooked", + "id": "floor_wood_shabby_02", + "imagePath": "./Mods/Core/Tiles/woodboards2.png", + "name": "Low quality wood floor" + }, + { + "categories": [ + "Floor" + ], + "description": "The floor is old and the boards are crooked", + "id": "floor_wood_shabby_dark_00", + "imagePath": "./Mods/Core/Tiles/woodboards3.png", + "name": "Low quality wood floor" + }, + { + "categories": [ + "Floor" + ], + "description": "The floor is old and the boards are crooked", + "id": "floor_wood_shabby_dark_01", + "imagePath": "./Mods/Core/Tiles/woodboards4.png", + "name": "Low quality wood floor" + }, + { + "categories": [ + "Floor" + ], + "description": "The floor is old and the boards are crooked", + "id": "floor_wood_shabby_dark_02", + "imagePath": "./Mods/Core/Tiles/woodboards5.png", + "name": "Low quality wood floor" + }, + { + "categories": [ + "Road" + ], + "description": "A smooth surface for vehicles to drive on", + "id": "road_asphalt_basic", + "imagePath": "./Mods/Core/Tiles/asphalt_basic.png", + "name": "Basic asphalt road" + }, + { + "categories": [ + "Road" + ], + "description": "A smooth surface for vehicles to drive on. It has diagonal markings", + "id": "road_asphalt_diagonal", + "imagePath": "./Mods/Core/Tiles/asphalt_diag_middle.png", + "name": "Asphalt road with diagonal markings" + }, + { + "categories": [ + "Road" + ], + "description": "A smooth surface for vehicles to drive on. It has markings indicating a west turn", + "id": "road_asphalt_turn_west", + "imagePath": "./Mods/Core/Tiles/asphalt_horizontal_middle_downleft.png", + "name": "Asphalt road with markings turning west" + }, + { + "categories": [ + "Road" + ], + "description": "A smooth surface for vehicles to drive on. It has markings indicating a east turn", + "id": "road_asphalt_turn_east", + "imagePath": "./Mods/Core/Tiles/asphalt_horizontal_middle_upright.png", + "name": "Asphalt road with markings turning east" + }, + { + "categories": [ + "Road" + ], + "description": "A smooth surface for vehicles to drive on. It has vertical markings", + "id": "road_asphalt_vertical", + "imagePath": "./Mods/Core/Tiles/asphalt_middle.png", + "name": "Asphalt road with vertical markings" + }, + { + "categories": [ + "Road" + ], + "description": "A smooth surface for vehicles to drive on. It has markings indicating a north turn", + "id": "road_asphalt_turn_north", + "imagePath": "./Mods/Core/Tiles/asphalt_middle_downleft.png", + "name": "Asphalt road with markings turning north" + }, + { + "categories": [ + "Road" + ], + "description": "A smooth surface for vehicles to drive on. It has horizontal markings", + "id": "road_asphalt_horizontal", + "imagePath": "./Mods/Core/Tiles/asphalt_middle_horizontal.png", + "name": "Asphalt road with horizontal markings" + }, + { + "categories": [ + "Road" + ], + "description": "A smooth surface for vehicles to drive on. It has markings indicating a south turn", + "id": "road_asphalt_turn_south", + "imagePath": "./Mods/Core/Tiles/asphalt_middle_upright.png", + "name": "Asphalt road with markings turning south" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A stone floor wihere the stones are shaped like an arch. Used in an urban environement.", + "id": "arc_stones_floor", + "imagePath": "./Mods/Core/Tiles/arcstones.png", + "name": "Arc stones floor" + }, + { + "categories": [ + "Ground" + ], + "description": "Field of grass", + "id": "grass_plain_01", + "imagePath": "./Mods/Core/Tiles/basegrass1.png", + "name": "Plain grass" + } +] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd index e88331ff..c9875ec1 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd @@ -19,51 +19,47 @@ extends Control @export var sightRange_numedit: SpinBox @export var senseRange_numedit: SpinBox @export var hearingRange_numedit: SpinBox +# This signal will be emitted when the user presses the save button +# This signal should alert Gamedata that the mob data array should be saved to disk +# The content editor has connected this signal to Gamedata already +signal data_changed() -#The JSON file to be edited -var contentSource: String = "": +# The data that represents this mob +# The data is selected from the Gamedata.all_mobs array +# based on the ID that the user has selected in the content editor +var contentData: Dictionary = {}: set(value): - contentSource = value + contentData = value load_mob_data() - mobSelector.sprites_dictionary = Gamedata.mob_materials + mobSelector.sprites_collection = Gamedata.mob_materials -#This function will find an item in the contentSource JSOn file with an iD that is equal to self.name -#If an item is found, it will set all the elements in the editor with the corresponding values +#This function update the form based on the contentData that has been loaded func load_mob_data() -> void: - if not FileAccess.file_exists(contentSource): - return - - var file = FileAccess.open(contentSource, FileAccess.READ) - var data = JSON.parse_string(file.get_as_text()) - file.close() - - for item in data: - if item["id"] == self.name: - if mobImageDisplay != null and item.has("imagePath"): - mobImageDisplay.texture = load(item["imagePath"]) - if IDTextLabel != null: - IDTextLabel.text = str(item["id"]) - if NameTextEdit != null and item.has("name"): - NameTextEdit.text = item["name"] - if DescriptionTextEdit != null and item.has("description"): - DescriptionTextEdit.text = item["description"] - if melee_damage_numedit != null and item.has("melee_damage"): - melee_damage_numedit.get_line_edit().text = item["melee_damage"] - if melee_range_numedit != null and item.has("melee_range"): - melee_damage_numedit.get_line_edit().text = item["melee_range"] - if health_numedit != null and item.has("health"): - health_numedit.get_line_edit().text = item["health"] - if moveSpeed_numedit != null and item.has("move_speed"): - moveSpeed_numedit.get_line_edit().text = item["move_speed"] - if idle_move_speed_numedit != null and item.has("idle_move_speed"): - idle_move_speed_numedit.get_line_edit().text = item["idle_move_speed"] - if sightRange_numedit != null and item.has("sight_range"): - sightRange_numedit.get_line_edit().text = item["sight_range"] - if senseRange_numedit != null and item.has("sense_range"): - senseRange_numedit.get_line_edit().text = item["sense_range"] - if hearingRange_numedit != null and item.has("hearing_range"): - hearingRange_numedit.get_line_edit().text = item["hearing_range"] - break + if mobImageDisplay != null and contentData.has("imagePath"): + mobImageDisplay.texture = load(contentData["imagePath"]) + PathTextLabel.text = contentData["imagePath"] + if IDTextLabel != null: + IDTextLabel.text = str(contentData["id"]) + if NameTextEdit != null and contentData.has("name"): + NameTextEdit.text = contentData["name"] + if DescriptionTextEdit != null and contentData.has("description"): + DescriptionTextEdit.text = contentData["description"] + if melee_damage_numedit != null and contentData.has("melee_damage"): + melee_damage_numedit.get_line_edit().text = contentData["melee_damage"] + if melee_range_numedit != null and contentData.has("melee_range"): + melee_damage_numedit.get_line_edit().text = contentData["melee_range"] + if health_numedit != null and contentData.has("health"): + health_numedit.get_line_edit().text = contentData["health"] + if moveSpeed_numedit != null and contentData.has("move_speed"): + moveSpeed_numedit.get_line_edit().text = contentData["move_speed"] + if idle_move_speed_numedit != null and contentData.has("idle_move_speed"): + idle_move_speed_numedit.get_line_edit().text = contentData["idle_move_speed"] + if sightRange_numedit != null and contentData.has("sight_range"): + sightRange_numedit.get_line_edit().text = contentData["sight_range"] + if senseRange_numedit != null and contentData.has("sense_range"): + senseRange_numedit.get_line_edit().text = contentData["sense_range"] + if hearingRange_numedit != null and contentData.has("hearing_range"): + hearingRange_numedit.get_line_edit().text = contentData["hearing_range"] #The editor is closed, destroy the instance @@ -71,31 +67,23 @@ func load_mob_data() -> void: func _on_close_button_button_up() -> void: queue_free() -#This function takes all data fro the form elements and writes it to the contentSource JSON file. +# This function takes all data fro the form elements stores them in the contentData +# Since contentData is a reference to an item in Gamedata.all_mobs +# the central array for mobdata is updated with the changes as well +# The function will signal to Gamedata that the data has changed and needs to be saved func _on_save_button_button_up() -> void: - var file = FileAccess.open(contentSource, FileAccess.READ_WRITE) - var data = JSON.parse_string(file.get_as_text()) - file.close() - - for item in data: - if item["id"] == IDTextLabel.text: - item["imagePath"] = mobImageDisplay.texture.resource_path - item["name"] = NameTextEdit.text - item["description"] = DescriptionTextEdit.text - item["melee_damage"] = melee_damage_numedit.get_line_edit().text - item["melee_range"] = melee_damage_numedit.get_line_edit().text - item["health"] = health_numedit.get_line_edit().text - item["move_speed"] = moveSpeed_numedit.get_line_edit().text - item["idle_move_speed"] = idle_move_speed_numedit.get_line_edit().text - item["sight_range"] = sightRange_numedit.get_line_edit().text - item["sense_range"] = senseRange_numedit.get_line_edit().text - item["hearing_range"] = hearingRange_numedit.get_line_edit().text - break - - file = FileAccess.open(contentSource, FileAccess.WRITE) - file.store_string(JSON.stringify(data)) - file.close() - + contentData["imagePath"] = PathTextLabel.text + contentData["name"] = NameTextEdit.text + contentData["description"] = DescriptionTextEdit.text + contentData["melee_damage"] = melee_damage_numedit.get_line_edit().text + contentData["melee_range"] = melee_damage_numedit.get_line_edit().text + contentData["health"] = health_numedit.get_line_edit().text + contentData["move_speed"] = moveSpeed_numedit.get_line_edit().text + contentData["idle_move_speed"] = idle_move_speed_numedit.get_line_edit().text + contentData["sight_range"] = sightRange_numedit.get_line_edit().text + contentData["sense_range"] = senseRange_numedit.get_line_edit().text + contentData["hearing_range"] = hearingRange_numedit.get_line_edit().text + data_changed.emit() #When the mobImageDisplay is clicked, the user will be prompted to select an image from # "res://Mods/Core/mobs/". The texture of the mobImageDisplay will change to the selected image @@ -107,4 +95,4 @@ func _on_mob_image_display_gui_input(event) -> void: func _on_sprite_selector_sprite_selected_ok(clicked_sprite) -> void: var mobTexture: Resource = clicked_sprite.get_texture() mobImageDisplay.texture = mobTexture - PathTextLabel.text = mobTexture.resource_path + PathTextLabel.text = mobTexture.resource_path.replace("res://","") diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd index 57866cd5..de992e09 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd @@ -6,8 +6,7 @@ extends Control #To load data, provide the name of the tile data file and an ID -@onready var tileBrush: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/tilebrush.tscn") - +@export var tileBrush: PackedScene @export var tileImageDisplay: TextureRect = null @export var IDTextLabel: Label = null @export var NameTextEdit: TextEdit = null @@ -16,65 +15,51 @@ extends Control @export var tileSelector: Popup = null @export var tileBrushList: HFlowContainer = null @export var tilePathStringLabel: Label = null - -#The JSON file to be edited -var contentSource: String = "": +# This signal will be emitted when the user presses the save button +# This signal should alert Gamedata that the tile data array should be saved to disk +# The content editor has connected this signal to Gamedata already +signal data_changed() + +# The data that represents this tile +# The data is selected from the Gamedata.all_tiles array +# based on the ID that the user has selected in the content editor +var contentData: Dictionary = {}: set(value): - contentSource = value + contentData = value load_tile_data() - load_Brush_List() + tileSelector.sprites_collection = Gamedata.tile_materials -#This function will find an item in the contentSource JSOn file with an iD that is equal to self.name -#If an item is found, it will set all the elements in the editor with the corresponding values +# This function updates the form based on the contentData that has been loaded func load_tile_data(): - if not FileAccess.file_exists(contentSource): - return - - var file = FileAccess.open(contentSource, FileAccess.READ) - var data = JSON.parse_string(file.get_as_text()) - file.close() - - for item in data: - if item["id"] == self.name: - if tileImageDisplay != null and item.has("imagePath"): - tileImageDisplay.texture = load(item["imagePath"]) - tilePathStringLabel.text = item["imagePath"] - if IDTextLabel != null: - IDTextLabel.text = str(item["id"]) - if NameTextEdit != null and item.has("name"): - NameTextEdit.text = item["name"] - if DescriptionTextEdit != null and item.has("description"): - DescriptionTextEdit.text = item["description"] - if CategoriesList != null and item.has("categories"): - CategoriesList.clear_list() - for category in item["categories"]: - CategoriesList.add_item_to_list(category) - break - + if tileImageDisplay != null and contentData.has("imagePath"): + tileImageDisplay.texture = load(contentData["imagePath"]) + tilePathStringLabel.text = contentData["imagePath"] + if IDTextLabel != null: + IDTextLabel.text = str(contentData["id"]) + if NameTextEdit != null and contentData.has("name"): + NameTextEdit.text = contentData["name"] + if DescriptionTextEdit != null and contentData.has("description"): + DescriptionTextEdit.text = contentData["description"] + if CategoriesList != null and contentData.has("categories"): + CategoriesList.clear_list() + for category in contentData["categories"]: + CategoriesList.add_item_to_list(category) #The editor is closed, destroy the instance #TODO: Check for unsaved changes func _on_close_button_button_up(): queue_free() -#This function takes all data fro the form elements and writes it to the contentSource JSON file. +# This function takes all data fro the form elements stores them in the contentData +# Since contentData is a reference to an item in Gamedata.all_tiles +# the central array for tiledata is updated with the changes as well +# The function will signal to Gamedata that the data has changed and needs to be saved func _on_save_button_button_up(): - var file = FileAccess.open(contentSource, FileAccess.READ_WRITE) - var data = JSON.parse_string(file.get_as_text()) - file.close() - - for item in data: - if item["id"] == IDTextLabel.text: - item["imagePath"] = tileImageDisplay.texture.resource_path - item["name"] = NameTextEdit.text - item["description"] = DescriptionTextEdit.text - item["categories"] = CategoriesList.get_items() - break - - file = FileAccess.open(contentSource, FileAccess.WRITE) - file.store_string(JSON.stringify(data)) - file.close() - + contentData["imagePath"] = tilePathStringLabel.text + contentData["name"] = NameTextEdit.text + contentData["description"] = DescriptionTextEdit.text + contentData["categories"] = CategoriesList.get_items() + data_changed.emit() #When the tileImageDisplay is clicked, the user will be prompted to select an image from # "res://Mods/Core/Tiles/". The texture of the tileImageDisplay will change to the selected image @@ -82,58 +67,8 @@ func _on_tile_image_display_gui_input(event): if event is InputEventMouseButton and event.pressed: tileSelector.show() - -# this function will read all files in "res://Mods/Core/Tiles/" and for each file it will create a texturerect and assign the file as the texture of the texturerect. Then it will add the texturerect as a child to $HSplitContainer/EntitiesContainer/TilesList -func load_Brush_List(): - var tilesDir = "res://Mods/Core/Tiles/" - - var dir = DirAccess.open(tilesDir) - if dir: - dir.list_dir_begin() - var file_name = dir.get_next() - while file_name != "": - var extension = file_name.get_extension() - - if !dir.current_is_dir(): - if extension == "png": - # Create a TextureRect node - var brushInstance = tileBrush.instantiate() - - # Load the texture from file - var texture: Resource = load(tilesDir + file_name) - - # Assign the texture to the TextureRect - brushInstance.set_tile_texture(texture) - brushInstance.set_meta("path", tilesDir + file_name) - brushInstance.tilebrush_clicked.connect(tilebrush_clicked) - - # Add the TextureRect as a child to the TilesList - tileBrushList.add_child(brushInstance) - file_name = dir.get_next() - else: - print_debug("An error occurred when trying to access the path.") - dir.list_dir_end() - -#Called after the user selects a tile in the popup textbox and presses OK -func _on_ok_button_up(): - tileSelector.hide() - var children = tileBrushList.get_children() - for child in children: - if child.selected: - tileImageDisplay.texture = load(child.get_meta("path")) - tilePathStringLabel.text = child.get_meta("path") - -#Called after the users presses cancel on the popup asking for a tile -func _on_cancel_button_up(): - tileSelector.hide() - -func deselect_all_brushes(): - var children = tileBrushList.get_children() - for child in children: - child.set_selected(false) - -#Mark the clicked tilebrush as selected, but only after deselecting all other brushes -func tilebrush_clicked(tilebrush: Control) -> void: - deselect_all_brushes() - # If the clicked brush was not select it, we select it. Otherwise we deselect it - tilebrush.set_selected(true) +func _on_sprite_selector_sprite_selected_ok(clicked_sprite) -> void: + var tileTexture: Resource = clicked_sprite.get_texture() + tileImageDisplay.texture = tileTexture + var imagepath: String = tileTexture.resource_path + tilePathStringLabel.text = imagepath.replace("res://", "") diff --git a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn index cded26a1..c809488f 100644 --- a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn @@ -1,10 +1,12 @@ -[gd_scene load_steps=4 format=3 uid="uid://vfj2if40vf10"] +[gd_scene load_steps=6 format=3 uid="uid://vfj2if40vf10"] [ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd" id="1_wp6ou"] +[ext_resource type="PackedScene" uid="uid://cccnrdolr1bfo" path="res://Scenes/ContentManager/Mapeditor/tilebrush.tscn" id="2_djlno"] [ext_resource type="PackedScene" uid="uid://b8i6wfk3fngy4" path="res://Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn" id="2_erosr"] [ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_x7b0a"] +[ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="5_5ngda"] -[node name="TerrainTileEditor" type="Control" node_paths=PackedStringArray("tileImageDisplay", "IDTextLabel", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "tileSelector", "tileBrushList", "tilePathStringLabel")] +[node name="TerrainTileEditor" type="Control" node_paths=PackedStringArray("tileImageDisplay", "IDTextLabel", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "tileSelector", "tilePathStringLabel")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -12,13 +14,13 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_wp6ou") +tileBrush = ExtResource("2_djlno") tileImageDisplay = NodePath("VBoxContainer/FormGrid/TileImageDisplay") IDTextLabel = NodePath("VBoxContainer/FormGrid/IDTextLabel") NameTextEdit = NodePath("VBoxContainer/FormGrid/NameTextEdit") DescriptionTextEdit = NodePath("VBoxContainer/FormGrid/DescriptionTextEdit") CategoriesList = NodePath("VBoxContainer/FormGrid/Editable_Item_List") -tileSelector = NodePath("Tile_selector") -tileBrushList = NodePath("Tile_selector/VBoxContainer/ScrollContainer/TilebrushList") +tileSelector = NodePath("Sprite_selector") tilePathStringLabel = NodePath("VBoxContainer/FormGrid/PathString") [node name="VBoxContainer" type="VBoxContainer" parent="."] @@ -108,53 +110,10 @@ size_flags_horizontal = 3 size_flags_vertical = 3 header = "Categories" -[node name="Tile_selector" type="Popup" parent="."] -title = "Input ID" -initial_position = 2 -size = Vector2i(400, 400) -unresizable = false -borderless = false - -[node name="VBoxContainer" type="VBoxContainer" parent="Tile_selector"] -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 - -[node name="Label" type="Label" parent="Tile_selector/VBoxContainer"] -layout_mode = 2 -text = "Select a tile" - -[node name="ScrollContainer" type="ScrollContainer" parent="Tile_selector/VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="TilebrushList" type="HFlowContainer" parent="Tile_selector/VBoxContainer/ScrollContainer"] -clip_contents = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="HBoxContainer" type="HBoxContainer" parent="Tile_selector/VBoxContainer"] -layout_mode = 2 - -[node name="OK" type="Button" parent="Tile_selector/VBoxContainer/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 0 -text = "Ok" - -[node name="Cancel" type="Button" parent="Tile_selector/VBoxContainer/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 0 -text = "Cancel" +[node name="Sprite_selector" parent="." instance=ExtResource("5_5ngda")] +visible = false [connection signal="button_up" from="VBoxContainer/HBoxContainer/CloseButton" to="." method="_on_close_button_button_up"] [connection signal="button_up" from="VBoxContainer/HBoxContainer/SaveButton" to="." method="_on_save_button_button_up"] [connection signal="gui_input" from="VBoxContainer/FormGrid/TileImageDisplay" to="." method="_on_tile_image_display_gui_input"] -[connection signal="button_up" from="Tile_selector/VBoxContainer/HBoxContainer/OK" to="." method="_on_ok_button_up"] -[connection signal="button_up" from="Tile_selector/VBoxContainer/HBoxContainer/Cancel" to="." method="_on_cancel_button_up"] +[connection signal="sprite_selected_ok" from="Sprite_selector" to="." method="_on_sprite_selector_sprite_selected_ok"] diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd index d03707e7..4ed91823 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd @@ -9,7 +9,10 @@ func _on_texture_rect_gui_input(event): selectableSprite_clicked.emit(self) func set_sprite_texture(res: Resource) -> void: - $SpriteImage.texture = res + if res is BaseMaterial3D: + $SpriteImage.texture = res.albedo_texture + else: + $SpriteImage.texture = res func get_texture() -> Resource: return $SpriteImage.texture diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd index 8492a866..f46f11c6 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd @@ -16,9 +16,9 @@ extends Popup var instanced_sprites: Array[Node] = [] # The parent control has to provide a dictionary. This dictionary # contains a list of textures with the name of the texture as a key -var sprites_dictionary: Dictionary = {}: +var sprites_collection: Dictionary = {}: set(value): - sprites_dictionary = value + sprites_collection = value populate_sprite_list() # Reference to one of the selectable_Sprite_Widgets that the user has selected var selectedSprite: Control = null @@ -30,8 +30,8 @@ signal sprite_selected_ok(clicked_sprite: Control) # selectable_Sprite_Widget and assign the file as the texture of the selectable_Sprite_Widget. # Then it will add the selectable_Sprite_Widget as a child to spriteList func populate_sprite_list(): - for filename in sprites_dictionary.keys(): - var material = sprites_dictionary[filename] + for filename in sprites_collection.keys(): + var material = sprites_collection[filename] var selectableSpriteInstance = selectable_Sprite_Widget.instantiate() # Assign the texture to the TextureRect selectableSpriteInstance.set_sprite_texture(material) @@ -39,7 +39,6 @@ func populate_sprite_list(): spriteList.add_content_item(selectableSpriteInstance) instanced_sprites.append(selectableSpriteInstance) -# # Called after the user selects a tile in the popup textbox and presses OK func _on_ok_button_up(): hide() diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index bbcb1ed4..4b195b5c 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -1,5 +1,5 @@ extends GridContainer -@onready var tileScene: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/mapeditortile.tscn") +@export var tileScene: PackedScene #This is the index of the level we are on. 0 is ground level. can be -10 to +10 var currentLevel: int = 10 #Contains the data of every tile in the current level, the ground level or level 0 by default @@ -35,7 +35,6 @@ func _on_mapeditor_ready(): levelgrid_below.hide() levelgrid_above.hide() - # This function will fill fill this GridContainer with a grid of 32x32 instances of "res://Scenes/ContentManager/Mapeditor/mapeditortile.tscn" func createTiles(): for x in range(mapEditor.mapWidth): @@ -50,7 +49,6 @@ func createTiles(): tileAbove.set_clickable(false) levelgrid_above.add_child(tileAbove) - var start_point = Vector2() var end_point = Vector2() var is_drawing = false @@ -89,7 +87,7 @@ func _input(event): paint_in_rectangle() else: is_drawing = false - + #When the users presses and holds the mouse wheel, we scoll the grid if event is InputEventMouseMotion: if is_drawing: @@ -106,7 +104,7 @@ func update_rectangle(): #When one of the grid tiles is clicked, we paint the tile accordingly func grid_tile_clicked(clicked_tile): paint_single_tile(clicked_tile) - + #We paint a single tile if draw rectangle is not selected # Either erase the tile or paint it if a brush is selected. func paint_single_tile(clicked_tile): @@ -116,14 +114,14 @@ func paint_single_tile(clicked_tile): clicked_tile.set_default() elif selected_brush: clicked_tile.set_texture(selected_brush.get_texture()) - + #When this function is called, loop over all the TileGrid's children and get the tileData property. Store this data in the currentLevelData array func storeLevelData(): currentLevelData.clear() for child in get_children(): currentLevelData.append(child.tileData) mapData.levels[currentLevel] = currentLevelData.duplicate() - + #Loads the leveldata from the mapdata #If no data exists, use the default to create a new map func loadLevelData(newLevel: int): @@ -140,7 +138,7 @@ func loadLevelData(newLevel: int): else: levelgrid_above.hide() loadLevel(newLevel, self) - + func loadLevel(level: int, grid: GridContainer): if mapData.is_empty(): print_debug("Tried to load data from an empty mapData dictionary") @@ -171,7 +169,7 @@ func change_level(newlevel: int) -> void: # We need to add 10 since the scrollbar starts at -10 func _on_level_scrollbar_value_changed(value): change_level(10+0-value) - + #This function takes two coordinates representing a rectangle. It will check which of the TileGrid's children's position falls inside this rectangle. It returns all the child tiles that fall inside this rectangle func get_tiles_in_rectangle(rect_start: Vector2, rect_end: Vector2) -> Array: var tiles_in_rectangle: Array = [] @@ -180,17 +178,17 @@ func get_tiles_in_rectangle(rect_start: Vector2, rect_end: Vector2) -> Array: if tile.global_position.y >= rect_start.y-(1*mapEditor.zoom_level) and tile.global_position.y <= rect_end.y: tiles_in_rectangle.append(tile) return tiles_in_rectangle - + func unhighlight_tiles(): for tile in get_children(): tile.unhighlight() - + func highlight_tiles_in_rect(): unhighlight_tiles() var tiles: Array = get_tiles_in_rectangle(start_point, end_point) for tile in tiles: tile.highlight() - + #Paint every tile in the selected rectangle #We always erase if erase is selected, even if no brush is selected #Only paint if a brush is selected and erase is false @@ -213,7 +211,7 @@ func _on_draw_rectangle_toggled(button_pressed): func _on_tilebrush_list_tile_brush_selection_change(tilebrush): selected_brush = tilebrush - + func _on_show_below_toggled(button_pressed): showBelow = button_pressed if showBelow: @@ -227,35 +225,14 @@ func _on_show_above_toggled(button_pressed): levelgrid_above.show() else: levelgrid_above.hide() - - - #This function takes the mapData property and saves all of it as a json file. func save_map_json_file(): # Convert the TileGrid.mapData to a JSON string storeLevelData() - var map_data_json = JSON.stringify(mapData.duplicate()) - - # Save the JSON string to the selected file location - var file = FileAccess.open(mapEditor.contentSource, FileAccess.WRITE) - if file: - file.store_string(map_data_json) - else: - print_debug("Unable to write file " + mapEditor.contentSource) + var map_data_json = JSON.stringify(mapData.duplicate(), "\t") + Helper.json_helper.write_json_file(mapEditor.contentSource, map_data_json) - func load_map_json_file(): var fileToLoad: String = mapEditor.contentSource - if fileToLoad == "": - print_debug("Tried to load mapdata, but mapEditor.contentSource is empty") - return; - # Load the JSON string from the selected file location - var file = FileAccess.open(fileToLoad, FileAccess.READ) - if file: - var map_data_json: Dictionary - map_data_json = JSON.parse_string(file.get_as_text()) - mapData = map_data_json - else: - print_debug("Unable to load file " + fileToLoad) - + mapData = Helper.json_helper.load_json_dictionary_file(fileToLoad) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd index 25c96218..2d3bb916 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd @@ -18,9 +18,7 @@ func _ready(): # this function will read all files in "res://Mods/Core/Tiles/" and for each file it will create a texturerect and assign the file as the texture of the texturerect. Then it will add the texturerect as a child to $HSplitContainer/EntitiesContainer/TilesList func loadTiles(): - var tilesFile = "res://Mods/Core/Tiles/Tiles.json" - var tileList: Array = Helper.json_helper.load_json_array_file(tilesFile) - + var tileList: Array = Gamedata.all_tiles for item in tileList: if item.has("imagePath"): @@ -33,8 +31,10 @@ func loadTiles(): newTilesList = scrolling_Flow_Container.instantiate() newTilesList.header = category add_child(newTilesList) - # Load the texture from file - var texture: Resource = load(item["imagePath"]) + var imagefileName: String = item["imagePath"] + imagefileName = imagefileName.get_file() + # Get the texture from gamedata + var texture: Resource = Gamedata.tile_materials[imagefileName].albedo_texture # Create a TextureRect node var brushInstance = tileBrush.instantiate() # Assign the texture to the TextureRect diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index 9de9cd17..8e7596c5 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -22,7 +22,7 @@ func _on_texture_rect_gui_input(event: InputEvent) -> void: func set_texture(res: Resource) -> void: $TextureRect.texture = res var path: String = res.resource_path - tileData.texture = path.replace("res://Mods/Core/Tiles/","") + tileData.texture = path.get_file() func _on_texture_rect_mouse_entered() -> void: if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 871e3eeb..c2cd8d97 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=10 format=3 uid="uid://d3001f5xxpup1"] +[gd_scene load_steps=11 format=3 uid="uid://d3001f5xxpup1"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd" id="1_0c7s4"] [ext_resource type="PackedScene" uid="uid://bswccbbg6ijep" path="res://Scenes/ContentManager/Mapeditor/Toolbar/mapeditorzoomscroller.tscn" id="1_0ytmu"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd" id="2_sf17m"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/Levelscroller.gd" id="3_i1qbw"] +[ext_resource type="PackedScene" uid="uid://3x0kjiu7lqg7" path="res://Scenes/ContentManager/Mapeditor/mapeditortile.tscn" id="4_lqbjy"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd" id="5_he816"] [ext_resource type="PackedScene" uid="uid://be62h2ytgw2kb" path="res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn" id="6_onaby"] [ext_resource type="PackedScene" uid="uid://cccnrdolr1bfo" path="res://Scenes/ContentManager/Mapeditor/tilebrush.tscn" id="8_o4x7s"] @@ -140,6 +141,7 @@ theme_override_constants/h_separation = 0 theme_override_constants/v_separation = 0 columns = 32 script = ExtResource("2_sf17m") +tileScene = ExtResource("4_lqbjy") mapEditor = NodePath("../../../../../../..") LevelScrollBar = NodePath("../../../../Levelscroller/LevelScrollbar") levelgrid_below = NodePath("../Level_Below") diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index a3b314bb..4e05d63e 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -40,20 +40,29 @@ func _on_content_item_activated(data: Array, itemID: String): print_debug("Tried to load the selected contentitem, but either \ data (Array) or itemID ("+itemID+") is empty") return - var strSource: String = Gamedata.get_data_directory(data) if data == Gamedata.all_tiles: - instantiate_editor(strSource, itemID, terrainTileEditor) + instantiate_editor(data, itemID, terrainTileEditor) if data == Gamedata.all_mobs: - instantiate_editor(strSource, itemID, mobEditor) + instantiate_editor(data, itemID, mobEditor) if data == Gamedata.all_map_files: - instantiate_editor(strSource + itemID + ".json", itemID, mapEditor) + instantiate_editor(data, itemID, mapEditor) #This will add an editor to the content editor tab view. #The editor that should be instantiated is passed trough in the newEditor parameter -#It is important that the editor has the property contentSource so it can be set -func instantiate_editor(strSource: String, itemID: String, newEditor: PackedScene): +#It is important that the editor has the property contentSource or contentData so it can be set +func instantiate_editor(data: Array, itemID: String, newEditor: PackedScene): var newContentEditor: Control = newEditor.instantiate() newContentEditor.name = itemID tabContainer.add_child(newContentEditor) tabContainer.current_tab = tabContainer.get_child_count()-1 - newContentEditor.contentSource = strSource + var strSource: String = Gamedata.get_data_directory(data) + if strSource.ends_with((".json")): + #We only pass the data for the specific id to the editor + newContentEditor.contentData = data[Gamedata.get_array_index_by_id(data,itemID)] + #Connect the data_changed signal to the Gamedata.on_data_changed function + #We pass trough the data collection that the changed data belongs to + newContentEditor.data_changed.connect(Gamedata.on_data_changed.bind(data)) + else: + #If the data source does not end with json, it's a directory + #So now we pass in the file we want the editor to edit + newContentEditor.contentSource = strSource + itemID + ".json" diff --git a/Scripts/Helper/json_helper.gd b/Scripts/Helper/json_helper.gd index 94cf4087..c3dda655 100644 --- a/Scripts/Helper/json_helper.gd +++ b/Scripts/Helper/json_helper.gd @@ -116,7 +116,7 @@ func add_id_to_json_file(source: String, id: String): # If no item with the given ID exists, add a new item to the JSON data. data_json.append({"id": id}) - write_json_file(source, JSON.stringify(data_json)) + write_json_file(source, JSON.stringify(data_json, "\t")) #This function will take a path to a json file and delete it diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index e33f86a3..099b1ff9 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -111,7 +111,7 @@ func add_id_to_data(data: Array, id: String): print_debug("Tried to add an existing id to an array") return data.append({"id": id}) - Helper.json_helper.write_json_file(get_data_directory(data),JSON.stringify(data)) + save_data_to_file(data) else: if id in data: print_debug("Tried to add an existing file to a file array") @@ -153,3 +153,14 @@ func get_array_index_by_id(data: Array, id: String) -> int: i += 1 return myIndex +func save_data_to_file(data: Array): + var datadir: String = get_data_directory(data) + if datadir.ends_with((".json")): + Helper.json_helper.write_json_file(datadir,JSON.stringify(data,"\t")) + +# This functino is called when an editor has changed data +# The contenteditor (that initializes the individual editors) +# connects the changed_data signal to this function +# and binds the appropriate data array so it can be saved in this function +func on_data_changed(data: Array): + save_data_to_file(data) From 1592220fb8a227cc9203cdb222b6a319a1ccfd2b Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 14 Dec 2023 23:42:16 +0100 Subject: [PATCH 036/138] Update tiles.json to use sprite name --- Mods/Core/Tiles/Tiles.json | 103 ++++++++++++++++++++++++++++++------- 1 file changed, 85 insertions(+), 18 deletions(-) diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index e2412ba4..68b692af 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -5,8 +5,9 @@ ], "description": "Field of grass", "id": "grass_plain", - "imagePath": "./Mods/Core/Tiles/1.png", - "name": "Plain grass" + "name": "Plain grass", + "shape": "cube", + "sprite": "1.png" }, { "categories": [ @@ -14,7 +15,7 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_00", - "imagePath": "./Mods/Core/Tiles/woodboards.png", + "sprite": "woodboards.png", "name": "Low quality wood floor" }, { @@ -23,7 +24,7 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_01", - "imagePath": "./Mods/Core/Tiles/woodboards1.png", + "sprite": "woodboards1.png", "name": "Low quality wood floor" }, { @@ -32,7 +33,7 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_02", - "imagePath": "./Mods/Core/Tiles/woodboards2.png", + "sprite": "woodboards2.png", "name": "Low quality wood floor" }, { @@ -41,7 +42,7 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_dark_00", - "imagePath": "./Mods/Core/Tiles/woodboards3.png", + "sprite": "woodboards3.png", "name": "Low quality wood floor" }, { @@ -50,7 +51,7 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_dark_01", - "imagePath": "./Mods/Core/Tiles/woodboards4.png", + "sprite": "woodboards4.png", "name": "Low quality wood floor" }, { @@ -59,7 +60,7 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_dark_02", - "imagePath": "./Mods/Core/Tiles/woodboards5.png", + "sprite": "woodboards5.png", "name": "Low quality wood floor" }, { @@ -68,7 +69,7 @@ ], "description": "A smooth surface for vehicles to drive on", "id": "road_asphalt_basic", - "imagePath": "./Mods/Core/Tiles/asphalt_basic.png", + "sprite": "asphalt_basic.png", "name": "Basic asphalt road" }, { @@ -77,7 +78,7 @@ ], "description": "A smooth surface for vehicles to drive on. It has diagonal markings", "id": "road_asphalt_diagonal", - "imagePath": "./Mods/Core/Tiles/asphalt_diag_middle.png", + "sprite": "asphalt_diag_middle.png", "name": "Asphalt road with diagonal markings" }, { @@ -86,7 +87,7 @@ ], "description": "A smooth surface for vehicles to drive on. It has markings indicating a west turn", "id": "road_asphalt_turn_west", - "imagePath": "./Mods/Core/Tiles/asphalt_horizontal_middle_downleft.png", + "sprite": "asphalt_horizontal_middle_downleft.png", "name": "Asphalt road with markings turning west" }, { @@ -95,7 +96,7 @@ ], "description": "A smooth surface for vehicles to drive on. It has markings indicating a east turn", "id": "road_asphalt_turn_east", - "imagePath": "./Mods/Core/Tiles/asphalt_horizontal_middle_upright.png", + "sprite": "asphalt_horizontal_middle_upright.png", "name": "Asphalt road with markings turning east" }, { @@ -104,7 +105,7 @@ ], "description": "A smooth surface for vehicles to drive on. It has vertical markings", "id": "road_asphalt_vertical", - "imagePath": "./Mods/Core/Tiles/asphalt_middle.png", + "sprite": "asphalt_middle.png", "name": "Asphalt road with vertical markings" }, { @@ -113,7 +114,7 @@ ], "description": "A smooth surface for vehicles to drive on. It has markings indicating a north turn", "id": "road_asphalt_turn_north", - "imagePath": "./Mods/Core/Tiles/asphalt_middle_downleft.png", + "sprite": "asphalt_middle_downleft.png", "name": "Asphalt road with markings turning north" }, { @@ -122,7 +123,7 @@ ], "description": "A smooth surface for vehicles to drive on. It has horizontal markings", "id": "road_asphalt_horizontal", - "imagePath": "./Mods/Core/Tiles/asphalt_middle_horizontal.png", + "sprite": "asphalt_middle_horizontal.png", "name": "Asphalt road with horizontal markings" }, { @@ -131,7 +132,7 @@ ], "description": "A smooth surface for vehicles to drive on. It has markings indicating a south turn", "id": "road_asphalt_turn_south", - "imagePath": "./Mods/Core/Tiles/asphalt_middle_upright.png", + "sprite": "asphalt_middle_upright.png", "name": "Asphalt road with markings turning south" }, { @@ -141,7 +142,7 @@ ], "description": "A stone floor wihere the stones are shaped like an arch. Used in an urban environement.", "id": "arc_stones_floor", - "imagePath": "./Mods/Core/Tiles/arcstones.png", + "sprite": "arcstones.png", "name": "Arc stones floor" }, { @@ -150,7 +151,73 @@ ], "description": "Field of grass", "id": "grass_plain_01", - "imagePath": "./Mods/Core/Tiles/basegrass1.png", + "sprite": "basegrass1.png", "name": "Plain grass" + }, + { + "categories": [ + "Slopes", + "Urban" + ], + "description": "Wooden stairs that allow you to move up and down", + "id": "wood_stairs", + "sprite": "4.png", + "name": "Wooden stairs", + "shape": "slope" + }, + { + "categories": [ + "Urban", + "Wall" + ], + "description": "A solid wall made out of bricks", + "id": "brick_wall_00", + "sprite": "brickroad2.png", + "name": "Brick wall", + "shape": "cube" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A warm red carpet", + "id": "red_carpet_00", + "sprite": "redcarpet.png", + "name": "Red carpet", + "shape": "cube" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A warm blue carpet", + "id": "blue_carpet_00", + "sprite": "bluecarpet.png", + "name": "Blue carpet", + "shape": "cube" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A warm orange carpet", + "id": "orange_carpet_00", + "sprite": "browncarpet.png", + "name": "Orange carpet", + "shape": "cube" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A road made out of stones shaped like a beehive", + "id": "beehive_stones_00", + "sprite": "beehive1.png", + "name": "Beehive stones", + "shape": "cube" } ] \ No newline at end of file From 4d917aae8e009c9dc1b9465ffb22b999bccd86bb Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 15 Dec 2023 16:20:35 +0100 Subject: [PATCH 037/138] reintroduce slopes --- Blocks/Stairs_to_N001.gd | 9 + Blocks/Stairs_to_N001.tscn | 5 +- LevelGenerator.gd | 32 +- Mods/Core/Maps/Generichouse.json | 25608 ++++++++++++---- Mods/Core/Maps/urbanroad.json | 4098 +-- Mods/Core/Mobs/Mobs.json | 4 +- Mods/Core/Tiles/Tiles.json | 89 +- .../Custom_Editors/MobEditor.tscn | 4 +- .../Custom_Editors/Scripts/MobEditor.gd | 16 +- .../Scripts/TerrainTileEditor.gd | 49 +- .../Custom_Editors/TerrainTileEditor.tscn | 40 +- .../Scripts/Sprite_Selector_Popup.gd | 2 +- .../Mapeditor/Scripts/GridContainer.gd | 4 +- .../Mapeditor/Scripts/TilebrushList.gd | 11 +- .../Mapeditor/Scripts/mapeditor.gd | 5 +- .../Mapeditor/Scripts/mapeditortile.gd | 36 +- .../Mapeditor/Scripts/tilebrush.gd | 1 + Scenes/ContentManager/Scripts/content_list.gd | 58 +- .../ContentManager/Scripts/contenteditor.gd | 27 +- Scenes/Overmap/Scripts/Overmap.gd | 6 +- Scripts/gamedata.gd | 176 +- level_generation.tscn | 1 + 22 files changed, 21827 insertions(+), 8454 deletions(-) create mode 100644 Blocks/Stairs_to_N001.gd diff --git a/Blocks/Stairs_to_N001.gd b/Blocks/Stairs_to_N001.gd new file mode 100644 index 00000000..c840bfd3 --- /dev/null +++ b/Blocks/Stairs_to_N001.gd @@ -0,0 +1,9 @@ +extends StaticBody3D + + +func update_texture(material: BaseMaterial3D) -> void: + $MeshInstance3D.mesh = BoxMesh.new() + $MeshInstance3D.mesh.surface_set_material(0, material) + +func get_texture_string() -> String: + return $MeshInstance3D.mesh.material.albedo_texture.resource_path diff --git a/Blocks/Stairs_to_N001.tscn b/Blocks/Stairs_to_N001.tscn index 63dfce1c..7ba0fea7 100644 --- a/Blocks/Stairs_to_N001.tscn +++ b/Blocks/Stairs_to_N001.tscn @@ -1,5 +1,6 @@ -[gd_scene load_steps=4 format=3 uid="uid://dnsl5rk6de7na"] +[gd_scene load_steps=5 format=3 uid="uid://dnsl5rk6de7na"] +[ext_resource type="Script" path="res://Blocks/Stairs_to_N001.gd" id="1_5v8v6"] [ext_resource type="Material" uid="uid://pdqqtb1s8g6n" path="res://Materials/stairs1.tres" id="1_r8jiw"] [sub_resource type="PrismMesh" id="PrismMesh_7xabc"] @@ -12,8 +13,10 @@ points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, 0.5, [node name="StairsToN001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0) disable_mode = 1 +script = ExtResource("1_5v8v6") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0) mesh = SubResource("PrismMesh_7xabc") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 574d9d39..c236ba84 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -10,6 +10,7 @@ var level_height : int = 32 @onready var defaultBlock: PackedScene = preload("res://Blocks/grass_001.tscn") +@onready var defaultSlope: PackedScene = preload("res://Blocks/Stairs_to_N001.tscn") @export var defaultEnemy: PackedScene @export var defaultItem: PackedScene @export var level_manager : Node3D @@ -71,7 +72,7 @@ func add_item_to_map(item: Dictionary): func generate_level() -> void: var level_name: String = Helper.current_level_name - var textureName: String = "" + var tileid: String = "" if level_name == "": get_level_json() else: @@ -103,9 +104,9 @@ func generate_level() -> void: # of blocks that we need to instantiate. # If yes, then instantiate if level[current_block]: - textureName = level[current_block].texture - if textureName != "": - var block = create_block_with_material(textureName) + tileid = level[current_block].id + if tileid != "": + var block = create_block_with_id(tileid) level_node.add_child(block) block.global_position.x = w block.global_position.z = h @@ -128,11 +129,24 @@ func get_custom_level_json(level_path): level_levels = json_as_dict["levels"] -#This function takes a filename and create a new instance of block_scenes[0] which is a StaticBody3D. It will then take the material from the material dictionary based on the provided filename and apply it to the instance of StaticBody3D. Lastly it will return the StaticBody3D. -func create_block_with_material(filename: String) -> StaticBody3D: - var block: StaticBody3D = defaultBlock.instantiate() - if filename in Gamedata.tile_materials: - var material = Gamedata.tile_materials[filename] +# This function takes a tile id and creates a new instance of either a block +# or a slope which is a StaticBody3D. Look up the sprite property that is specified in +# the json associated with the id. It will then take the sprite from the +# sprite dictionary based on the provided spritename and apply it +# to the instance of StaticBody3D. Lastly it will return the StaticBody3D. +func create_block_with_id(id: String) -> StaticBody3D: + var block: StaticBody3D + var tileJSONData = Gamedata.data.tiles + var tileJSON = tileJSONData.data[Gamedata.get_array_index_by_id(tileJSONData,id)] + if tileJSON.has("shape"): + if tileJSON.shape == "slope": + block = defaultSlope.instantiate() + else: + block = defaultBlock.instantiate() + else: + block = defaultBlock.instantiate() + if tileJSON.sprite in Gamedata.data.tiles.sprites: + var material = Gamedata.data.tiles.sprites[tileJSON.sprite] block.update_texture(material) return block diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index e95ad28e..4f130cbf 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -9,12299 +9,25613 @@ [], [], [], - [], [ { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + } + ], + [ + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "orange_carpet_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "beehive_stones_00", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + }, + { + "id": "grass_plain_01", + "rotation": 0 + + } + ], + [ + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "wood_stairs", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + } + ], + [ + { + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "wood_stairs", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "woodboards6.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "blue_carpet_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "dirt3.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "", + "rotation": 0 } ], [ { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "beehive1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "arcstones1.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "brickroad.png" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "brick_wall_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 } ], [ { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "beehive_stones_00", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 }, { - "rotation": 0, - "texture": "" + "id": "", + "rotation": 0 } ], [], @@ -12309,10 +25623,8 @@ [], [], [], - [], - [], [] ], "mapheight": 32, "mapwidth": 32 -} \ No newline at end of file +} diff --git a/Mods/Core/Maps/urbanroad.json b/Mods/Core/Maps/urbanroad.json index 43011e61..3f32e4d4 100644 --- a/Mods/Core/Maps/urbanroad.json +++ b/Mods/Core/Maps/urbanroad.json @@ -12,4100 +12,4100 @@ [], [ { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_middle_horizontal.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "asphalt_basic.png" + "id": "road_asphalt_basic", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "2.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 }, { - "rotation": 0, - "texture": "basegrass1.png" + "id": "grass_plain_01", + "rotation": 0 } ], [], @@ -4121,4 +4121,4 @@ ], "mapheight": 32, "mapwidth": 32 -} \ No newline at end of file +} diff --git a/Mods/Core/Mobs/Mobs.json b/Mods/Core/Mobs/Mobs.json index 0b90d14d..a58432a5 100644 --- a/Mods/Core/Mobs/Mobs.json +++ b/Mods/Core/Mobs/Mobs.json @@ -5,12 +5,12 @@ "hearing_range": "1000", "id": "scrapwalker", "idle_move_speed": "0.5", - "imagePath": "./Mods/Core/Mobs/scrapwalker64.png", "melee_damage": "20", "melee_range": "20", "move_speed": "1", "name": "Scrap walker", "sense_range": "50", - "sight_range": "200" + "sight_range": "200", + "sprite": "scrapwalker64.png" } ] \ No newline at end of file diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index 68b692af..c3e27ae4 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -15,8 +15,9 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_00", - "sprite": "woodboards.png", - "name": "Low quality wood floor" + "name": "Low quality wood floor", + "shape": "cube", + "sprite": "woodboards.png" }, { "categories": [ @@ -24,8 +25,8 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_01", - "sprite": "woodboards1.png", - "name": "Low quality wood floor" + "name": "Low quality wood floor", + "sprite": "woodboards1.png" }, { "categories": [ @@ -33,8 +34,8 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_02", - "sprite": "woodboards2.png", - "name": "Low quality wood floor" + "name": "Low quality wood floor", + "sprite": "woodboards2.png" }, { "categories": [ @@ -42,8 +43,8 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_dark_00", - "sprite": "woodboards3.png", - "name": "Low quality wood floor" + "name": "Low quality wood floor", + "sprite": "woodboards3.png" }, { "categories": [ @@ -51,8 +52,8 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_dark_01", - "sprite": "woodboards4.png", - "name": "Low quality wood floor" + "name": "Low quality wood floor", + "sprite": "woodboards4.png" }, { "categories": [ @@ -60,8 +61,8 @@ ], "description": "The floor is old and the boards are crooked", "id": "floor_wood_shabby_dark_02", - "sprite": "woodboards5.png", - "name": "Low quality wood floor" + "name": "Low quality wood floor", + "sprite": "woodboards5.png" }, { "categories": [ @@ -69,8 +70,8 @@ ], "description": "A smooth surface for vehicles to drive on", "id": "road_asphalt_basic", - "sprite": "asphalt_basic.png", - "name": "Basic asphalt road" + "name": "Basic asphalt road", + "sprite": "asphalt_basic.png" }, { "categories": [ @@ -78,8 +79,8 @@ ], "description": "A smooth surface for vehicles to drive on. It has diagonal markings", "id": "road_asphalt_diagonal", - "sprite": "asphalt_diag_middle.png", - "name": "Asphalt road with diagonal markings" + "name": "Asphalt road with diagonal markings", + "sprite": "asphalt_diag_middle.png" }, { "categories": [ @@ -87,8 +88,8 @@ ], "description": "A smooth surface for vehicles to drive on. It has markings indicating a west turn", "id": "road_asphalt_turn_west", - "sprite": "asphalt_horizontal_middle_downleft.png", - "name": "Asphalt road with markings turning west" + "name": "Asphalt road with markings turning west", + "sprite": "asphalt_horizontal_middle_downleft.png" }, { "categories": [ @@ -96,8 +97,8 @@ ], "description": "A smooth surface for vehicles to drive on. It has markings indicating a east turn", "id": "road_asphalt_turn_east", - "sprite": "asphalt_horizontal_middle_upright.png", - "name": "Asphalt road with markings turning east" + "name": "Asphalt road with markings turning east", + "sprite": "asphalt_horizontal_middle_upright.png" }, { "categories": [ @@ -105,8 +106,8 @@ ], "description": "A smooth surface for vehicles to drive on. It has vertical markings", "id": "road_asphalt_vertical", - "sprite": "asphalt_middle.png", - "name": "Asphalt road with vertical markings" + "name": "Asphalt road with vertical markings", + "sprite": "asphalt_middle.png" }, { "categories": [ @@ -114,8 +115,8 @@ ], "description": "A smooth surface for vehicles to drive on. It has markings indicating a north turn", "id": "road_asphalt_turn_north", - "sprite": "asphalt_middle_downleft.png", - "name": "Asphalt road with markings turning north" + "name": "Asphalt road with markings turning north", + "sprite": "asphalt_middle_downleft.png" }, { "categories": [ @@ -123,8 +124,8 @@ ], "description": "A smooth surface for vehicles to drive on. It has horizontal markings", "id": "road_asphalt_horizontal", - "sprite": "asphalt_middle_horizontal.png", - "name": "Asphalt road with horizontal markings" + "name": "Asphalt road with horizontal markings", + "sprite": "asphalt_middle_horizontal.png" }, { "categories": [ @@ -132,8 +133,8 @@ ], "description": "A smooth surface for vehicles to drive on. It has markings indicating a south turn", "id": "road_asphalt_turn_south", - "sprite": "asphalt_middle_upright.png", - "name": "Asphalt road with markings turning south" + "name": "Asphalt road with markings turning south", + "sprite": "asphalt_middle_upright.png" }, { "categories": [ @@ -142,8 +143,8 @@ ], "description": "A stone floor wihere the stones are shaped like an arch. Used in an urban environement.", "id": "arc_stones_floor", - "sprite": "arcstones.png", - "name": "Arc stones floor" + "name": "Arc stones floor", + "sprite": "arcstones.png" }, { "categories": [ @@ -151,8 +152,8 @@ ], "description": "Field of grass", "id": "grass_plain_01", - "sprite": "basegrass1.png", - "name": "Plain grass" + "name": "Plain grass", + "sprite": "basegrass1.png" }, { "categories": [ @@ -161,9 +162,9 @@ ], "description": "Wooden stairs that allow you to move up and down", "id": "wood_stairs", - "sprite": "4.png", "name": "Wooden stairs", - "shape": "slope" + "shape": "slope", + "sprite": "4.png" }, { "categories": [ @@ -172,9 +173,9 @@ ], "description": "A solid wall made out of bricks", "id": "brick_wall_00", - "sprite": "brickroad2.png", "name": "Brick wall", - "shape": "cube" + "shape": "cube", + "sprite": "brickroad2.png" }, { "categories": [ @@ -183,9 +184,9 @@ ], "description": "A warm red carpet", "id": "red_carpet_00", - "sprite": "redcarpet.png", "name": "Red carpet", - "shape": "cube" + "shape": "cube", + "sprite": "redcarpet.png" }, { "categories": [ @@ -194,9 +195,9 @@ ], "description": "A warm blue carpet", "id": "blue_carpet_00", - "sprite": "bluecarpet.png", "name": "Blue carpet", - "shape": "cube" + "shape": "cube", + "sprite": "bluecarpet.png" }, { "categories": [ @@ -205,9 +206,9 @@ ], "description": "A warm orange carpet", "id": "orange_carpet_00", - "sprite": "browncarpet.png", "name": "Orange carpet", - "shape": "cube" + "shape": "cube", + "sprite": "browncarpet.png" }, { "categories": [ @@ -216,8 +217,8 @@ ], "description": "A road made out of stones shaped like a beehive", "id": "beehive_stones_00", - "sprite": "beehive1.png", "name": "Beehive stones", - "shape": "cube" + "shape": "cube", + "sprite": "beehive1.png" } ] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/MobEditor.tscn b/Scenes/ContentManager/Custom_Editors/MobEditor.tscn index 4de4efc3..c3e8d524 100644 --- a/Scenes/ContentManager/Custom_Editors/MobEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/MobEditor.tscn @@ -53,7 +53,7 @@ columns = 2 [node name="ImageLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 -text = "Image:" +text = "Sprite:" [node name="MobImageDisplay" type="TextureRect" parent="VBoxContainer/FormGrid"] custom_minimum_size = Vector2(128, 128) @@ -65,7 +65,7 @@ expand_mode = 3 [node name="PathLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 -text = "Path:" +text = "Sprite name" [node name="PathTextLabel" type="Label" parent="VBoxContainer/FormGrid"] custom_minimum_size = Vector2(0, 30) diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd index c9875ec1..9ec8d34d 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd @@ -25,19 +25,19 @@ extends Control signal data_changed() # The data that represents this mob -# The data is selected from the Gamedata.all_mobs array +# The data is selected from the Gamedata.data.mobs.data array # based on the ID that the user has selected in the content editor var contentData: Dictionary = {}: set(value): contentData = value load_mob_data() - mobSelector.sprites_collection = Gamedata.mob_materials + mobSelector.sprites_collection = Gamedata.data.mobs.sprites #This function update the form based on the contentData that has been loaded func load_mob_data() -> void: - if mobImageDisplay != null and contentData.has("imagePath"): - mobImageDisplay.texture = load(contentData["imagePath"]) - PathTextLabel.text = contentData["imagePath"] + if mobImageDisplay != null and contentData.has("sprite"): + mobImageDisplay.texture = Gamedata.data.mobs.sprites[contentData["sprite"]] + PathTextLabel.text = contentData["sprite"] if IDTextLabel != null: IDTextLabel.text = str(contentData["id"]) if NameTextEdit != null and contentData.has("name"): @@ -68,11 +68,11 @@ func _on_close_button_button_up() -> void: queue_free() # This function takes all data fro the form elements stores them in the contentData -# Since contentData is a reference to an item in Gamedata.all_mobs +# Since contentData is a reference to an item in Gamedata.data.mobs.data # the central array for mobdata is updated with the changes as well # The function will signal to Gamedata that the data has changed and needs to be saved func _on_save_button_button_up() -> void: - contentData["imagePath"] = PathTextLabel.text + contentData["sprite"] = PathTextLabel.text contentData["name"] = NameTextEdit.text contentData["description"] = DescriptionTextEdit.text contentData["melee_damage"] = melee_damage_numedit.get_line_edit().text @@ -95,4 +95,4 @@ func _on_mob_image_display_gui_input(event) -> void: func _on_sprite_selector_sprite_selected_ok(clicked_sprite) -> void: var mobTexture: Resource = clicked_sprite.get_texture() mobImageDisplay.texture = mobTexture - PathTextLabel.text = mobTexture.resource_path.replace("res://","") + PathTextLabel.text = mobTexture.resource_path.get_file() diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd index de992e09..fd2bf5cd 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd @@ -13,27 +13,29 @@ extends Control @export var DescriptionTextEdit: TextEdit = null @export var CategoriesList: Control = null @export var tileSelector: Popup = null -@export var tileBrushList: HFlowContainer = null -@export var tilePathStringLabel: Label = null +@export var imageNameStringLabel: Label = null +@export var cubeShapeCheckbox: Button = null +@export var slopeShapeCheckbox: Button = null # This signal will be emitted when the user presses the save button # This signal should alert Gamedata that the tile data array should be saved to disk # The content editor has connected this signal to Gamedata already signal data_changed() # The data that represents this tile -# The data is selected from the Gamedata.all_tiles array +# The data is selected from the Gamedata.data.tiles.data array # based on the ID that the user has selected in the content editor var contentData: Dictionary = {}: set(value): contentData = value load_tile_data() - tileSelector.sprites_collection = Gamedata.tile_materials + tileSelector.sprites_collection = Gamedata.data.tiles.sprites # This function updates the form based on the contentData that has been loaded func load_tile_data(): - if tileImageDisplay != null and contentData.has("imagePath"): - tileImageDisplay.texture = load(contentData["imagePath"]) - tilePathStringLabel.text = contentData["imagePath"] + if tileImageDisplay != null and contentData.has("sprite"): + var myTexture: Resource = Gamedata.data.tiles.sprites[contentData["sprite"]] + tileImageDisplay.texture = myTexture.albedo_texture + imageNameStringLabel.text = contentData["sprite"] if IDTextLabel != null: IDTextLabel.text = str(contentData["id"]) if NameTextEdit != null and contentData.has("name"): @@ -44,6 +46,11 @@ func load_tile_data(): CategoriesList.clear_list() for category in contentData["categories"]: CategoriesList.add_item_to_list(category) + if cubeShapeCheckbox != null and contentData.has("shape"): + # By default the cubeShapeCheckbox is selected so we only account for slope + if contentData["shape"] == "slope": + cubeShapeCheckbox.button_pressed = false + slopeShapeCheckbox.button_pressed = true #The editor is closed, destroy the instance #TODO: Check for unsaved changes @@ -51,14 +58,17 @@ func _on_close_button_button_up(): queue_free() # This function takes all data fro the form elements stores them in the contentData -# Since contentData is a reference to an item in Gamedata.all_tiles +# Since contentData is a reference to an item in Gamedata.data.tiles.data # the central array for tiledata is updated with the changes as well # The function will signal to Gamedata that the data has changed and needs to be saved func _on_save_button_button_up(): - contentData["imagePath"] = tilePathStringLabel.text + contentData["sprite"] = imageNameStringLabel.text contentData["name"] = NameTextEdit.text contentData["description"] = DescriptionTextEdit.text contentData["categories"] = CategoriesList.get_items() + contentData["shape"] = "cube" + if slopeShapeCheckbox.button_pressed: + contentData["shape"] = "slope" data_changed.emit() #When the tileImageDisplay is clicked, the user will be prompted to select an image from @@ -70,5 +80,22 @@ func _on_tile_image_display_gui_input(event): func _on_sprite_selector_sprite_selected_ok(clicked_sprite) -> void: var tileTexture: Resource = clicked_sprite.get_texture() tileImageDisplay.texture = tileTexture - var imagepath: String = tileTexture.resource_path - tilePathStringLabel.text = imagepath.replace("res://", "") + imageNameStringLabel.text = tileTexture.resource_path.get_file() + +# The tile can only be shaped like either a cube or a slope +# If the user clicks the cube shape button then only the cube shape +# button should be selected and no other shape buttons +# Having all shape buttons deselected should not happen. +func _on_cube_shape_check_box_button_up(): + slopeShapeCheckbox.button_pressed = false + if !cubeShapeCheckbox.button_pressed: + cubeShapeCheckbox.button_pressed = true + +# The tile can only be shaped like either a cube or a slope +# If the user clicks the slope shape button then only the slope shape +# button should be selected and no other shape buttons. +# Having all shape buttons deselected should not happen. +func _on_slope_shape_check_box_button_up(): + cubeShapeCheckbox.button_pressed = false + if !slopeShapeCheckbox.button_pressed: + slopeShapeCheckbox.button_pressed = true diff --git a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn index c809488f..d3932de2 100644 --- a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn @@ -6,7 +6,7 @@ [ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_x7b0a"] [ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="5_5ngda"] -[node name="TerrainTileEditor" type="Control" node_paths=PackedStringArray("tileImageDisplay", "IDTextLabel", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "tileSelector", "tilePathStringLabel")] +[node name="TerrainTileEditor" type="Control" node_paths=PackedStringArray("tileImageDisplay", "IDTextLabel", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "tileSelector", "imageNameStringLabel", "cubeShapeCheckbox", "slopeShapeCheckbox")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -21,7 +21,9 @@ NameTextEdit = NodePath("VBoxContainer/FormGrid/NameTextEdit") DescriptionTextEdit = NodePath("VBoxContainer/FormGrid/DescriptionTextEdit") CategoriesList = NodePath("VBoxContainer/FormGrid/Editable_Item_List") tileSelector = NodePath("Sprite_selector") -tilePathStringLabel = NodePath("VBoxContainer/FormGrid/PathString") +imageNameStringLabel = NodePath("VBoxContainer/FormGrid/ImageNameStringLabel") +cubeShapeCheckbox = NodePath("VBoxContainer/FormGrid/ShapeButtonContainer/CubeShapeCheckBox") +slopeShapeCheckbox = NodePath("VBoxContainer/FormGrid/ShapeButtonContainer/SlopeShapeCheckBox") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -49,7 +51,7 @@ columns = 2 [node name="ImageLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 -text = "Image:" +text = "Sprite:" [node name="TileImageDisplay" type="TextureRect" parent="VBoxContainer/FormGrid"] custom_minimum_size = Vector2(128, 128) @@ -59,6 +61,13 @@ size_flags_stretch_ratio = 0.4 texture = ExtResource("2_x7b0a") expand_mode = 3 +[node name="ImageNameLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Sprite name:" + +[node name="ImageNameStringLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 + [node name="IDLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 text = "ID:" @@ -69,13 +78,6 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.1 -[node name="PathLabel" type="Label" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -text = "Path:" - -[node name="PathString" type="Label" parent="VBoxContainer/FormGrid"] -layout_mode = 2 - [node name="NameLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 text = "Name" @@ -110,10 +112,28 @@ size_flags_horizontal = 3 size_flags_vertical = 3 header = "Categories" +[node name="ShapeLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Shape:" + +[node name="ShapeButtonContainer" type="HBoxContainer" parent="VBoxContainer/FormGrid"] +layout_mode = 2 + +[node name="CubeShapeCheckBox" type="CheckBox" parent="VBoxContainer/FormGrid/ShapeButtonContainer"] +layout_mode = 2 +button_pressed = true +text = "Cube" + +[node name="SlopeShapeCheckBox" type="CheckBox" parent="VBoxContainer/FormGrid/ShapeButtonContainer"] +layout_mode = 2 +text = "Slope" + [node name="Sprite_selector" parent="." instance=ExtResource("5_5ngda")] visible = false [connection signal="button_up" from="VBoxContainer/HBoxContainer/CloseButton" to="." method="_on_close_button_button_up"] [connection signal="button_up" from="VBoxContainer/HBoxContainer/SaveButton" to="." method="_on_save_button_button_up"] [connection signal="gui_input" from="VBoxContainer/FormGrid/TileImageDisplay" to="." method="_on_tile_image_display_gui_input"] +[connection signal="button_up" from="VBoxContainer/FormGrid/ShapeButtonContainer/CubeShapeCheckBox" to="." method="_on_cube_shape_check_box_button_up"] +[connection signal="button_up" from="VBoxContainer/FormGrid/ShapeButtonContainer/SlopeShapeCheckBox" to="." method="_on_slope_shape_check_box_button_up"] [connection signal="sprite_selected_ok" from="Sprite_selector" to="." method="_on_sprite_selector_sprite_selected_ok"] diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd index f46f11c6..bd95716a 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd @@ -26,7 +26,7 @@ var selectedSprite: Control = null signal sprite_selected_ok(clicked_sprite: Control) -# this function will read all files in SpriteDir and for each file it will create a +# For each item in Gamedata.data.x.sprites it will create a # selectable_Sprite_Widget and assign the file as the texture of the selectable_Sprite_Widget. # Then it will add the selectable_Sprite_Widget as a child to spriteList func populate_sprite_list(): diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 4b195b5c..1a686583 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -113,7 +113,7 @@ func paint_single_tile(clicked_tile): if erase: clicked_tile.set_default() elif selected_brush: - clicked_tile.set_texture(selected_brush.get_texture()) + clicked_tile.set_tile_id(selected_brush.tileID) #When this function is called, loop over all the TileGrid's children and get the tileData property. Store this data in the currentLevelData array func storeLevelData(): @@ -199,7 +199,7 @@ func paint_in_rectangle(): tile.set_default() elif selected_brush: for tile in tiles: - tile.set_texture(selected_brush.get_texture()) + tile.set_tile_id(selected_brush.tileID) update_rectangle() #The user has pressed the erase toggle button in the editor diff --git a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd index 2d3bb916..11c9d7d8 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd @@ -18,10 +18,10 @@ func _ready(): # this function will read all files in "res://Mods/Core/Tiles/" and for each file it will create a texturerect and assign the file as the texture of the texturerect. Then it will add the texturerect as a child to $HSplitContainer/EntitiesContainer/TilesList func loadTiles(): - var tileList: Array = Gamedata.all_tiles + var tileList: Array = Gamedata.data.tiles.data for item in tileList: - if item.has("imagePath"): + if item.has("sprite"): #We need to put the tiles the right catecory #Each tile can have 0 or more categories for category in item["categories"]: @@ -31,14 +31,17 @@ func loadTiles(): newTilesList = scrolling_Flow_Container.instantiate() newTilesList.header = category add_child(newTilesList) - var imagefileName: String = item["imagePath"] + var imagefileName: String = item["sprite"] imagefileName = imagefileName.get_file() # Get the texture from gamedata - var texture: Resource = Gamedata.tile_materials[imagefileName].albedo_texture + var texture: Resource = Gamedata.data.tiles.sprites[imagefileName].albedo_texture # Create a TextureRect node var brushInstance = tileBrush.instantiate() # Assign the texture to the TextureRect brushInstance.set_tile_texture(texture) + # Since the map editor needs to knw what tile ID is used, + # We store the tile id in a variable in the brush + brushInstance.tileID = item.id brushInstance.tilebrush_clicked.connect(tilebrush_clicked) # Add the TextureRect as a child to the TilesList diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd index 6801f875..d0171b03 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd @@ -55,7 +55,7 @@ func _on_map_scroll_window_ready(): mapScrollWindow.scroll_horizontal = int(panWindow.custom_minimum_size.x/3.5) mapScrollWindow.scroll_vertical = int(panWindow.custom_minimum_size.y/3.5) adjust_scale(20) - + func adjust_scale(zoom: int): gridContainer.custom_minimum_size = Vector2(mapWidth*1.28*zoom, mapHeight*1.28*zoom) @@ -64,8 +64,7 @@ func _on_zoom_scroller_zoom_level_changed(value): func _on_tile_grid_zoom_level_changed(value): zoom_level = value - - + #The editor is closed, destroy the instance #TODO: Check for unsaved changes func _on_close_button_button_up(): diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index 8e7596c5..7833f864 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -1,13 +1,22 @@ extends Control -const defaultTileData: Dictionary = {"texture": "", "rotation": 0} +const defaultTileData: Dictionary = {"id": "", "rotation": 0} const defaultTexture: String = "res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" const aboveTexture: String = "res://Scenes/ContentManager/Mapeditor/Images/tileAbove.png" var tileData: Dictionary = defaultTileData.duplicate(): set(data): tileData = data - if tileData.texture != "": - $TextureRect.texture = load("res://Mods/Core/Tiles/" + tileData.texture) + if tileData.id != "": + # tileData has an id. Now we want to load the json that has that tileid + var tileGameData = Gamedata.data.tiles + # The index in the tiles json data + var myTileIndex: int = Gamedata.get_array_index_by_id(tileGameData,tileData.id) + if myTileIndex != -1: + # We found the tile json with the specified id, so get that json by using the index + var myTileData: Dictionary = tileGameData.data[myTileIndex] + $TextureRect.texture = Gamedata.data.tiles.sprites[myTileData.sprite].albedo_texture + else: + $TextureRect.texture = load(defaultTexture) else: $TextureRect.texture = load(defaultTexture) signal tile_clicked(clicked_tile: Control) @@ -19,10 +28,17 @@ func _on_texture_rect_gui_input(event: InputEvent) -> void: if event.pressed: tile_clicked.emit(self) -func set_texture(res: Resource) -> void: - $TextureRect.texture = res - var path: String = res.resource_path - tileData.texture = path.get_file() +#func set_texture(res: Resource) -> void: + #$TextureRect.texture = res + #var path: String = res.resource_path + #tileData.texture = path.get_file() + +func set_tile_id(id: String) -> void: + tileData.id = id + var jsonTileData: Dictionary = Gamedata.data.tiles + var jsonTile: Dictionary = jsonTileData.data[Gamedata.get_array_index_by_id(jsonTileData,id)] + var tileTexture: Resource = Gamedata.data.tiles.sprites[jsonTile.sprite] + $TextureRect.texture = tileTexture.albedo_texture func _on_texture_rect_mouse_entered() -> void: if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): @@ -33,10 +49,10 @@ func set_default() -> void: func highlight() -> void: $TextureRect.modulate = Color(0.227, 0.635, 0.757) - + func unhighlight() -> void: $TextureRect.modulate = Color(1,1,1) - + func set_clickable(clickable: bool): if !clickable: mouse_filter = MOUSE_FILTER_IGNORE @@ -45,7 +61,7 @@ func set_clickable(clickable: bool): #This function sets the texture to some static resource that helps the user visualize that something is above #If this tile has a texture in its data, set it to the above texture instead func set_above(): - if tileData.texture != "": + if tileData.id != "": $TextureRect.texture = load(aboveTexture) else: $TextureRect.texture = null diff --git a/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd b/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd index c7a0fedc..b8663493 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd @@ -1,6 +1,7 @@ extends Control signal tilebrush_clicked(clicked_tile: Control) +var tileID: String = "" var selected: bool = false #When the event was a left mouse button press, adjust the modulate property of the $TileSprite to be 3aa2c1 diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 9e06b94e..9851e878 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -13,9 +13,9 @@ extends Control signal item_activated(data: Array, itemID: String) var is_collapsed: bool = false var popupAction: String = "" -var contentdata: Array = []: +var contentData: Dictionary = {}: set(newData): - contentdata = newData + contentData = newData load_data() var header: String = "Items": set(newName): @@ -24,55 +24,41 @@ var header: String = "Items": -# This function will take a string and create a new json file with just {} as the contents. -#If the file already exists, we do not overwrite it -func create_new_json_file(filename: String = "", isArray: bool = true): - # If no string was provided, return without doing anything. - if filename.is_empty(): - return - - # If the file already exists, alert the user that the file already exists. - if FileAccess.file_exists(filename): -# print_debug("The file already exists: " + filename) - return - - var file = FileAccess.open(filename, FileAccess.WRITE) - #The file cen contain either one object or one array with a list of objects - if isArray: - file.store_string("[]") - else: - file.store_string("{}") - file.close() - load_data() - - #This function adds items to the content list based on the provided path #If the path is a directory, it will list all the files in the directory #If the path is a json file, it will list all the items in the json file func load_data(): - if contentdata.is_empty(): + if contentData.is_empty(): return contentItems.clear() #If the first item is a string, it's a list of files. #Otherwise, it's a list of objects representing some kind of data - if contentdata[0] is String: + if contentData.data[0] is String: make_file_list() else: make_item_list() +# Loops over all the items in contentData.data (which are dictionaries) +# Creates a new item in the list with the id of the item as text func make_item_list(): - for item in contentdata: + for item in contentData.data: # get the id of the item, "missing_id" if not found var item_id: String = item.get("id", "missing_id") #Add the item and save the index number var item_index: int = contentItems.add_item(item_id) contentItems.set_item_metadata(item_index, item_id) - if item.has("imagePath"): - contentItems.set_item_icon(item_index,load(item["imagePath"])) - + if item.has("sprite"): + var mySprite: Resource = contentData.sprites[item["sprite"]] + if mySprite is BaseMaterial3D: + contentItems.set_item_icon(item_index,mySprite.albedo_texture) + else: + contentItems.set_item_icon(item_index,mySprite) + +# Loops over the files in contentData.data (which are filenames) +# For each file a new item will be added to the list func make_file_list() -> void: - for file_name in contentdata: + for file_name in contentData.data: # Add all the filenames to the ContentItems list as child nodes var item_index: int = contentItems.add_item(file_name.replace(".json", "")) #Add the ID as metadata which can be used to load the item data @@ -85,14 +71,14 @@ func _on_content_items_item_activated(index: int): # Get the id of the item from the metadata var strItemID: String = contentItems.get_item_metadata(index) if strItemID: - item_activated.emit(contentdata, strItemID) + item_activated.emit(contentData, strItemID) else: print_debug("Tried to signal that item with ID (" + str(index) + ") was activated,\ but the item has no metadata") #This function will append an item to the game data func add_item_to_data(id: String): - Gamedata.add_id_to_data(contentdata, id) + Gamedata.add_id_to_data(contentData, id) load_data() #This function will show a pop-up asking the user to input an ID @@ -123,9 +109,9 @@ func _on_ok_button_up(): if myText == "": return; if popupAction == "Add": - Gamedata.add_id_to_data(contentdata, myText) + Gamedata.add_id_to_data(contentData, myText) if popupAction == "Duplicate": - Gamedata.duplicate_item_in_data(contentdata,get_selected_item_text(),myText) + Gamedata.duplicate_item_in_data(contentData,get_selected_item_text(),myText) popupAction = "" load_data() @@ -142,7 +128,7 @@ func _on_delete_button_button_up(): if selected_id == "": return contentItems.remove_item(contentItems.get_selected_items()[0]) - Gamedata.remove_item_from_data(contentdata, selected_id) + Gamedata.remove_item_from_data(contentData, selected_id) load_data() func get_selected_item_text() -> String: diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index 4e05d63e..3021d33c 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -11,16 +11,16 @@ var selectedMod: String = "Core" # Called when the node enters the scene tree for the first time. #This function will instatiate a tileScene, set the source property and add it as a child to the content VBoxContainer. The source property should be set to "./Mods/Core/Maps/" func _ready(): - load_content_list(Gamedata.all_map_files, "Maps") - load_content_list(Gamedata.all_tiles, "Terrain Tiles") - load_content_list(Gamedata.all_mobs, "Mobs") + load_content_list(Gamedata.data.maps, "Maps") + load_content_list(Gamedata.data.tiles, "Terrain Tiles") + load_content_list(Gamedata.data.mobs, "Mobs") -func load_content_list(data: Array, strHeader: String): +func load_content_list(data: Dictionary, strHeader: String): # Instantiate a contentlist var contentListInstance: Control = contentList.instantiate() # Set the source property - contentListInstance.contentdata = data + contentListInstance.contentData = data contentListInstance.header = strHeader contentListInstance.connect("item_activated", _on_content_item_activated) @@ -35,34 +35,33 @@ func _on_back_button_button_up(): #If strSource is a json file, we load an item from this file with the ID of itemText #If the strSource is not a json file, we will assume it's a directory. #If it's a directory, we will load the entire json file with the name of the item ID -func _on_content_item_activated(data: Array, itemID: String): +func _on_content_item_activated(data: Dictionary, itemID: String): if data.is_empty() or itemID == "": print_debug("Tried to load the selected contentitem, but either \ data (Array) or itemID ("+itemID+") is empty") return - if data == Gamedata.all_tiles: + if data == Gamedata.data.tiles: instantiate_editor(data, itemID, terrainTileEditor) - if data == Gamedata.all_mobs: + if data == Gamedata.data.mobs: instantiate_editor(data, itemID, mobEditor) - if data == Gamedata.all_map_files: + if data == Gamedata.data.maps: instantiate_editor(data, itemID, mapEditor) #This will add an editor to the content editor tab view. #The editor that should be instantiated is passed trough in the newEditor parameter #It is important that the editor has the property contentSource or contentData so it can be set -func instantiate_editor(data: Array, itemID: String, newEditor: PackedScene): +func instantiate_editor(data: Dictionary, itemID: String, newEditor: PackedScene): var newContentEditor: Control = newEditor.instantiate() newContentEditor.name = itemID tabContainer.add_child(newContentEditor) tabContainer.current_tab = tabContainer.get_child_count()-1 - var strSource: String = Gamedata.get_data_directory(data) - if strSource.ends_with((".json")): + if data.dataPath.ends_with(".json"): #We only pass the data for the specific id to the editor - newContentEditor.contentData = data[Gamedata.get_array_index_by_id(data,itemID)] + newContentEditor.contentData = data.data[Gamedata.get_array_index_by_id(data,itemID)] #Connect the data_changed signal to the Gamedata.on_data_changed function #We pass trough the data collection that the changed data belongs to newContentEditor.data_changed.connect(Gamedata.on_data_changed.bind(data)) else: #If the data source does not end with json, it's a directory #So now we pass in the file we want the editor to edit - newContentEditor.contentSource = strSource + itemID + ".json" + newContentEditor.contentSource = data.dataPath + itemID + ".json" diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index 2e345bd0..9a5aa8c2 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -87,8 +87,8 @@ func get_random_mapname_1_in_100() -> String: var random_file: String = "" var chance = randi_range(0, 100) if chance < 1: - var random_index = randi() % Gamedata.all_map_files.size() - random_file = Gamedata.all_map_files[random_index] + var random_index = randi() % Gamedata.data.maps.data.size() + random_file = Gamedata.data.maps.data[random_index] return random_file @@ -174,7 +174,7 @@ func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): var tile_type = chunk[i].tile # Retrieve the texture based on the tile type. - var texture = Gamedata.overmaptile_materials[tile_type] + var texture = Gamedata.data.overmaptiles.sprites[tile_type] var tile = overmapTile.instantiate() var local_x = column*tile_size var local_y = row*tile_size diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index 099b1ff9..efeb04c7 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -2,50 +2,56 @@ extends Node #This autoload singleton loads all game data required to run the game #It can be accessed by using Gamedata.property +var data: Dictionary = {} -var tile_materials: Dictionary = {} # Materials used to represent tiles -var all_tiles: Array = [] # All data describing tiles -var overmaptile_materials: Dictionary = {} # Materials used to represent overmap tiles -var mob_materials: Dictionary = {} # Materials used to represent mobs -var all_mobs: Array = [] # All data describing mobs -var all_map_files: Array = [] - -# Called when the node enters the scene tree for the first time. +# We write down the associated paths for the files to load +# Next, sprites are loaded from spritesPath into the .sprites property +# Finally, the data is loaded from dataPath into the .data property +# Maps tile sprites and map data are different so they +# are loaded in using their respective functions func _ready(): - load_tiles_material() - load_overmaptiles_material() - load_mobs_material() - load_mob_data() - load_tile_data() - all_map_files = Helper.json_helper.file_names_in_dir("./Mods/Core/Maps/", ["json"]) - -#Loads mob json data. If no json file exists, it will create an empty array in a new file -func load_mob_data(): - var mob_dir: String = "./Mods/Core/Mobs/Mobs.json" - Helper.json_helper.create_new_json_file(mob_dir) - all_mobs = Helper.json_helper.load_json_array_file(mob_dir) - -#Loads tile json data. If no json file exists, it will create an empty array in a new file -func load_tile_data(): - var tile_dir: String = "./Mods/Core/Tiles/Tiles.json" - Helper.json_helper.create_new_json_file(tile_dir) - all_tiles = Helper.json_helper.load_json_array_file(tile_dir) - + data.tiles = {} + data.mobs = {} + data.overmaptiles = {} + data.maps = {} + data.tiles.dataPath = "./Mods/Core/Tiles/Tiles.json" + data.tiles.spritePath = "./Mods/Core/Tiles/" + data.mobs.dataPath = "./Mods/Core/Mobs/Mobs.json" + data.mobs.spritePath = "./Mods/Core/Mobs/" + data.overmaptiles.spritePath = "./Mods/Core/OvermapTiles/" + data.maps.dataPath = "./Mods/Core/Maps/" + load_sprites() + load_tile_sprites() + load_data() + data.maps.data = Helper.json_helper.file_names_in_dir(data.maps.dataPath, ["json"]) + +#Loads json data. If no json file exists, it will create an empty array in a new file +func load_data() -> void: + for dict in data.keys(): + if data[dict].has("dataPath"): + var dataPath: String = data[dict].dataPath + if FileAccess.file_exists(dataPath): + Helper.json_helper.create_new_json_file(dataPath) + data[dict].data = Helper.json_helper.load_json_array_file(dataPath) + +#This loads all the sprites and assigns them to the proper dictionary +func load_sprites(): + for dict in data.keys(): + if data[dict].has("spritePath"): + var loaded_sprites: Dictionary = {} # Materials used to represent mobs + var spritesDir: String = data[dict].spritePath + var png_files: Array = Helper.json_helper.file_names_in_dir(spritesDir, ["png"]) + for png_file in png_files: + # Load the .png file as a texture + var texture := load(spritesDir + png_file) + # Add the material to the dictionary + loaded_sprites[png_file] = texture + data[dict].sprites = loaded_sprites # This function reads all the files in "res://Mods/Core/Tiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. -func load_mobs_material(): - var mobsDir = "./Mods/Core/Mobs/" - var png_files: Array = Helper.json_helper.file_names_in_dir(mobsDir, ["png"]) - for png_file in png_files: - # Load the .png file as a texture - var texture := load(mobsDir + png_file) - # Add the material to the dictionary - mob_materials[png_file] = texture - - -# This function reads all the files in "res://Mods/Core/Tiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. -func load_tiles_material(): - var tilesDir = "./Mods/Core/Tiles/" +func load_tile_sprites() -> void: + var tile_materials: Dictionary = {} # Materials used to represent tiles + var tilesDir = data.tiles.spritePath var png_files: Array = Helper.json_helper.file_names_in_dir(tilesDir, ["png"]) for png_file in png_files: var texture := load(tilesDir + png_file) # Load the .png file as a texture @@ -53,38 +59,23 @@ func load_tiles_material(): material.albedo_texture = texture # Set the texture of the material material.uv1_scale = Vector3(3,2,1) tile_materials[png_file] = material # Add the material to the dictionary - - -# This function reads all the files in "res://Mods/Core/OvermapTiles/". It will check if the file is a .png file. If the file is a .png file, it will create a new material with that .png image as the texture. It will put all of the created materials in a dictionary with the name of the file as the key and the material as the value. -func load_overmaptiles_material(): - var tilesDir = "./Mods/Core/OvermapTiles/" - var png_files: Array = Helper.json_helper.file_names_in_dir(tilesDir, ["png"]) - for png_file in png_files: - # Load the .png file as a texture - var texture := load(tilesDir + png_file) - # Add the material to the dictionary - overmaptile_materials[png_file] = texture - + data.tiles.sprites = tile_materials #This function will take two strings called ID and newID #It will find an item with this ID in a json file specified by the source variable #It will then duplicate that item into the json file and change the ID to newID -func duplicate_item_in_data(data: Array, id: String, newID: String): - if data.is_empty(): +func duplicate_item_in_data(contentData: Dictionary, id: String, newID: String): + if contentData.data.is_empty(): return - if get_data_directory(data).ends_with((".json")): - # If the first item is a string, assume all items are strings and do nothing - if data[0] is String: - return - + if data.dataPath.ends_with((".json")): # Check if an item with the given ID exists in the file. - var item_index: int = get_array_index_by_id(data,id) + var item_index: int = get_array_index_by_id(contentData.data,id) if item_index == -1: return # Duplicate the found item recursively - var item_to_duplicate = data[item_index].duplicate(true) + var item_to_duplicate = contentData.data[item_index].duplicate(true) # If there is no item to duplicate, return without doing anything. if item_to_duplicate == null: @@ -92,12 +83,11 @@ func duplicate_item_in_data(data: Array, id: String, newID: String): # Change the ID of the duplicated item. item_to_duplicate["id"] = newID # Add the duplicated item to the JSON data. - data.append(item_to_duplicate) - Helper.json_helper.write_json_file(get_data_directory(data),JSON.stringify(data)) + contentData.data.append(item_to_duplicate) + Helper.json_helper.write_json_file(contentData.dataPath,JSON.stringify(contentData.data)) else: print_debug("There should be code here for when a file in the gets duplicated") - # This function appends a new object to an existing array # Pass the array to this function and the value of the ID # If the data directory ends in .json, it will append an object @@ -105,62 +95,54 @@ func duplicate_item_in_data(data: Array, id: String, newID: String): # if the data directory does not end in .json, a new file will be added # This file will get the name as specified by id, so for example "myhouse" # After the ID is added, the data array will be saved to disk -func add_id_to_data(data: Array, id: String): - if get_data_directory(data).ends_with((".json")): - if get_array_index_by_id(data,id) != -1: +func add_id_to_data(contentData: Dictionary, id: String): + if contentData.dataPath.ends_with((".json")): + if get_array_index_by_id(contentData.data,id) != -1: print_debug("Tried to add an existing id to an array") return - data.append({"id": id}) - save_data_to_file(data) + contentData.data.append({"id": id}) + save_data_to_file(contentData) else: - if id in data: + if id in contentData.data: print_debug("Tried to add an existing file to a file array") return - data.append(id) + contentData.data.append(id) #Create a new json file in the directory with only {} in the file - Helper.json_helper.create_new_json_file(get_data_directory(data) + id + ".json", false) - + Helper.json_helper.create_new_json_file(contentData.dataPath + id + ".json", false) # Will remove an item from the data # If the first item in data is a dictionary, we remove an item that has the provided id # If the first item in data is a string, we remove the string and the associated json file -func remove_item_from_data(data: Array, id: String): - if data[0] is Dictionary: - data.remove_at(get_array_index_by_id(data, id)) - elif data[0] is String: - data.erase(id) - Helper.json_helper.delete_json_file(get_data_directory(data), id) +func remove_item_from_data(contentData: Dictionary, id: String): + if contentData.data.is_empty(): + return + if contentData.data[0] is Dictionary: + contentData.data.remove_at(get_array_index_by_id(contentData.data, id)) + elif contentData.data[0] is String: + contentData.data.erase(id) + Helper.json_helper.delete_json_file(contentData.dataPath, id) else: print_debug("Tried to remove item from data, but the data contains \ neither Dictionary nor String") -func get_data_directory(data: Array) -> String: - if data == all_tiles: - return "./Mods/Core/Tiles/Tiles.json" - if data == all_mobs: - return "./Mods/Core/Mobs/Mobs.json" - if data == all_map_files: - return "./Mods/Core/Maps/" - return "" - -func get_array_index_by_id(data: Array, id: String) -> int: +func get_array_index_by_id(contentData: Dictionary, id: String) -> int: var myIndex: int = -1 var i: int = 0 - for item in data: + for item in contentData.data: if item.get("id", "") == id: myIndex = i break i += 1 return myIndex - -func save_data_to_file(data: Array): - var datadir: String = get_data_directory(data) - if datadir.ends_with((".json")): - Helper.json_helper.write_json_file(datadir,JSON.stringify(data,"\t")) + +func save_data_to_file(contentData: Dictionary): + var datapath: String = contentData.dataPath + if datapath.ends_with(".json"): + Helper.json_helper.write_json_file(datapath,JSON.stringify(contentData.data,"\t")) # This functino is called when an editor has changed data # The contenteditor (that initializes the individual editors) # connects the changed_data signal to this function # and binds the appropriate data array so it can be saved in this function -func on_data_changed(data: Array): - save_data_to_file(data) +func on_data_changed(contentData: Dictionary): + save_data_to_file(contentData) diff --git a/level_generation.tscn b/level_generation.tscn index 5925088d..90c5876e 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -34,6 +34,7 @@ reflected_light_source = 1 [sub_resource type="NavigationMesh" id="NavigationMesh_3licq"] geometry_parsed_geometry_type = 1 geometry_source_geometry_mode = 1 +cell_size = 0.1 agent_height = 0.5 agent_radius = 0.3 agent_max_slope = 46.0 From f6925bb8093d6f40fbe20c907637bca493fdfab4 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 16 Dec 2023 13:22:03 +0100 Subject: [PATCH 038/138] Update markdownlabel see https://github.com/daenvil/MarkdownLabel/pull/6 --- Scripts/Documentation.gd | 5 -- addons/markdownlabel/LICENSE | 21 +++++++ addons/markdownlabel/README.md | 26 ++++---- addons/markdownlabel/markdownlabel.gd | 89 ++++++++++++++++++++------- addons/markdownlabel/plugin.cfg | 2 +- 5 files changed, 104 insertions(+), 39 deletions(-) create mode 100644 addons/markdownlabel/LICENSE diff --git a/Scripts/Documentation.gd b/Scripts/Documentation.gd index da1753ff..892809ab 100644 --- a/Scripts/Documentation.gd +++ b/Scripts/Documentation.gd @@ -63,11 +63,6 @@ func sanitize_filename(input: String) -> String: modifiedString = modifiedString.replace(".md", "") return modifiedString -#This function will be called when the user clicks ona link in the documentation page -func _on_document_display_meta_clicked(meta): - #Open the link in the default browser on the user's OS - OS.shell_open(str(meta)) - #When the user clicks on the back button, return to the main menu func _on_back_button_pressed(): get_tree().change_scene_to_file("res://scene_selector.tscn") diff --git a/addons/markdownlabel/LICENSE b/addons/markdownlabel/LICENSE new file mode 100644 index 00000000..78503da8 --- /dev/null +++ b/addons/markdownlabel/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Daenvil + +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/addons/markdownlabel/README.md b/addons/markdownlabel/README.md index b68508ed..35265970 100644 --- a/addons/markdownlabel/README.md +++ b/addons/markdownlabel/README.md @@ -46,8 +46,7 @@ My initial use case that lead me to do this was to directly include text from fi Simply add a MarkdownLabel to the scene and write its `markdown_text` field in Markdown format. In the RichTextLabel properties: -- **`bbcode_enabled` property must be enabled**. -- Do not touch the `text` property, since it's internally used by MarkdownLabel to properly format its text. +- Do not touch neither the `bbcode_enabled` nor the `text` property, since they are internally used by MarkdownLabel to properly format its text. Both properties are hidden from the editor to prevent mistakenly editing them. - You can use the rest of its properties as normal. You can still use BBCode tags that don't have a Markdown equivalent, such as `[color=green]underlined text[/color]`, allowing you to have the full functionality of RichTextLabel with the simplicity and readibility of Markdown. @@ -58,7 +57,6 @@ You can still use BBCode tags that don't have a Markdown equivalent, such as `[c ### Basic syntax The basic Markdown syntax works in the standard way: - ``` Markdown text ................ -> BBCode equivalent -------------------------------||------------------ @@ -92,7 +90,7 @@ multiline codeblock .......... -> multiline codeblock MarkdownLabel supports headers, although RichTextLabel doesn't. By default, a line defined as a header will have its font size scaled by a pre-defined amount. -To define a line as a header, begin it with any number of consecutive hash symbols (#) and follow it with the title of your header. The number of hash symbols defines the level of the header. The maximum supported level is six.. +To define a line as a header, begin it with any number of consecutive hash symbols (#) and follow it with the title of your header. The number of hash symbols defines the level of the header. The maximum supported level is six. Example: ``` @@ -113,19 +111,25 @@ Of course, you can also use basic formatting within the headers (e.g. `### Heade ### Links -Links follow the standard Markdown syntax of `[text to display](example.com)`. Additionally, you can add tooltips to your links with `[text to display](example.com "Some tooltip")`. +Links follow the standard Markdown syntax of `[text to display](https://example.com)`. Additionally, you can add tooltips to your links with `[text to display](https://example.com "Some tooltip")`. + +"Autolinks" are also supported with their standard syntax: ``, and `` for mail autolinks. + +Links created this way will be automatically handled by MarkdownLabel, implemented their expected behaviour: -"Autolinks" are also supported with their standard syntax: ``, and `` for mail autolinks. +- Valid header anchors (such as the ones in [Contents](#contents)) will make MarkdownLabel scroll to their header's position. +- Valid URLs and emails will be opened according to the user's settings (usually, using their default browser). +- Links that do not match any of the above conditions will be interpreted as a URL by prefixing them with "https://". E.g. `[link](example.com)` will link to "https://example.com". -Keep in mind that, in Godot, **links do nothing by default**. MarkdownLabel treats them the say way (may be changed in the future). See the [RichTextLabel reference](https://docs.godotengine.org/en/stable/tutorials/ui/bbcode_in_richtextlabel.html#doc-bbcode-in-richtextlabel-handling-url-tag-clicks) for more info. +This behavior can be disabled using the `automatic_links` property (enabled by default). ``` Markdown text .............................. -> BBCode equivalent ---------------------------------------------||------------------ -[this is a link](example.com) .............. -> [url=example.com]this is a link[/url] -[this is a link](example.com "Example page") -> [hint=Example url][url=example.com]this is a link[/url][/hint] - .............................. -> [url]example.com[/url] - ......................... -> [url=mailto:mail@example.com]mail@example.com[/url] +[this is a link](https://example.com) .............. -> [url=https://example.com]this is a link[/url] +[this is a link](https://example.com "Example page") -> [hint=Example url][url=https://example.com]this is a link[/url][/hint] + .............................. -> [url]https://example.com[/url] + ................................. -> [url=mailto:mail@example.com]mail@example.com[/url] ``` ### Images diff --git a/addons/markdownlabel/markdownlabel.gd b/addons/markdownlabel/markdownlabel.gd index ca88cfa9..a48e0008 100644 --- a/addons/markdownlabel/markdownlabel.gd +++ b/addons/markdownlabel/markdownlabel.gd @@ -20,10 +20,13 @@ const _ESCAPE_PLACEHOLDER := ";$\uFFFD:%s$;" const _ESCAPEABLE_CHARACTERS := "\\*_~`[]()\"<>#-+.!" const _ESCAPEABLE_CHARACTERS_REGEX := "[\\\\\\*\\_\\~`\\[\\]\\(\\)\\\"\\<\\>#\\-\\+\\.\\!]" -# Public: +#region Public: ## The text to be displayed in Markdown format. @export_multiline var markdown_text: String : set = _set_markdown_text +## If enabled, links will be automatically handled by this node, without needing to manually connect them. Valid header anchors will make the label scroll to that header's position. Valid URLs and e-mails will be opened according to the user's default settings. +@export var automatic_links := true + @export_group("Header formats") ## Formatting options for level-1 headers @export var h1 := H1Format.new() : set = _set_h1_format @@ -37,20 +40,27 @@ const _ESCAPEABLE_CHARACTERS_REGEX := "[\\\\\\*\\_\\~`\\[\\]\\(\\)\\\"\\<\\>#\\- @export var h5 := H5Format.new() : set = _set_h5_format ## Formatting options for level-6 headers @export var h6 := H6Format.new() : set = _set_h6_format +#endregion -# Private: +#region Private: var _converted_text: String var _indent_level: int var _escaped_characters_map := {} +var _current_paragraph: int = 0 +var _header_anchor_paragraph := {} +var _header_anchor_count := {} var _within_table := false var _table_row := -1 var _line_break := true var _debug_mode := false +#endregion -# Built-in methods: +#region Built-in methods: func _init(markdown_text: String = "") -> void: bbcode_enabled = true self.markdown_text = markdown_text + if automatic_links: + meta_clicked.connect(_on_meta_clicked) func _ready() -> void: h1.connect("_updated",_update) @@ -70,18 +80,39 @@ func _ready() -> void: #else: #pass -# Should hide properties in the editor, not working for some reason: -#func _validate_property(property: Dictionary): -# print(property.name) -# if property.name in ["bbcode_enabled", "text"]: -# property.usage = PROPERTY_USAGE_NO_EDITOR +func _on_meta_clicked(meta: Variant) -> void: + if not automatic_links: + return + if typeof(meta) != TYPE_STRING: + return + if meta.begins_with("#") and meta in _header_anchor_paragraph: + self.scroll_to_paragraph(_header_anchor_paragraph[meta]) + return + var url_pattern := RegEx.new() + url_pattern.compile("^(ftp|http|https):\\/\\/[^\\s\\\"]+$") + var result := url_pattern.search(meta) + if not result: + url_pattern.compile("^mailto:[^\\s]+@[^\\s]+\\.[^\\s]+$") + result = url_pattern.search(meta) + if result: + OS.shell_open(meta) + return + OS.shell_open("https://" + meta) + +func _validate_property(property: Dictionary): + # Hide these properties in the editor: + if property.name in ["bbcode_enabled", "text"]: + property.usage = PROPERTY_USAGE_NO_EDITOR + +#endregion -# Public methods: +#region Public methods: ## Reads the specified file and displays it as markdown. -func display_file(file_path: String): +func display_file(file_path: String) -> void: markdown_text = FileAccess.get_file_as_string(file_path) +#endregion -#Private methods: +#region Private methods: func _update() -> void: text = _convert_markdown(markdown_text) queue_redraw() @@ -136,16 +167,18 @@ func _convert_markdown(source_text = "") -> String: for line in lines: line = line.trim_suffix("\r") - _debug("Parsing line: '%s'"%line) + _debug("Parsing line: '%s'" % line) within_code_block = within_tilde_block or within_backtick_block if iline > 0 and _line_break: _converted_text += "\n" + _current_paragraph += 1 _line_break = true iline+=1 if not within_tilde_block and _denotes_fenced_code_block(line,"`"): if within_backtick_block: if line.strip_edges().length() >= current_code_block_char_count: _converted_text = _converted_text.trim_suffix("\n") + _current_paragraph -= 1 _converted_text += "[/code]" within_backtick_block = false _debug("... closing backtick block") @@ -160,6 +193,7 @@ func _convert_markdown(source_text = "") -> String: if within_tilde_block: if line.strip_edges().length() >= current_code_block_char_count: _converted_text = _converted_text.trim_suffix("\n") + _current_paragraph -= 1 _converted_text += "[/code]" within_tilde_block = false _debug("... closing tilde block") @@ -365,13 +399,13 @@ func _convert_markdown(source_text = "") -> String: break n_spaces+=1 var header_format: Resource = _get_header_format(n) - var n_digits := str(header_format.font_size).length() var _start := result.get_start() var opening_tags := _get_header_tags(header_format) _processed_line = _processed_line.erase(_start,n+n_spaces).insert(_start,opening_tags) var _end := result.get_end() _processed_line = _processed_line.insert(_end-(n+n_spaces)+opening_tags.length(),_get_header_tags(header_format,true)) _debug("... header level %d"%n) + _header_anchor_paragraph[_get_header_reference(result.get_string())] = _current_paragraph else: break @@ -382,8 +416,8 @@ func _convert_markdown(source_text = "") -> String: # end for line loop # Close any remaining open list: _debug("... end of text, closing all opened lists") - for i in range(_indent_level,-1,-1): - _converted_text += "[/%s]"%indent_types[i] + for i in range(_indent_level, -1, -1): + _converted_text += "[/%s]" % indent_types[i] # Close any remaining open tables: _debug("... end of text, closing all opened tables") if _within_table: @@ -398,16 +432,16 @@ func _convert_markdown(source_text = "") -> String: func _process_list_syntax(line: String, indent_spaces: Array, indent_types: Array) -> String: var processed_line := "" if line.length() == 0 and _indent_level >= 0: - for i in range(_indent_level,-1,-1): + for i in range(_indent_level, -1, -1): _converted_text += "[/%s]" % indent_types[_indent_level] - _indent_level-=1 + _indent_level -= 1 indent_spaces.pop_back() indent_types.pop_back() _converted_text += "\n" _debug("... empty line, closing all list tags") return "" if _indent_level == -1: - if line.length() > 2 and line[0] in "-*+" and line[1]==" ": + if line.length() > 2 and line[0] in "-*+" and line[1] == " ": _indent_level = 0 indent_spaces.append(0) indent_types.append("ul") @@ -444,9 +478,9 @@ func _process_list_syntax(line: String, indent_spaces: Array, indent_types: Arra _debug("... opening list at level %d and adding element"%_indent_level) break else: - for i in range(_indent_level,-1,-1): + for i in range(_indent_level, -1, -1): if n_s < indent_spaces[i]: - _converted_text += "[/%s]"%indent_types[_indent_level] + _converted_text += "[/%s]" % indent_types[_indent_level] _indent_level -= 1 indent_spaces.pop_back() indent_types.pop_back() @@ -454,7 +488,7 @@ func _process_list_syntax(line: String, indent_spaces: Array, indent_types: Arra break _converted_text += "\n" processed_line = line.substr(n_s+2) - _debug("...closing lists down to level %d and adding element"%_indent_level) + _debug("...closing lists down to level %d and adding element" % _indent_level) break elif _char in "123456789": if line.length() > n_s+3 and line[n_s+1] == "." and line[n_s+2] == " ": @@ -481,7 +515,7 @@ func _process_list_syntax(line: String, indent_spaces: Array, indent_types: Arra break _converted_text += "\n" processed_line = line.substr(n_s+3) - _debug("...closing lists down to level %d and adding element"%_indent_level) + _debug("... closing lists down to level %d and adding element"%_indent_level) break #end for _char loop if processed_line.is_empty(): @@ -597,3 +631,14 @@ func _get_header_tags(header_format: Resource, closing := false) -> String: if header_format.is_underlined: tags += "[u]" return tags + +func _get_header_reference(header_string: String): + var anchor := "#" + header_string.lstrip("#").strip_edges().to_lower().replace(" ","-") + if anchor in _header_anchor_count: + _header_anchor_count[anchor] += 1 + anchor += "-" + str(_header_anchor_count[anchor]-1) + else: + _header_anchor_count[anchor] = 1 + return anchor + +#endregion diff --git a/addons/markdownlabel/plugin.cfg b/addons/markdownlabel/plugin.cfg index 77a744cb..5d989e6e 100644 --- a/addons/markdownlabel/plugin.cfg +++ b/addons/markdownlabel/plugin.cfg @@ -3,5 +3,5 @@ name="MarkdownLabel" description="A custom node that extends RichTextLabel to use Markdown instead of BBCode." author="Daenvil" -version="0.9.0" +version="1.1.0" script="plugin.gd" From 9bb46157038d1a475a54c4bc61f98214ec2addc8 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 16 Dec 2023 16:06:00 +0100 Subject: [PATCH 039/138] Limit input rect on tilegrid --- .../Mapeditor/Scripts/GridContainer.gd | 30 ++++++++++++------- .../Mapeditor/Scripts/mapeditortile.gd | 4 --- .../ContentManager/Mapeditor/mapeditor.tscn | 3 +- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 1a686583..a079dab2 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -8,6 +8,7 @@ var currentLevelData: Array[Dictionary] = [] @export var LevelScrollBar: VScrollBar @export var levelgrid_below: GridContainer @export var levelgrid_above: GridContainer +@export var mapScrollWindow: ScrollContainer var selected_brush: Control var drawRectangle: bool = false @@ -60,6 +61,15 @@ func _input(event): #The mapeditor may be invisible if the user selects another tab in the content editor if !mapEditor.visible: return + + # Convert the mouse position to MapScrollWindow's local coordinate system + var local_mouse_pos = mapScrollWindow.get_local_mouse_position() + var mapScrollWindowRect = mapScrollWindow.get_rect() + + # Check if the mouse is within the MapScrollWindow's rect + if !mapScrollWindowRect.has_point(local_mouse_pos): + return + if event is InputEventMouseButton: match event.button_index: MOUSE_BUTTON_WHEEL_UP: @@ -77,15 +87,15 @@ func _input(event): if Input.is_key_pressed(KEY_CTRL) or Input.is_key_pressed(KEY_ALT): get_viewport().set_input_as_handled() MOUSE_BUTTON_LEFT: - if drawRectangle: - if event.is_pressed(): - start_point = event.global_position.snapped(snapLevel) - is_drawing = true - else: - end_point = event.global_position.snapped(snapLevel) - is_drawing = false - paint_in_rectangle() + if event.is_pressed(): + is_drawing = true + start_point = event.global_position.snapped(snapLevel) else: + end_point = event.global_position.snapped(snapLevel) + if is_drawing == true: + if drawRectangle: + paint_in_rectangle() + unhighlight_tiles() is_drawing = false #When the users presses and holds the mouse wheel, we scoll the grid @@ -96,10 +106,8 @@ func _input(event): #Change the color to be red func update_rectangle(): - if is_drawing: + if is_drawing and drawRectangle: highlight_tiles_in_rect() - else: - unhighlight_tiles() #When one of the grid tiles is clicked, we paint the tile accordingly func grid_tile_clicked(clicked_tile): diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index 7833f864..97c79de5 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -40,10 +40,6 @@ func set_tile_id(id: String) -> void: var tileTexture: Resource = Gamedata.data.tiles.sprites[jsonTile.sprite] $TextureRect.texture = tileTexture.albedo_texture -func _on_texture_rect_mouse_entered() -> void: - if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): - tile_clicked.emit(self) - func set_default() -> void: tileData = defaultTileData.duplicate() diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index c2cd8d97..2e500662 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -130,7 +130,7 @@ grow_horizontal = 2 grow_vertical = 2 color = Color(0.313726, 0.313726, 0.313726, 1) -[node name="TileGrid" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer" node_paths=PackedStringArray("mapEditor", "LevelScrollBar", "levelgrid_below", "levelgrid_above")] +[node name="TileGrid" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer" node_paths=PackedStringArray("mapEditor", "LevelScrollBar", "levelgrid_below", "levelgrid_above", "mapScrollWindow")] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -146,6 +146,7 @@ mapEditor = NodePath("../../../../../../..") LevelScrollBar = NodePath("../../../../Levelscroller/LevelScrollbar") levelgrid_below = NodePath("../Level_Below") levelgrid_above = NodePath("../Level_Above") +mapScrollWindow = NodePath("../../..") [node name="Level_Below" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer"] modulate = Color(1, 1, 1, 0.0980392) From cc6c8fba2aeb42e536429db9f3fd4f9d9b288f6d Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 16 Dec 2023 17:20:19 +0100 Subject: [PATCH 040/138] Limit painting only to when drawing --- .../ContentManager/Mapeditor/Scripts/GridContainer.gd | 11 ++++++----- .../ContentManager/Mapeditor/Scripts/mapeditortile.gd | 4 ++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index a079dab2..5a51d2cb 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -65,7 +65,6 @@ func _input(event): # Convert the mouse position to MapScrollWindow's local coordinate system var local_mouse_pos = mapScrollWindow.get_local_mouse_position() var mapScrollWindowRect = mapScrollWindow.get_rect() - # Check if the mouse is within the MapScrollWindow's rect if !mapScrollWindowRect.has_point(local_mouse_pos): return @@ -100,9 +99,10 @@ func _input(event): #When the users presses and holds the mouse wheel, we scoll the grid if event is InputEventMouseMotion: + end_point = event.global_position if is_drawing: - end_point = event.global_position - update_rectangle() + if drawRectangle: + update_rectangle() #Change the color to be red func update_rectangle(): @@ -111,12 +111,13 @@ func update_rectangle(): #When one of the grid tiles is clicked, we paint the tile accordingly func grid_tile_clicked(clicked_tile): - paint_single_tile(clicked_tile) + if is_drawing: + paint_single_tile(clicked_tile) #We paint a single tile if draw rectangle is not selected # Either erase the tile or paint it if a brush is selected. func paint_single_tile(clicked_tile): - if drawRectangle: + if drawRectangle or !clicked_tile: return if erase: clicked_tile.set_default() diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index 97c79de5..7833f864 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -40,6 +40,10 @@ func set_tile_id(id: String) -> void: var tileTexture: Resource = Gamedata.data.tiles.sprites[jsonTile.sprite] $TextureRect.texture = tileTexture.albedo_texture +func _on_texture_rect_mouse_entered() -> void: + if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): + tile_clicked.emit(self) + func set_default() -> void: tileData = defaultTileData.duplicate() From e092de27452eb258a7c6713b05877a1b31ba53ec Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 17 Dec 2023 10:11:22 +0100 Subject: [PATCH 041/138] Add icons to replace text Add icons to replace text for gui elements in the map editor --- Images/Icons/IconArrowDownChecked.png | Bin 0 -> 364 bytes Images/Icons/IconArrowDownChecked.png.import | 34 ++++++++++++++++++ Images/Icons/IconArrowDownUnchecked.png | Bin 0 -> 411 bytes .../Icons/IconArrowDownUnchecked.png.import | 34 ++++++++++++++++++ Images/Icons/IconArrowUpChecked.png | Bin 0 -> 386 bytes Images/Icons/IconArrowUpChecked.png.import | 34 ++++++++++++++++++ Images/Icons/IconArrowUpUnchecked.png | Bin 0 -> 392 bytes Images/Icons/IconArrowUpUnchecked.png.import | 34 ++++++++++++++++++ Images/Icons/IconEraserChecked.png | Bin 0 -> 266 bytes Images/Icons/IconEraserChecked.png.import | 34 ++++++++++++++++++ Images/Icons/IconEraserUnchecked.png | Bin 0 -> 310 bytes Images/Icons/IconEraserUnchecked.png.import | 34 ++++++++++++++++++ Images/Icons/IconRectangleChecked.png | Bin 0 -> 306 bytes Images/Icons/IconRectangleChecked.png.import | 34 ++++++++++++++++++ Images/Icons/IconRectangleUnchecked.png | Bin 0 -> 329 bytes .../Icons/IconRectangleUnchecked.png.import | 34 ++++++++++++++++++ .../ContentManager/Mapeditor/mapeditor.tscn | 27 ++++++++++---- 17 files changed, 293 insertions(+), 6 deletions(-) create mode 100644 Images/Icons/IconArrowDownChecked.png create mode 100644 Images/Icons/IconArrowDownChecked.png.import create mode 100644 Images/Icons/IconArrowDownUnchecked.png create mode 100644 Images/Icons/IconArrowDownUnchecked.png.import create mode 100644 Images/Icons/IconArrowUpChecked.png create mode 100644 Images/Icons/IconArrowUpChecked.png.import create mode 100644 Images/Icons/IconArrowUpUnchecked.png create mode 100644 Images/Icons/IconArrowUpUnchecked.png.import create mode 100644 Images/Icons/IconEraserChecked.png create mode 100644 Images/Icons/IconEraserChecked.png.import create mode 100644 Images/Icons/IconEraserUnchecked.png create mode 100644 Images/Icons/IconEraserUnchecked.png.import create mode 100644 Images/Icons/IconRectangleChecked.png create mode 100644 Images/Icons/IconRectangleChecked.png.import create mode 100644 Images/Icons/IconRectangleUnchecked.png create mode 100644 Images/Icons/IconRectangleUnchecked.png.import diff --git a/Images/Icons/IconArrowDownChecked.png b/Images/Icons/IconArrowDownChecked.png new file mode 100644 index 0000000000000000000000000000000000000000..ea409e01af61d66a3fccf249646f81829aa495eb GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`i1EZ&lV~B_M+sS(cn+;_0 z0tq8FWkaT=llvn!Df|;;m3{A5?s(~CqM-C|gRFzQ)@@sty<4aI^os!QRjW1~lZX~+ z1+fk0JmOoga9Z2KgPd)i_ z-Rqd6hwmOXnA7HS`H7Z&O7DW;;5WbDY015F+n6bpcdYZt_X*7hN=<9;%m38=SGvzZ zDO^>xXhxdp5l@BjL);Ul^u|iIvsQd?WGsuNvFK!+LMBjf9=zj69FHUoZ9lp%8y1Zj%o8 zlS;nF7D4@Tx2y|d#g}C=9X437F8kG9w`z6^%T4RFvr8|E-FX^caPq#uihCU5cWOO6 zB-$=)(>+q?V{09=Kx#>n1lv>ThfS69BDdAw3+glYqCk1Rd%-Z+3AvJQ!UyqRIiqqHx#WfDGdQ3}wliZfD@`KGemGq^Y zO%0pE<5)ZbMMO@j?t33UE$y*y!Ys9rP}iG!f`aPPrvmv6b3D%-IGMWiriG}2`$@sj zyRJ)^T+|NUUbbp?M^J-|>bBg?x0juM|8w;Y_5Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L0T)R`K~zXf?UpeP zgD?yLlTM6`@Eb-}HlD!94;bMGj68!c@dMZ>Mlo`Nlb8XiLr;nfIQ2CyiK_Pl^&%e= z#VpHWu4IS>+qS8ys#KomN^7l#VKA8p(4rXYy6$CJLMyG&_r00nMV)?`^`GQ0qQ*3ewrwkE>}xYi)Fh)dUXR}NN$+-A}u*cyc9IIvaL zs!hD$CLu8a{2oP7*sC`2f}4cI1RRf!YdGW(>Bk-)*H8HiqWqTN*du2=_Q)AUz-uZc gv`2ir{I^A^FK>UT$BlnE9{>OV07*qoM6N<$f|l-?tN;K2 literal 0 HcmV?d00001 diff --git a/Images/Icons/IconArrowUpChecked.png.import b/Images/Icons/IconArrowUpChecked.png.import new file mode 100644 index 00000000..f6aa8b66 --- /dev/null +++ b/Images/Icons/IconArrowUpChecked.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dk8cdxff84idk" +path="res://.godot/imported/IconArrowUpChecked.png-2daff76cbd86b523e4eb19104a7f04da.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Images/Icons/IconArrowUpChecked.png" +dest_files=["res://.godot/imported/IconArrowUpChecked.png-2daff76cbd86b523e4eb19104a7f04da.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Images/Icons/IconArrowUpUnchecked.png b/Images/Icons/IconArrowUpUnchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..8677a17a75215df6a2d7a3d5bcb78397a055acb1 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`igRG~EV~B_M+i4s5Tnr?R@85kg!Jvv^vAcp{ zh34drj*}WWYKapi-r7ugtM|0nt9zIAN#5_?F8?omSss6T$@Xoz@&$_JHSxzZ9YtId zWpWPrYSP=B zW+!MPuQej&3B`7&D|>AR|?KQ z&x>kU9{&01(#gIv`rKA2|8ko)StV%wH%hd8^rGVVlvGib+lreM4oJSca%Q3!%Z|q( zTe$2V$ORV~u5!L(-M*1kV(aT7T%9smFU literal 0 HcmV?d00001 diff --git a/Images/Icons/IconEraserChecked.png.import b/Images/Icons/IconEraserChecked.png.import new file mode 100644 index 00000000..7eeeffee --- /dev/null +++ b/Images/Icons/IconEraserChecked.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7pbgyyv6lna1" +path="res://.godot/imported/IconEraserChecked.png-ebf0d5f79f06bb0e1dc4c215cb24639c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Images/Icons/IconEraserChecked.png" +dest_files=["res://.godot/imported/IconEraserChecked.png-ebf0d5f79f06bb0e1dc4c215cb24639c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Images/Icons/IconEraserUnchecked.png b/Images/Icons/IconEraserUnchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ecd02d789aeaace79fc9ed9d8305257f10852e GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`i@U*9kV~B_M)@hA=O$IzJ%l~g(f4_aDyN=}2 zw|5=llhiKV)y{UR=`oDUZM^q;Tiv%@?Z-c3Rdr+@{H~e1QKch6De}Osvo4bkaS!LY^z~Xm3i>}&AqpZ#zBp@_D;Oo-W1=;T;-y3=kaTQru)3jSLIm( z3q=EDdpB}NOxVA^rMZAjqt7g2g%sZ@MfXKh3j(-!#DX?*KNGmG+M&{AQOo4gTe~DWM4f DpyYa= literal 0 HcmV?d00001 diff --git a/Images/Icons/IconEraserUnchecked.png.import b/Images/Icons/IconEraserUnchecked.png.import new file mode 100644 index 00000000..dacb719b --- /dev/null +++ b/Images/Icons/IconEraserUnchecked.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hik7bkdfc51t" +path="res://.godot/imported/IconEraserUnchecked.png-9663af8211b301c6fcb28205f1327f90.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Images/Icons/IconEraserUnchecked.png" +dest_files=["res://.godot/imported/IconEraserUnchecked.png-9663af8211b301c6fcb28205f1327f90.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Images/Icons/IconRectangleChecked.png b/Images/Icons/IconRectangleChecked.png new file mode 100644 index 0000000000000000000000000000000000000000..7701b52d5d1139be164e2caa04ade1a847d763d9 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`i@VKXoV~B_M+bIWmTNMOc#1FA{e>iv2iRY@6 z_6DZt1sr4{H$`?o6h0|Tiqnu7QOq!{3`bRXP4Oa ztbnz>w$amAFPn7k;=8&aN_x4Y_oOH4&0*72pD%aZ{59mx=Nq*xrth+YqiyaoR51U~ WT`1(kFuMroQwC30KbLh*2~7ZLj)4#W literal 0 HcmV?d00001 diff --git a/Images/Icons/IconRectangleUnchecked.png.import b/Images/Icons/IconRectangleUnchecked.png.import new file mode 100644 index 00000000..d269d15f --- /dev/null +++ b/Images/Icons/IconRectangleUnchecked.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxhp6hye2ufp2" +path="res://.godot/imported/IconRectangleUnchecked.png-ca0b9493135439774e217d9c1d78b281.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Images/Icons/IconRectangleUnchecked.png" +dest_files=["res://.godot/imported/IconRectangleUnchecked.png-ca0b9493135439774e217d9c1d78b281.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 2e500662..3ef353b6 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -1,13 +1,21 @@ -[gd_scene load_steps=11 format=3 uid="uid://d3001f5xxpup1"] +[gd_scene load_steps=19 format=3 uid="uid://d3001f5xxpup1"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd" id="1_0c7s4"] [ext_resource type="PackedScene" uid="uid://bswccbbg6ijep" path="res://Scenes/ContentManager/Mapeditor/Toolbar/mapeditorzoomscroller.tscn" id="1_0ytmu"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd" id="2_sf17m"] +[ext_resource type="Texture2D" uid="uid://cxhp6hye2ufp2" path="res://Images/Icons/IconRectangleUnchecked.png" id="3_70koh"] +[ext_resource type="Texture2D" uid="uid://5fsf8rh6w0pb" path="res://Images/Icons/IconRectangleChecked.png" id="3_eu7pp"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/Levelscroller.gd" id="3_i1qbw"] [ext_resource type="PackedScene" uid="uid://3x0kjiu7lqg7" path="res://Scenes/ContentManager/Mapeditor/mapeditortile.tscn" id="4_lqbjy"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd" id="5_he816"] +[ext_resource type="Texture2D" uid="uid://7pbgyyv6lna1" path="res://Images/Icons/IconEraserChecked.png" id="5_n3fyt"] +[ext_resource type="Texture2D" uid="uid://hik7bkdfc51t" path="res://Images/Icons/IconEraserUnchecked.png" id="6_6lnwx"] [ext_resource type="PackedScene" uid="uid://be62h2ytgw2kb" path="res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn" id="6_onaby"] +[ext_resource type="Texture2D" uid="uid://kjsnbbs2o68u" path="res://Images/Icons/IconArrowDownChecked.png" id="7_s4wos"] [ext_resource type="PackedScene" uid="uid://cccnrdolr1bfo" path="res://Scenes/ContentManager/Mapeditor/tilebrush.tscn" id="8_o4x7s"] +[ext_resource type="Texture2D" uid="uid://bsxgq272ca2kw" path="res://Images/Icons/IconArrowDownUnchecked.png" id="8_xcusj"] +[ext_resource type="Texture2D" uid="uid://dk8cdxff84idk" path="res://Images/Icons/IconArrowUpChecked.png" id="9_etume"] +[ext_resource type="Texture2D" uid="uid://biircfcjvj7lp" path="res://Images/Icons/IconArrowUpUnchecked.png" id="10_0rhye"] [sub_resource type="Gradient" id="Gradient_x1sdl"] @@ -90,20 +98,27 @@ text = "32" [node name="DrawRectangle" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 -text = "Rectangle" +tooltip_text = "Paint in a rectangle" +theme_override_icons/checked = ExtResource("3_eu7pp") +theme_override_icons/unchecked = ExtResource("3_70koh") [node name="Erase" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 -text = "Erase" +tooltip_text = "Erase tiles on the map" +theme_override_icons/checked = ExtResource("5_n3fyt") +theme_override_icons/unchecked = ExtResource("6_6lnwx") [node name="ShowBelow" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 -text = "Below" +tooltip_text = "Show the level below" +theme_override_icons/checked = ExtResource("7_s4wos") +theme_override_icons/unchecked = ExtResource("8_xcusj") [node name="ShowAbove" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 -text = "Above -" +tooltip_text = "Show the level above" +theme_override_icons/checked = ExtResource("9_etume") +theme_override_icons/unchecked = ExtResource("10_0rhye") [node name="HBoxContainer" type="HBoxContainer" parent="HSplitContainer/MapeditorContainer"] layout_mode = 2 From f29977555bb874104ce5f0cbd5b1f3874d55675d Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 17 Dec 2023 11:43:56 +0100 Subject: [PATCH 042/138] Add brush preview --- .../Mapeditor/Scripts/GridContainer.gd | 27 +++++++++++++++++++ .../Mapeditor/Scripts/mapeditor.gd | 1 + .../ContentManager/Mapeditor/mapeditor.tscn | 9 ++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 5a51d2cb..16bdf281 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -9,6 +9,7 @@ var currentLevelData: Array[Dictionary] = [] @export var levelgrid_below: GridContainer @export var levelgrid_above: GridContainer @export var mapScrollWindow: ScrollContainer +@export var brushPreviewTexture: TextureRect var selected_brush: Control var drawRectangle: bool = false @@ -35,6 +36,8 @@ func _on_mapeditor_ready(): snapAmount = 1.28*mapEditor.zoom_level levelgrid_below.hide() levelgrid_above.hide() + zoom_level_changed.connect(_on_zoom_level_changed) + _on_zoom_level_changed(mapEditor.zoom_level) # This function will fill fill this GridContainer with a grid of 32x32 instances of "res://Scenes/ContentManager/Mapeditor/mapeditortile.tscn" func createTiles(): @@ -103,6 +106,16 @@ func _input(event): if is_drawing: if drawRectangle: update_rectangle() + + # Calculate new position for the brush preview + var new_position = event.position + brushPreviewTexture.get_rect().size / 2 + # Get the boundaries of the mapScrollWindow + var scroll_global_pos = mapScrollWindow.get_global_position() + # Clamp the new position to the mapScrollWindow's boundaries + new_position.x = clamp(new_position.x, scroll_global_pos.x, scroll_global_pos.x + mapScrollWindowRect.size.x - brushPreviewTexture.get_rect().size.x) + new_position.y = clamp(new_position.y, scroll_global_pos.y, scroll_global_pos.y + mapScrollWindowRect.size.y - brushPreviewTexture.get_rect().size.y) + # Update the position of the brush preview + brushPreviewTexture.global_position = new_position #Change the color to be red func update_rectangle(): @@ -220,6 +233,14 @@ func _on_draw_rectangle_toggled(button_pressed): func _on_tilebrush_list_tile_brush_selection_change(tilebrush): selected_brush = tilebrush + update_preview_texture() + +func update_preview_texture(): + if selected_brush: + brushPreviewTexture.texture = selected_brush.get_texture() + brushPreviewTexture.visible = true + else: + brushPreviewTexture.visible = false func _on_show_below_toggled(button_pressed): showBelow = button_pressed @@ -245,3 +266,9 @@ func save_map_json_file(): func load_map_json_file(): var fileToLoad: String = mapEditor.contentSource mapData = Helper.json_helper.load_json_dictionary_file(fileToLoad) + + +func _on_zoom_level_changed(zoom_level: int): + # Calculate the new scale based on zoom level + var scale_factor = zoom_level * 0.01 # Adjust this factor as needed + brushPreviewTexture.scale = Vector2(scale_factor, scale_factor) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd index d0171b03..81f172c2 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd @@ -24,6 +24,7 @@ var zoom_level: int = 20: func _ready(): setPanWindowSize() + zoom_level = 20 func setPanWindowSize(): var panWindowWidth: float = 0.8*tileSize*mapWidth diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 3ef353b6..8ebf5adc 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -145,7 +145,7 @@ grow_horizontal = 2 grow_vertical = 2 color = Color(0.313726, 0.313726, 0.313726, 1) -[node name="TileGrid" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer" node_paths=PackedStringArray("mapEditor", "LevelScrollBar", "levelgrid_below", "levelgrid_above", "mapScrollWindow")] +[node name="TileGrid" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer" node_paths=PackedStringArray("mapEditor", "LevelScrollBar", "levelgrid_below", "levelgrid_above", "mapScrollWindow", "brushPreviewTexture")] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -162,6 +162,7 @@ LevelScrollBar = NodePath("../../../../Levelscroller/LevelScrollbar") levelgrid_below = NodePath("../Level_Below") levelgrid_above = NodePath("../Level_Above") mapScrollWindow = NodePath("../../..") +brushPreviewTexture = NodePath("../../../../../../../BrushPreviewTexture") [node name="Level_Below" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer"] modulate = Color(1, 1, 1, 0.0980392) @@ -220,6 +221,12 @@ script = ExtResource("5_he816") scrolling_Flow_Container = ExtResource("6_onaby") tileBrush = ExtResource("8_o4x7s") +[node name="BrushPreviewTexture" type="TextureRect" parent="."] +visible = false +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + [connection signal="ready" from="." to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_mapeditor_ready"] [connection signal="zoom_level_changed" from="." to="HSplitContainer/MapeditorContainer/Toolbar/ZoomScroller" method="_on_mapeditor_zoom_level_changed"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/CloseButton" to="." method="_on_close_button_button_up"] From ae0cab299ea774d018ad2549fbe521952222db15 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 17 Dec 2023 14:00:33 +0100 Subject: [PATCH 043/138] Add rotation to mapeditor --- Images/Icons/IconRotateLeft.png | Bin 0 -> 294 bytes Images/Icons/IconRotateLeft.png.import | 34 ++++++++++++++++++ Images/Icons/IconRotateLeftDark.png | Bin 0 -> 300 bytes Images/Icons/IconRotateLeftDark.png.import | 34 ++++++++++++++++++ Images/Icons/IconRotateRight.png | Bin 0 -> 262 bytes Images/Icons/IconRotateRight.png.import | 34 ++++++++++++++++++ Images/Icons/IconRotateRightDark.png | Bin 0 -> 301 bytes Images/Icons/IconRotateRightDark.png.import | 34 ++++++++++++++++++ .../Mapeditor/Scripts/GridContainer.gd | 18 ++++++++-- .../Mapeditor/Scripts/mapeditor.gd | 5 --- .../Mapeditor/Scripts/mapeditortile.gd | 18 +++++++--- .../ContentManager/Mapeditor/mapeditor.tscn | 27 ++++++++++++-- .../Mapeditor/mapeditortile.tscn | 1 + 13 files changed, 192 insertions(+), 13 deletions(-) create mode 100644 Images/Icons/IconRotateLeft.png create mode 100644 Images/Icons/IconRotateLeft.png.import create mode 100644 Images/Icons/IconRotateLeftDark.png create mode 100644 Images/Icons/IconRotateLeftDark.png.import create mode 100644 Images/Icons/IconRotateRight.png create mode 100644 Images/Icons/IconRotateRight.png.import create mode 100644 Images/Icons/IconRotateRightDark.png create mode 100644 Images/Icons/IconRotateRightDark.png.import diff --git a/Images/Icons/IconRotateLeft.png b/Images/Icons/IconRotateLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..bc66908e082e022c73a72344816845fb14d02d1c GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`iaJQ$6V~B_M)@j^)4F(*}=I`s%r@B0AOBI=` zZz#n)#p%zLze^;t)?UBL%dz;zy3hGGG7H|>N`yBz`xH7pT0BQpc^0Q>W6pPukmR3} z)_Qn3Ok2h7?X}>2p4ye;rj0(~wt@E^BwPy>D`j+F;uLm9c)qFVy92_>p1MDIy;&|W zFZ=V%!Tr{~WpUyc-z?s9p;5%ab9=ZxZ3;yb$#BgOJdR-LpBr7Wyh&3hke2ZZV@&v^DmC;Km6emye|T&a}R8WKYYq zKW(Z^FBp^SiVrB~<_E9k&i)oQ?_~qm0;OBECqLMJP^owk%g?u_uwsI#oboTFrlN;@ ri%CJqQzn;( z{q2E=#fZokNk@(VqhdE6;2MsbBRmn68J z|B!96AvtBwPp4){&V7F!z0=M`h;c+^q@7rL>dQaINy3+lKlfZb2y`Zcr>mdKI;Vst E0JWW9i2wiq literal 0 HcmV?d00001 diff --git a/Images/Icons/IconRotateRight.png.import b/Images/Icons/IconRotateRight.png.import new file mode 100644 index 00000000..82fd3b4d --- /dev/null +++ b/Images/Icons/IconRotateRight.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dixj0spya5p0y" +path="res://.godot/imported/IconRotateRight.png-dc8e2845f1ed0b218ed9451c1795c11a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Images/Icons/IconRotateRight.png" +dest_files=["res://.godot/imported/IconRotateRight.png-dc8e2845f1ed0b218ed9451c1795c11a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Images/Icons/IconRotateRightDark.png b/Images/Icons/IconRotateRightDark.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdbf52b620050dfb139d700d7fad0fbe59a3b97 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`i@Q|mAV~B_M)@h74K#t z3)kLJaZ66v?j365rFmaO;d#t@Ilr}4Uq7sTzCY1xL1^~`&1IY(H;2b3as0Ke%q|^i0kf459k(%>zyD-AOs; zHAUFy0|Rf_*QZ7sTzZS@ebe6`?76xpmEXfb*zvpS-MWOC360C&39XrSxao?-v=_ad uX5nucdA~?4{J8#Ginrjy`(o0Xe;Kwu&dP~ void: if event.pressed: tile_clicked.emit(self) -#func set_texture(res: Resource) -> void: - #$TextureRect.texture = res - #var path: String = res.resource_path - #tileData.texture = path.get_file() +func set_rotation_amount(amount: int) -> void: + $TextureRect.rotation_degrees = amount + tileData.rotation = amount + +func get_rotation_amount() -> int: + return $TextureRect.rotation_degrees + +func set_scale_amount(scaleAmount: int) -> void: + custom_minimum_size.x = scaleAmount + custom_minimum_size.y = scaleAmount func set_tile_id(id: String) -> void: tileData.id = id @@ -65,3 +71,7 @@ func set_above(): $TextureRect.texture = load(aboveTexture) else: $TextureRect.texture = null + + +func _on_texture_rect_resized(): + $TextureRect.pivot_offset = size / 2 diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 8ebf5adc..7fb2cc0c 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=19 format=3 uid="uid://d3001f5xxpup1"] +[gd_scene load_steps=22 format=3 uid="uid://d3001f5xxpup1"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd" id="1_0c7s4"] [ext_resource type="PackedScene" uid="uid://bswccbbg6ijep" path="res://Scenes/ContentManager/Mapeditor/Toolbar/mapeditorzoomscroller.tscn" id="1_0ytmu"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd" id="2_sf17m"] +[ext_resource type="Texture2D" uid="uid://b6m2bbbpmsyik" path="res://Images/Icons/IconRotateRightDark.png" id="3_8q2iq"] [ext_resource type="Texture2D" uid="uid://cxhp6hye2ufp2" path="res://Images/Icons/IconRectangleUnchecked.png" id="3_70koh"] [ext_resource type="Texture2D" uid="uid://5fsf8rh6w0pb" path="res://Images/Icons/IconRectangleChecked.png" id="3_eu7pp"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/Levelscroller.gd" id="3_i1qbw"] @@ -23,6 +24,14 @@ gradient = SubResource("Gradient_x1sdl") width = 24 +[sub_resource type="InputEventKey" id="InputEventKey_nrfa0"] +device = -1 +keycode = 82 +unicode = 114 + +[sub_resource type="Shortcut" id="Shortcut_1tryc"] +events = [SubResource("InputEventKey_nrfa0")] + [node name="mapeditor" type="Control" node_paths=PackedStringArray("panWindow", "mapScrollWindow", "gridContainer", "tileGrid")] layout_mode = 3 anchors_preset = 15 @@ -96,6 +105,14 @@ theme_override_constants/line_spacing = 0 theme_override_font_sizes/font_size = 16 text = "32" +[node name="RotateRight" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar" node_paths=PackedStringArray("shortcut_context")] +layout_mode = 2 +tooltip_text = "Rotate the brush to paint with rotation" +shortcut_context = NodePath("../../../..") +theme_override_icons/checked = ExtResource("3_8q2iq") +theme_override_icons/unchecked = ExtResource("3_8q2iq") +shortcut = SubResource("Shortcut_1tryc") + [node name="DrawRectangle" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 tooltip_text = "Paint in a rectangle" @@ -165,7 +182,7 @@ mapScrollWindow = NodePath("../../..") brushPreviewTexture = NodePath("../../../../../../../BrushPreviewTexture") [node name="Level_Below" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer"] -modulate = Color(1, 1, 1, 0.0980392) +modulate = Color(1, 1, 1, 0.117647) layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -173,6 +190,8 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 +theme_override_constants/h_separation = 0 +theme_override_constants/v_separation = 0 columns = 32 [node name="Level_Above" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer"] @@ -184,6 +203,8 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 +theme_override_constants/h_separation = 0 +theme_override_constants/v_separation = 0 columns = 32 [node name="Levelscroller" type="VBoxContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer"] @@ -229,9 +250,11 @@ offset_bottom = 40.0 [connection signal="ready" from="." to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_mapeditor_ready"] [connection signal="zoom_level_changed" from="." to="HSplitContainer/MapeditorContainer/Toolbar/ZoomScroller" method="_on_mapeditor_zoom_level_changed"] +[connection signal="zoom_level_changed" from="." to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_zoom_level_changed"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/CloseButton" to="." method="_on_close_button_button_up"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/SaveButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="save_map_json_file"] [connection signal="zoom_level_changed" from="HSplitContainer/MapeditorContainer/Toolbar/ZoomScroller" to="." method="_on_zoom_scroller_zoom_level_changed"] +[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/RotateRight" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_rotate_right_button_up"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_draw_rectangle_toggled"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/Erase" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_erase_toggled"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/ShowBelow" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_show_below_toggled"] diff --git a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn index ddd9d8c2..a411d8df 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn @@ -25,3 +25,4 @@ expand_mode = 3 [connection signal="gui_input" from="TextureRect" to="." method="_on_texture_rect_gui_input"] [connection signal="mouse_entered" from="TextureRect" to="." method="_on_texture_rect_mouse_entered"] +[connection signal="resized" from="TextureRect" to="." method="_on_texture_rect_resized"] From 5101f44fce73463920a78d0c9d54da1e2ea2db4b Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 22 Dec 2023 17:12:58 +0100 Subject: [PATCH 044/138] Tiles rotate in game --- Blocks/grass_001.tscn | 1 + LevelGenerator.gd | 36 +- Mods/Core/Maps/Generichouse.json | 17511 +++++++++++++++- .../Mapeditor/Scripts/GridContainer.gd | 11 +- .../Mapeditor/Scripts/mapeditortile.gd | 1 + .../ContentManager/Mapeditor/mapeditor.tscn | 7 +- 6 files changed, 16480 insertions(+), 1087 deletions(-) diff --git a/Blocks/grass_001.tscn b/Blocks/grass_001.tscn index ea906bb5..5e91ddee 100644 --- a/Blocks/grass_001.tscn +++ b/Blocks/grass_001.tscn @@ -10,6 +10,7 @@ material = ExtResource("1_tldl5") points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5) [node name="Grass001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0) disable_mode = 1 script = ExtResource("1_yge5h") diff --git a/LevelGenerator.gd b/LevelGenerator.gd index c236ba84..313a2298 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -72,7 +72,8 @@ func add_item_to_map(item: Dictionary): func generate_level() -> void: var level_name: String = Helper.current_level_name - var tileid: String = "" + var tileJSON: Dictionary = {} + var myRotation: int = 0 if level_name == "": get_level_json() else: @@ -104,15 +105,30 @@ func generate_level() -> void: # of blocks that we need to instantiate. # If yes, then instantiate if level[current_block]: - tileid = level[current_block].id - if tileid != "": - var block = create_block_with_id(tileid) - level_node.add_child(block) - block.global_position.x = w - block.global_position.z = h + tileJSON = level[current_block] + if tileJSON.has("id"): + if tileJSON.id != "": + var block = create_block_with_id(tileJSON.id) + level_node.add_child(block) + block.global_position.x = w + block.global_position.z = h + if tileJSON.has("rotation"): + if tileJSON.rotation != 0: + # We subtract 90 so we know that north is + # on the top of the screen + # The default block has a y rotation of 90 + # So it is already pointing north (0 = 90) + # 90 = 0 - points east + # 180 (we add 90 instead of subtract) = 270 = south + # 270 = 180 - points west + myRotation = tileJSON.rotation + if myRotation == 180: + block.rotation_degrees = Vector3(0,myRotation+90,0) + else: + block.rotation_degrees = Vector3(0,myRotation-90,0) current_block += 1 level_number += 1 - + # YEAH I KNOW THAT SHOULD BE ONE FUNCTION, BUT IT'S 2:30 AM and... I'm TIRED LOL func get_level_json(): var file = default_level_json @@ -145,6 +161,10 @@ func create_block_with_id(id: String) -> StaticBody3D: block = defaultBlock.instantiate() else: block = defaultBlock.instantiate() + + + #tileJSON.sprite is the 'sprite' key in the json that was found for this tile + #If the sprite is found in the tile sprites, we assign it. if tileJSON.sprite in Gamedata.data.tiles.sprites: var material = Gamedata.data.tiles.sprites[tileJSON.sprite] block.update_texture(material) diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index 4f130cbf..e5d154f3 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -4110,1238 +4110,991 @@ [ { "id": "grass_plain_01", - "rotation": 0 - + "rotation": 90 }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", @@ -5350,452 +5103,362 @@ { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { - "id": "grass_plain_01", + "id": "beehive_stones_00", "rotation": 0 - }, { - "id": "grass_plain_01", + "id": "beehive_stones_00", "rotation": 0 - }, { - "id": "grass_plain_01", + "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { - "id": "grass_plain_01", + "id": "beehive_stones_00", "rotation": 0 - }, { - "id": "grass_plain_01", + "id": "beehive_stones_00", "rotation": 0 - }, { - "id": "grass_plain_01", + "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", @@ -5804,1857 +5467,1486 @@ { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { - "id": "grass_plain_01", + "id": "beehive_stones_00", "rotation": 0 - }, { - "id": "grass_plain_01", + "id": "beehive_stones_00", "rotation": 0 - }, { - "id": "grass_plain_01", + "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "orange_carpet_00", @@ -7663,1567 +6955,1254 @@ { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "orange_carpet_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "beehive_stones_00", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - }, { "id": "grass_plain_01", "rotation": 0 - } ], [ @@ -10480,12 +9459,12 @@ "rotation": 0 }, { - "id": "", + "id": "beehive_stones_00", "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 90 }, { "id": "", @@ -10608,12 +9587,12 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "wood_stairs", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 90 }, { "id": "", @@ -11856,7 +10835,7 @@ "rotation": 0 }, { - "id": "brick_wall_00", + "id": "", "rotation": 0 }, { @@ -11984,7 +10963,7 @@ "rotation": 0 }, { - "id": "wood_stairs", + "id": "", "rotation": 0 }, { @@ -12108,11 +11087,11 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "wood_stairs", + "rotation": 90 }, { - "id": "", + "id": "red_carpet_00", "rotation": 0 }, { @@ -14450,11 +13429,11 @@ "rotation": 0 }, { - "id": "", + "id": "brick_wall_00", "rotation": 0 }, { - "id": "", + "id": "brick_wall_00", "rotation": 0 }, { @@ -14578,11 +13557,11 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { - "id": "", + "id": "wood_stairs", "rotation": 0 }, { @@ -15954,7 +14933,7 @@ "rotation": 0 }, { - "id": "wood_stairs", + "id": "blue_carpet_00", "rotation": 0 }, { @@ -16082,7 +15061,7 @@ "rotation": 0 }, { - "id": "", + "id": "wood_stairs", "rotation": 0 }, { @@ -16206,7 +15185,7 @@ "rotation": 0 }, { - "id": "blue_carpet_00", + "id": "", "rotation": 0 }, { @@ -18544,12 +17523,12 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "wood_stairs", + "rotation": 270 }, { "id": "", @@ -18672,12 +17651,12 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { "id": "", @@ -22770,12 +21749,12 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "wood_stairs", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { "id": "", @@ -22898,12 +21877,12 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { "id": "", @@ -25618,13 +24597,16401 @@ "rotation": 0 } ], - [], - [], - [], - [], + [ + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "beehive_stones_00", + "rotation": 90 + }, + { + "id": "brick_wall_00", + "rotation": 90 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "wood_stairs", + "rotation": 90 + }, + { + "id": "brick_wall_00", + "rotation": 90 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + } + ], + [ + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "brick_wall_00", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "beehive_stones_00", + "rotation": 90 + }, + { + "id": "wood_stairs", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + } + ], + [ + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + } + ], + [ + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + }, + { + "id": "", + "rotation": 0 + } + ], [], [] ], "mapheight": 32, "mapwidth": 32 -} +} \ No newline at end of file diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 34b11198..ed27e6a0 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -10,6 +10,7 @@ var currentLevelData: Array[Dictionary] = [] @export var levelgrid_above: GridContainer @export var mapScrollWindow: ScrollContainer @export var brushPreviewTexture: TextureRect +@export var buttonRotateRight: Button var selected_brush: Control var drawRectangle: bool = false @@ -116,7 +117,7 @@ func _input(event): # Update the position of the brush preview brushPreviewTexture.global_position = new_position -#Change the color to be red +# Highlight tiles that are in the rectangle that the user has drawn with the mouse func update_rectangle(): if is_drawing and drawRectangle: highlight_tiles_in_rect() @@ -144,8 +145,8 @@ func storeLevelData(): currentLevelData.append(child.tileData) mapData.levels[currentLevel] = currentLevelData.duplicate() -#Loads the leveldata from the mapdata -#If no data exists, use the default to create a new map +# Loads the leveldata from the mapdata +# If no data exists, use the default to create a new map func loadLevelData(newLevel: int): if newLevel > 0 and showBelow: levelgrid_below.show() @@ -270,7 +271,7 @@ func load_map_json_file(): func _on_zoom_level_changed(zoom_level: int): # Calculate the new scale based on zoom level - var scale_factor = zoom_level * 0.01 # Adjust this factor as needed + var scale_factor = zoom_level * 0.01 brushPreviewTexture.scale = Vector2(scale_factor, scale_factor) brushPreviewTexture.pivot_offset = brushPreviewTexture.size / 2 for tile in get_children(): @@ -285,4 +286,6 @@ func _on_zoom_level_changed(zoom_level: int): func _on_rotate_right_button_up(): rotationAmount += 90 rotationAmount = rotationAmount % 360 # Keep rotation within 0-359 degrees + buttonRotateRight.text = str(rotationAmount) brushPreviewTexture.rotation_degrees = rotationAmount + brushPreviewTexture.pivot_offset = brushPreviewTexture.size / 2 diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index 15e4205e..5e000d47 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -15,6 +15,7 @@ var tileData: Dictionary = defaultTileData.duplicate(): # We found the tile json with the specified id, so get that json by using the index var myTileData: Dictionary = tileGameData.data[myTileIndex] $TextureRect.texture = Gamedata.data.tiles.sprites[myTileData.sprite].albedo_texture + set_rotation_amount(tileData.rotation) else: $TextureRect.texture = load(defaultTexture) else: diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 7fb2cc0c..ffa37d9f 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -105,13 +105,13 @@ theme_override_constants/line_spacing = 0 theme_override_font_sizes/font_size = 16 text = "32" -[node name="RotateRight" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar" node_paths=PackedStringArray("shortcut_context")] +[node name="RotateRight" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 tooltip_text = "Rotate the brush to paint with rotation" -shortcut_context = NodePath("../../../..") theme_override_icons/checked = ExtResource("3_8q2iq") theme_override_icons/unchecked = ExtResource("3_8q2iq") shortcut = SubResource("Shortcut_1tryc") +text = "0" [node name="DrawRectangle" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 @@ -162,7 +162,7 @@ grow_horizontal = 2 grow_vertical = 2 color = Color(0.313726, 0.313726, 0.313726, 1) -[node name="TileGrid" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer" node_paths=PackedStringArray("mapEditor", "LevelScrollBar", "levelgrid_below", "levelgrid_above", "mapScrollWindow", "brushPreviewTexture")] +[node name="TileGrid" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer" node_paths=PackedStringArray("mapEditor", "LevelScrollBar", "levelgrid_below", "levelgrid_above", "mapScrollWindow", "brushPreviewTexture", "buttonRotateRight")] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -180,6 +180,7 @@ levelgrid_below = NodePath("../Level_Below") levelgrid_above = NodePath("../Level_Above") mapScrollWindow = NodePath("../../..") brushPreviewTexture = NodePath("../../../../../../../BrushPreviewTexture") +buttonRotateRight = NodePath("../../../../../Toolbar/RotateRight") [node name="Level_Below" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer"] modulate = Color(1, 1, 1, 0.117647) From d7efa12ab5e3d378874e8056bda68f13f22b54f0 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 22 Dec 2023 21:59:49 +0100 Subject: [PATCH 045/138] Add folder colors --- project.godot | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/project.godot b/project.godot index 063b07d2..c5c3eb88 100644 --- a/project.godot +++ b/project.godot @@ -38,6 +38,24 @@ movie_writer/movie_file="D:/CataX resources/catax.avi" [editor_plugins] enabled=PackedStringArray("res://addons/gloot/plugin.cfg", "res://addons/markdownlabel/plugin.cfg") +[file_customization] + +folder_colors={ +"res://Blocks/": "orange", +"res://Documentation/": "teal", +"res://Images/": "pink", +"res://Mods/": "purple", +"res://Scenes/": "red", +"res://Scenes/ContentManager/": "yellow", +"res://Scenes/ContentManager/Custom_Editors/": "red", +"res://Scenes/ContentManager/Custom_Editors/Scripts/": "green", +"res://Scenes/ContentManager/Custom_Widgets/": "purple", +"res://Scenes/ContentManager/Custom_Widgets/Scripts/": "green", +"res://Scenes/ContentManager/Mapeditor/": "blue", +"res://Scenes/ContentManager/Scripts/": "green", +"res://Scripts/": "green", +"res://addons/": "gray" +} [input] From 667dfbc72773185a5d646f79f1d08808fdc9b5f4 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 22 Dec 2023 22:03:52 +0100 Subject: [PATCH 046/138] Make another scripts folder green --- project.godot | 1 + 1 file changed, 1 insertion(+) diff --git a/project.godot b/project.godot index c5c3eb88..c8c649ec 100644 --- a/project.godot +++ b/project.godot @@ -53,6 +53,7 @@ folder_colors={ "res://Scenes/ContentManager/Custom_Widgets/Scripts/": "green", "res://Scenes/ContentManager/Mapeditor/": "blue", "res://Scenes/ContentManager/Scripts/": "green", +"res://Scenes/Overmap/Scripts/": "green", "res://Scripts/": "green", "res://addons/": "gray" } From 89f1d2053c04d824c561510121c4eee8c8f47d53 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 23 Dec 2023 20:40:20 +0100 Subject: [PATCH 047/138] Move sprites and scenes to defaults --- Blocks/Stairs_to_E001.tscn | 19 ------------- Blocks/Stairs_to_S001.tscn | 20 -------------- Blocks/Stairs_to_W001.tscn | 20 -------------- .../Blocks/Materials}/floor1.tres | 2 +- .../Blocks/Materials}/stairs1.tres | 2 +- .../Blocks/default_block.gd | 0 .../Blocks/default_block.tscn | 8 +++--- .../Blocks/default_slope.gd | 0 .../Blocks/default_slope.tscn | 8 +++--- enemy.tscn => Defaults/Mobs/enemy.tscn | 2 +- Defaults/Mobs/enemy_corpse.tscn | 26 ++++++++++++++++++ .../Sprites}/1.png | Bin .../Sprites}/1.png.import | 6 ++-- .../Sprites}/2.png | Bin .../Sprites}/2.png.import | 6 ++-- .../Sprites}/3.png | Bin .../Sprites}/3.png.import | 6 ++-- .../Sprites}/4.png | Bin .../Sprites}/4.png.import | 6 ++-- Materials/wall1.tres | 2 +- 20 files changed, 50 insertions(+), 83 deletions(-) delete mode 100644 Blocks/Stairs_to_E001.tscn delete mode 100644 Blocks/Stairs_to_S001.tscn delete mode 100644 Blocks/Stairs_to_W001.tscn rename {Materials => Defaults/Blocks/Materials}/floor1.tres (80%) rename {Materials => Defaults/Blocks/Materials}/stairs1.tres (81%) rename Blocks/Stairs_to_N001.gd => Defaults/Blocks/default_block.gd (100%) rename Blocks/grass_001.tscn => Defaults/Blocks/default_block.tscn (79%) rename Blocks/grass_001.gd => Defaults/Blocks/default_slope.gd (100%) rename Blocks/Stairs_to_N001.tscn => Defaults/Blocks/default_slope.tscn (80%) rename enemy.tscn => Defaults/Mobs/enemy.tscn (98%) create mode 100644 Defaults/Mobs/enemy_corpse.tscn rename {Textures/Tiles/Actual textures => Defaults/Sprites}/1.png (100%) rename {Textures/Tiles/Actual textures => Defaults/Sprites}/1.png.import (72%) rename {Textures/Tiles/Actual textures => Defaults/Sprites}/2.png (100%) rename {Textures/Tiles/Actual textures => Defaults/Sprites}/2.png.import (72%) rename {Textures/Tiles/Actual textures => Defaults/Sprites}/3.png (100%) rename {Textures/Tiles/Actual textures => Defaults/Sprites}/3.png.import (72%) rename {Textures/Tiles/Actual textures => Defaults/Sprites}/4.png (100%) rename {Textures/Tiles/Actual textures => Defaults/Sprites}/4.png.import (72%) diff --git a/Blocks/Stairs_to_E001.tscn b/Blocks/Stairs_to_E001.tscn deleted file mode 100644 index 2421d316..00000000 --- a/Blocks/Stairs_to_E001.tscn +++ /dev/null @@ -1,19 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://db73ys0cw3b2i"] - -[ext_resource type="Material" uid="uid://pdqqtb1s8g6n" path="res://Materials/stairs1.tres" id="1_igkxi"] - -[sub_resource type="PrismMesh" id="PrismMesh_7xabc"] -material = ExtResource("1_igkxi") -left_to_right = 1.0 - -[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_7isgt"] -points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5) - -[node name="StairsToE001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] -disable_mode = 1 - -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -mesh = SubResource("PrismMesh_7xabc") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("ConvexPolygonShape3D_7isgt") diff --git a/Blocks/Stairs_to_S001.tscn b/Blocks/Stairs_to_S001.tscn deleted file mode 100644 index 41ecb62c..00000000 --- a/Blocks/Stairs_to_S001.tscn +++ /dev/null @@ -1,20 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://dotb8dsoarufo"] - -[ext_resource type="Material" uid="uid://pdqqtb1s8g6n" path="res://Materials/stairs1.tres" id="1_g3bt7"] - -[sub_resource type="PrismMesh" id="PrismMesh_7xabc"] -material = ExtResource("1_g3bt7") -left_to_right = 1.0 - -[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_7isgt"] -points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5) - -[node name="StairsToS001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] -transform = Transform3D(1.19249e-08, 0, -1, 0, 1, 0, 1, 0, 1.19249e-08, 0, 0, 0) -disable_mode = 1 - -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -mesh = SubResource("PrismMesh_7xabc") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("ConvexPolygonShape3D_7isgt") diff --git a/Blocks/Stairs_to_W001.tscn b/Blocks/Stairs_to_W001.tscn deleted file mode 100644 index 02918c5e..00000000 --- a/Blocks/Stairs_to_W001.tscn +++ /dev/null @@ -1,20 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://h2antxtbvel4"] - -[ext_resource type="Material" uid="uid://pdqqtb1s8g6n" path="res://Materials/stairs1.tres" id="1_f8gkw"] - -[sub_resource type="PrismMesh" id="PrismMesh_7xabc"] -material = ExtResource("1_f8gkw") -left_to_right = 1.0 - -[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_7isgt"] -points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5) - -[node name="StairsToW001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] -transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0) -disable_mode = 1 - -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -mesh = SubResource("PrismMesh_7xabc") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("ConvexPolygonShape3D_7isgt") diff --git a/Materials/floor1.tres b/Defaults/Blocks/Materials/floor1.tres similarity index 80% rename from Materials/floor1.tres rename to Defaults/Blocks/Materials/floor1.tres index 0fad24ad..293480c5 100644 --- a/Materials/floor1.tres +++ b/Defaults/Blocks/Materials/floor1.tres @@ -1,6 +1,6 @@ [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://buj4ukj1oh4pq"] -[ext_resource type="Texture2D" uid="uid://bu00lw1luehxr" path="res://Textures/Tiles/Actual textures/1.png" id="1_a2cuf"] +[ext_resource type="Texture2D" uid="uid://bu00lw1luehxr" path="res://Defaults/Sprites/1.png" id="1_a2cuf"] [resource] albedo_texture = ExtResource("1_a2cuf") diff --git a/Materials/stairs1.tres b/Defaults/Blocks/Materials/stairs1.tres similarity index 81% rename from Materials/stairs1.tres rename to Defaults/Blocks/Materials/stairs1.tres index 956348fd..1b4be316 100644 --- a/Materials/stairs1.tres +++ b/Defaults/Blocks/Materials/stairs1.tres @@ -1,6 +1,6 @@ [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://pdqqtb1s8g6n"] -[ext_resource type="Texture2D" uid="uid://cyy4j5vso6khu" path="res://Textures/Tiles/Actual textures/4.png" id="1_rgn6b"] +[ext_resource type="Texture2D" uid="uid://cyy4j5vso6khu" path="res://Defaults/Sprites/4.png" id="1_rgn6b"] [resource] shading_mode = 0 diff --git a/Blocks/Stairs_to_N001.gd b/Defaults/Blocks/default_block.gd similarity index 100% rename from Blocks/Stairs_to_N001.gd rename to Defaults/Blocks/default_block.gd diff --git a/Blocks/grass_001.tscn b/Defaults/Blocks/default_block.tscn similarity index 79% rename from Blocks/grass_001.tscn rename to Defaults/Blocks/default_block.tscn index 5e91ddee..7002c396 100644 --- a/Blocks/grass_001.tscn +++ b/Defaults/Blocks/default_block.tscn @@ -1,10 +1,10 @@ [gd_scene load_steps=5 format=3 uid="uid://cpaa3ui52a23c"] -[ext_resource type="Material" uid="uid://buj4ukj1oh4pq" path="res://Materials/floor1.tres" id="1_tldl5"] -[ext_resource type="Script" path="res://Blocks/grass_001.gd" id="1_yge5h"] +[ext_resource type="Script" path="res://Defaults/Blocks/default_block.gd" id="1_s3i5a"] +[ext_resource type="Material" uid="uid://buj4ukj1oh4pq" path="res://Defaults/Blocks/Materials/floor1.tres" id="2_ukdu8"] [sub_resource type="BoxMesh" id="BoxMesh_j05ve"] -material = ExtResource("1_tldl5") +material = ExtResource("2_ukdu8") [sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_gyg2o"] points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5) @@ -12,7 +12,7 @@ points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, [node name="Grass001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0) disable_mode = 1 -script = ExtResource("1_yge5h") +script = ExtResource("1_s3i5a") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] mesh = SubResource("BoxMesh_j05ve") diff --git a/Blocks/grass_001.gd b/Defaults/Blocks/default_slope.gd similarity index 100% rename from Blocks/grass_001.gd rename to Defaults/Blocks/default_slope.gd diff --git a/Blocks/Stairs_to_N001.tscn b/Defaults/Blocks/default_slope.tscn similarity index 80% rename from Blocks/Stairs_to_N001.tscn rename to Defaults/Blocks/default_slope.tscn index 7ba0fea7..d469c2ac 100644 --- a/Blocks/Stairs_to_N001.tscn +++ b/Defaults/Blocks/default_slope.tscn @@ -1,10 +1,10 @@ [gd_scene load_steps=5 format=3 uid="uid://dnsl5rk6de7na"] -[ext_resource type="Script" path="res://Blocks/Stairs_to_N001.gd" id="1_5v8v6"] -[ext_resource type="Material" uid="uid://pdqqtb1s8g6n" path="res://Materials/stairs1.tres" id="1_r8jiw"] +[ext_resource type="Script" path="res://Defaults/Blocks/default_slope.gd" id="1_x2ar8"] +[ext_resource type="Material" uid="uid://pdqqtb1s8g6n" path="res://Defaults/Blocks/Materials/stairs1.tres" id="2_qnimx"] [sub_resource type="PrismMesh" id="PrismMesh_7xabc"] -material = ExtResource("1_r8jiw") +material = ExtResource("2_qnimx") left_to_right = 1.0 [sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_7isgt"] @@ -13,7 +13,7 @@ points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, 0.5, [node name="StairsToN001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0) disable_mode = 1 -script = ExtResource("1_5v8v6") +script = ExtResource("1_x2ar8") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0) diff --git a/enemy.tscn b/Defaults/Mobs/enemy.tscn similarity index 98% rename from enemy.tscn rename to Defaults/Mobs/enemy.tscn index 71363b19..c453a610 100644 --- a/enemy.tscn +++ b/Defaults/Mobs/enemy.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=15 format=3 uid="uid://b2r6nh12wv41k"] [ext_resource type="Script" path="res://Scripts/Enemy.gd" id="1_eb130"] -[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://enemy_corpse.tscn" id="2_vyld4"] +[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/enemy_corpse.tscn" id="2_vyld4"] [ext_resource type="Script" path="res://Scripts/StateMachine.gd" id="3_68hce"] [ext_resource type="Script" path="res://Scripts/EnemyAttack.gd" id="4_mt4kh"] [ext_resource type="Script" path="res://Scripts/EnemyIdle.gd" id="5_bvewq"] diff --git a/Defaults/Mobs/enemy_corpse.tscn b/Defaults/Mobs/enemy_corpse.tscn new file mode 100644 index 00000000..8a40bdac --- /dev/null +++ b/Defaults/Mobs/enemy_corpse.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=6 format=3 uid="uid://mu6nbyuq02o5"] + +[ext_resource type="Script" path="res://Scripts/container.gd" id="1_4celg"] +[ext_resource type="Texture2D" uid="uid://cy56wx4qynp3m" path="res://Textures/enemy.png" id="2_pvjek"] +[ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="3_131gg"] +[ext_resource type="Resource" uid="uid://bvrl0obu5ejqq" path="res://ItemProtosets.tres" id="4_ehn4b"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_0pnwx"] +radius = 0.2 + +[node name="Node3D" type="Node3D" groups=["Containers"]] +script = ExtResource("1_4celg") +inventory = NodePath("InventoryGridStacked") + +[node name="InventoryGridStacked" type="Node" parent="."] +script = ExtResource("3_131gg") +item_protoset = ExtResource("4_ehn4b") + +[node name="Sprite3D" type="Sprite3D" parent="."] +billboard = 1 +texture = ExtResource("2_pvjek") + +[node name="Area3D" type="Area3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] +shape = SubResource("SphereShape3D_0pnwx") diff --git a/Textures/Tiles/Actual textures/1.png b/Defaults/Sprites/1.png similarity index 100% rename from Textures/Tiles/Actual textures/1.png rename to Defaults/Sprites/1.png diff --git a/Textures/Tiles/Actual textures/1.png.import b/Defaults/Sprites/1.png.import similarity index 72% rename from Textures/Tiles/Actual textures/1.png.import rename to Defaults/Sprites/1.png.import index 9ff7f407..3d2924ac 100644 --- a/Textures/Tiles/Actual textures/1.png.import +++ b/Defaults/Sprites/1.png.import @@ -3,7 +3,7 @@ importer="texture" type="CompressedTexture2D" uid="uid://bu00lw1luehxr" -path.s3tc="res://.godot/imported/1.png-97878b150c8cfea86d5ee12c89d61658.s3tc.ctex" +path.s3tc="res://.godot/imported/1.png-0a2a220d5dbae2055345f2757451ae49.s3tc.ctex" metadata={ "imported_formats": ["s3tc_bptc"], "vram_texture": true @@ -11,8 +11,8 @@ metadata={ [deps] -source_file="res://Textures/Tiles/Actual textures/1.png" -dest_files=["res://.godot/imported/1.png-97878b150c8cfea86d5ee12c89d61658.s3tc.ctex"] +source_file="res://Defaults/Sprites/1.png" +dest_files=["res://.godot/imported/1.png-0a2a220d5dbae2055345f2757451ae49.s3tc.ctex"] [params] diff --git a/Textures/Tiles/Actual textures/2.png b/Defaults/Sprites/2.png similarity index 100% rename from Textures/Tiles/Actual textures/2.png rename to Defaults/Sprites/2.png diff --git a/Textures/Tiles/Actual textures/2.png.import b/Defaults/Sprites/2.png.import similarity index 72% rename from Textures/Tiles/Actual textures/2.png.import rename to Defaults/Sprites/2.png.import index 61e88dab..6e57d14b 100644 --- a/Textures/Tiles/Actual textures/2.png.import +++ b/Defaults/Sprites/2.png.import @@ -3,7 +3,7 @@ importer="texture" type="CompressedTexture2D" uid="uid://c31w0wuk8qabw" -path.s3tc="res://.godot/imported/2.png-054b4df51feed804de7ba33365535c1c.s3tc.ctex" +path.s3tc="res://.godot/imported/2.png-064a12f2e68879b8011ec8d7535f90a6.s3tc.ctex" metadata={ "imported_formats": ["s3tc_bptc"], "vram_texture": true @@ -11,8 +11,8 @@ metadata={ [deps] -source_file="res://Textures/Tiles/Actual textures/2.png" -dest_files=["res://.godot/imported/2.png-054b4df51feed804de7ba33365535c1c.s3tc.ctex"] +source_file="res://Defaults/Sprites/2.png" +dest_files=["res://.godot/imported/2.png-064a12f2e68879b8011ec8d7535f90a6.s3tc.ctex"] [params] diff --git a/Textures/Tiles/Actual textures/3.png b/Defaults/Sprites/3.png similarity index 100% rename from Textures/Tiles/Actual textures/3.png rename to Defaults/Sprites/3.png diff --git a/Textures/Tiles/Actual textures/3.png.import b/Defaults/Sprites/3.png.import similarity index 72% rename from Textures/Tiles/Actual textures/3.png.import rename to Defaults/Sprites/3.png.import index fe01cf40..0d1d57d3 100644 --- a/Textures/Tiles/Actual textures/3.png.import +++ b/Defaults/Sprites/3.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://de2iuxymc150j" -path="res://.godot/imported/3.png-2dbb42ad8059ec922c0ddf7474487a19.ctex" +path="res://.godot/imported/3.png-40368a6c144874d275a6652f0533c5a8.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Textures/Tiles/Actual textures/3.png" -dest_files=["res://.godot/imported/3.png-2dbb42ad8059ec922c0ddf7474487a19.ctex"] +source_file="res://Defaults/Sprites/3.png" +dest_files=["res://.godot/imported/3.png-40368a6c144874d275a6652f0533c5a8.ctex"] [params] diff --git a/Textures/Tiles/Actual textures/4.png b/Defaults/Sprites/4.png similarity index 100% rename from Textures/Tiles/Actual textures/4.png rename to Defaults/Sprites/4.png diff --git a/Textures/Tiles/Actual textures/4.png.import b/Defaults/Sprites/4.png.import similarity index 72% rename from Textures/Tiles/Actual textures/4.png.import rename to Defaults/Sprites/4.png.import index 60c8991f..3d50dc22 100644 --- a/Textures/Tiles/Actual textures/4.png.import +++ b/Defaults/Sprites/4.png.import @@ -3,7 +3,7 @@ importer="texture" type="CompressedTexture2D" uid="uid://cyy4j5vso6khu" -path.s3tc="res://.godot/imported/4.png-0676a15659dda490d02720917344243e.s3tc.ctex" +path.s3tc="res://.godot/imported/4.png-94aa6fc10b65fd9d208a71417586b52a.s3tc.ctex" metadata={ "imported_formats": ["s3tc_bptc"], "vram_texture": true @@ -11,8 +11,8 @@ metadata={ [deps] -source_file="res://Textures/Tiles/Actual textures/4.png" -dest_files=["res://.godot/imported/4.png-0676a15659dda490d02720917344243e.s3tc.ctex"] +source_file="res://Defaults/Sprites/4.png" +dest_files=["res://.godot/imported/4.png-94aa6fc10b65fd9d208a71417586b52a.s3tc.ctex"] [params] diff --git a/Materials/wall1.tres b/Materials/wall1.tres index 9242610c..36cb06e3 100644 --- a/Materials/wall1.tres +++ b/Materials/wall1.tres @@ -1,6 +1,6 @@ [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://biuyl58gd7g7v"] -[ext_resource type="Texture2D" uid="uid://c31w0wuk8qabw" path="res://Textures/Tiles/Actual textures/2.png" id="1_r0v77"] +[ext_resource type="Texture2D" uid="uid://c31w0wuk8qabw" path="res://Defaults/Sprites/2.png" id="1_r0v77"] [resource] shading_mode = 0 From fc8c2cb0fedbb30a6da7b43a1979d6928c12d612 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 23 Dec 2023 20:41:37 +0100 Subject: [PATCH 048/138] remove extra scenes and sprites --- Blocks/concrete_wall001.tscn | 18 - Blocks/concrete_wall002.tscn | 18 - Mods/Core/Tiles/5.png | Bin 1186 -> 0 bytes Mods/Core/Tiles/5.png.import | 34 - Mods/Core/Tiles/6.png | Bin 1327 -> 0 bytes Mods/Core/Tiles/6.png.import | 34 - Mods/Core/Tiles/7.png | Bin 1184 -> 0 bytes Mods/Core/Tiles/7.png.import | 34 - Textures/Tiles/Actual textures/5.png | Bin 1186 -> 0 bytes Textures/Tiles/Actual textures/5.png.import | 34 - Textures/Tiles/Actual textures/6.png | Bin 1327 -> 0 bytes Textures/Tiles/Actual textures/6.png.import | 34 - Textures/Tiles/Actual textures/7.png | Bin 1184 -> 0 bytes Textures/Tiles/Actual textures/7.png.import | 34 - .../Tiles/Actual textures/sprite_sheet.png | Bin 92578 -> 0 bytes .../Actual textures/sprite_sheet.png.import | 34 - Textures/Tiles/GRASS+.png | Bin 18930 -> 0 bytes Textures/Tiles/GRASS+.png.import | 34 - Textures/Tiles/doors.png | Bin 161 -> 0 bytes Textures/Tiles/doors.png.import | 34 - Textures/Tiles/grass4.png | Bin 8406 -> 0 bytes Textures/Tiles/grass4.png.import | 34 - Textures/Tiles/grassV2.png | Bin 2765 -> 0 bytes Textures/Tiles/grassV2.png.import | 34 - Textures/Tiles/grassv3.png | Bin 8436 -> 0 bytes Textures/Tiles/grassv3.png.import | 34 - Textures/Tiles/grassv5.png | Bin 344 -> 0 bytes Textures/Tiles/grassv5.png.import | 34 - level.tscn | 11274 ---------------- level2.tscn | 328 - level3.tscn | 638 - 31 files changed, 12718 deletions(-) delete mode 100644 Blocks/concrete_wall001.tscn delete mode 100644 Blocks/concrete_wall002.tscn delete mode 100644 Mods/Core/Tiles/5.png delete mode 100644 Mods/Core/Tiles/5.png.import delete mode 100644 Mods/Core/Tiles/6.png delete mode 100644 Mods/Core/Tiles/6.png.import delete mode 100644 Mods/Core/Tiles/7.png delete mode 100644 Mods/Core/Tiles/7.png.import delete mode 100644 Textures/Tiles/Actual textures/5.png delete mode 100644 Textures/Tiles/Actual textures/5.png.import delete mode 100644 Textures/Tiles/Actual textures/6.png delete mode 100644 Textures/Tiles/Actual textures/6.png.import delete mode 100644 Textures/Tiles/Actual textures/7.png delete mode 100644 Textures/Tiles/Actual textures/7.png.import delete mode 100644 Textures/Tiles/Actual textures/sprite_sheet.png delete mode 100644 Textures/Tiles/Actual textures/sprite_sheet.png.import delete mode 100644 Textures/Tiles/GRASS+.png delete mode 100644 Textures/Tiles/GRASS+.png.import delete mode 100644 Textures/Tiles/doors.png delete mode 100644 Textures/Tiles/doors.png.import delete mode 100644 Textures/Tiles/grass4.png delete mode 100644 Textures/Tiles/grass4.png.import delete mode 100644 Textures/Tiles/grassV2.png delete mode 100644 Textures/Tiles/grassV2.png.import delete mode 100644 Textures/Tiles/grassv3.png delete mode 100644 Textures/Tiles/grassv3.png.import delete mode 100644 Textures/Tiles/grassv5.png delete mode 100644 Textures/Tiles/grassv5.png.import delete mode 100644 level.tscn delete mode 100644 level2.tscn delete mode 100644 level3.tscn diff --git a/Blocks/concrete_wall001.tscn b/Blocks/concrete_wall001.tscn deleted file mode 100644 index 4922bcbd..00000000 --- a/Blocks/concrete_wall001.tscn +++ /dev/null @@ -1,18 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://b5b2f24f6emf3"] - -[ext_resource type="Material" uid="uid://biuyl58gd7g7v" path="res://Materials/wall1.tres" id="1_88dl0"] - -[sub_resource type="BoxMesh" id="BoxMesh_j05ve"] -material = ExtResource("1_88dl0") - -[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_gyg2o"] -points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5) - -[node name="Concrete001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] -disable_mode = 1 - -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -mesh = SubResource("BoxMesh_j05ve") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("ConvexPolygonShape3D_gyg2o") diff --git a/Blocks/concrete_wall002.tscn b/Blocks/concrete_wall002.tscn deleted file mode 100644 index 40ecf58b..00000000 --- a/Blocks/concrete_wall002.tscn +++ /dev/null @@ -1,18 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://cmjjw8pjtidpj"] - -[ext_resource type="Material" uid="uid://biuyl58gd7g7v" path="res://Materials/wall1.tres" id="1_fgupy"] - -[sub_resource type="BoxMesh" id="BoxMesh_j05ve"] -material = ExtResource("1_fgupy") - -[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_gyg2o"] -points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5) - -[node name="Concrete001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] -disable_mode = 1 - -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -mesh = SubResource("BoxMesh_j05ve") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("ConvexPolygonShape3D_gyg2o") diff --git a/Mods/Core/Tiles/5.png b/Mods/Core/Tiles/5.png deleted file mode 100644 index 26791a772bf1460823027bf760cddcf59bef8e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1186 zcmV;T1YP@yP)Px(TuDShRCt{2oxg6|Fc60?MV7)qHUmY6qLVvxF1&Qe83-X25eg z6mA?vlqmA105MV;KJD61g zvb2P(6b10!5;!|eqZ)z6P%?8Vpy!08E30Sdl_p!tU`7DWh~qtaO{u-0E$6-XWf0J3 zsoo{TR*3*nhmA|ZeX(!%cY7_&qyV7L{$U3JvI7AOgF&H=@OtL~0fe#M`Go*VSd9=6 zASktwhgAUU;VuJPBMplHR>NC%<{ISmZ%6^b*!tc80yse`%0d7odizIG{VNDiNz{H0 z1PDs4uqI~+@s8!&VaySfh?*!M9sznHRIjOoXua&A1lT|9UY)S!h-7Y2rsbA+nixs|OU%jGvoB7r`@<|@00Lwu z)T3ap4}eAzN&xSSxZ6MqNDd-^6EGqu0VBSmh5*UHcmVJMQ2{(ZLzlqfZ7L$b44K3Y zEr90>DIF~^S+rqpFa8#Z!!I2heX^+$Zx5>kh+OGcqRUmnRRjQiq+T&3TkEckXtM&e zR2Jt5m{#VFKe|lTS&RUvy!fO^0UCHrGY}v-rUbB;v=|^q70FS+5EP zrM28F0z|mYixxeGtQ!c%Gi2RBD|nAWBM_e;LL;W^G@X zCXR`@Z~84tXnv9?@8Mi}%6M+f2>||~)ex|Jd_cBbhcL^>Yn8#1K##Z)#NP_L0BCv7XbV+S_tW37 z36QPjcmq?!B&2!42;dv`MWeie{>VBZ1&Guik?u&kdJqJbX%PhiFkvm~)GnZPx(=}AOERCt{2oxN@pF%*Rlh%Qn@6AB6%q)n_1rTKV$6?U zzX7lUl;=dHr!~2x;C2@NUE&GRLmXK>!v>nstP?5Vh@H zJAqLfu|?LnEjS2(Ny>#(#SVEdAQRbtU$_fEB7u9WSJqD4)9&xLf87Njfp-UHo<7wC zAl)fzN%ro1sTjOObVmRYlG%&*=*yV1V^pUA@6NFxdmHZvAbVp-KlB3>g?<16fPR3o z&<{WW82SN7EV}&w#0Klz@>2>R`{s-#E&^Z&oyKxMCjD0MjO^`)9szL`P#kUr3lObx zF2%Ffx2yognQ|3iP3FqU3Q(Nk3J`7H>ml=qm4+3dIP?P)g?<16fPR3o&<{WW1n>j& z>{<~y%>4kFmyI(cDuB^W)*kVD#CJco+0Ieu7JxTcuNqPfkyppVD(}L3rZXjBiTv!^OQYrD$Bs^qoNXJOrhCF zsupS+K}>iKXbLS3{QyOwAAkU$AD}Gs0}ucK`~bvg&<{WW&<{`+`T+<4`T^22`bgiZ zAHZrUSbbFxWy$S!J2>lZT9l4EW=}gG2*6@wS|u@JXSERefCvdL&d<_z&M7iZYvCM0 zBUmMVOSD-;J^aof>jq{VQP~Jx0kVv!ULpy*O8}OE&)WGwtV&8xpb~3IkCqSm0bpC% zB9(t&Qcoahhkk&f&<{WW&<{`+`T+<4`T@%Fzz>jV3CLB29HF;@wKygAk#m4E3)1zh z;H?Dr#N=7Qq`upu4?R~oIVvK6PwL6O>J*vc;_`Q4J&?P|GFI! zqrD;+x#s8;vsIa-+ahU{bvY=q1rOh#)~jGzK4&d>S5qi(I=HA7@2&sev(oW;3@xN3 lEULwOB>B=$7fIhh`wKkaEQH&ZyW#)<002ovPDHLkV1g4@O>qDK diff --git a/Mods/Core/Tiles/6.png.import b/Mods/Core/Tiles/6.png.import deleted file mode 100644 index 4576d517..00000000 --- a/Mods/Core/Tiles/6.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dbde2knd5knko" -path="res://.godot/imported/6.png-b93a556068129637c3ed0470ad61aff3.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/6.png" -dest_files=["res://.godot/imported/6.png-b93a556068129637c3ed0470ad61aff3.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/7.png b/Mods/Core/Tiles/7.png deleted file mode 100644 index 115b7794205ce72dfa8739104c76f9f12e60e17a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1184 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 diff --git a/Textures/Tiles/Actual textures/6.png.import b/Textures/Tiles/Actual textures/6.png.import deleted file mode 100644 index 57e0870c..00000000 --- a/Textures/Tiles/Actual textures/6.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dxwsqlxunc3i5" -path="res://.godot/imported/6.png-e1e02d582d46dbda827c756129490f1a.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Textures/Tiles/Actual textures/6.png" -dest_files=["res://.godot/imported/6.png-e1e02d582d46dbda827c756129490f1a.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Textures/Tiles/Actual textures/7.png b/Textures/Tiles/Actual textures/7.png deleted file mode 100644 index 115b7794205ce72dfa8739104c76f9f12e60e17a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1184 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 diff --git a/Textures/Tiles/GRASS+.png.import b/Textures/Tiles/GRASS+.png.import deleted file mode 100644 index daea16a3..00000000 --- a/Textures/Tiles/GRASS+.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://beqlsvo0hmpwu" -path="res://.godot/imported/GRASS+.png-3c1fa86a185c9f16eaa40b60fe4b3d2d.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Textures/Tiles/GRASS+.png" -dest_files=["res://.godot/imported/GRASS+.png-3c1fa86a185c9f16eaa40b60fe4b3d2d.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Textures/Tiles/doors.png b/Textures/Tiles/doors.png deleted file mode 100644 index 8122682e6cc10a906b14578f396ae64ea6ae8f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 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
16zu5%C4yxz32yoVRFLh>tv*Rc;jjC|6i z@|msl~QZ+2b>$X~0{Y0HFKq@=cjrte&MHVH+tXbdHH@F8BZWeboOCFWNv zQ4f?0EWcT$X7)Szv%dlT&Huwn{im;1kUC}1(EuH{(9cNM-(KqCt)4poAv`AhtYeZ4 z)QNZ|8-0CR(fqd~AFfdDQ=Yz2gbOxa{b5jw9QgR_AN}ip+SHK+)vZZkI?*NJ!9%Ui zl0XgQrL$PgaY}}j_WynzHHYbid?0Q?X(9x;oEUY0HSBsbJ4qXjxrWXVFZ9Rjd*E1D z7MDz%Ijxg64tz^vs#c|@#IFGsnoJ{JJJ10%OkEk0$~O`-*^1@e3aJL%l5h*5gr~n5 z;m3Tu`-2_FSatEspW{>`_$BNaysp`&Rpv6Vf8C4sW@M!Q?XLy;+CS!Cv<-SGjFGv1 zmM+L`!><{uKtQA_$z;3GAY&iCU6g2hFQU_(i*decE8WLBQA>`L(#&H2Hl`5vLcxz) zGeYCuJK<47-t5aS<=lS<6>omi4a(VCo)!uDZUp0tuliIK?-k!8qtKN1YhvBTuwVM0 zuGvsdpkSLd6v2%-BX-`emap0dn^JaRygYxT zP6XgM;D{GQDfxZ8oDd1O*8F@3m`dKOA_HS1`dD7QYO;}o*sexQLxglIbTDR;lFvFF z#Vp;SzH@}is?{K_IyW54)q$rIJ3IOT+LXn(%00zw@$;L_>hGap)7<-EhBe29fBz|w z(E6Mb&d;w&x$pf5_4`-COlaBOy_tsd$6mt!@^Aqb^Wvu;3n{j5m%rvW0bga1FU}#Q zTaJz6{&?8d-XkzvY0zJC-$f~Lh9LtgHcUG^wX4}5+@L_hG2Hoq1s zMsBSHv}<0=&V_XL{b>>u2tPfSfQ`+~rrlUWMl6l^Xw2znV9^IoFT8WK)@dAGNo@h7 zf^$}c0h9}FH)uAut z2xlrM?nfSLgE1l2t|WhH?IZWzouy94jlXnflaqc_U_m)*)+G<}&fOzo7PSB@BWl=a z^MzS9#kT;!kAL-YA}BxOSNzCGW5So@_@dYRJ@}kol-};YY7`(MW+6yG+ynwF2Dr)qd&w%FfqO$-&$49{?UnK9UxbR1}j^G?kQ8l9E@FQhXpO ptt2TqQ-%K5Pw@W`+&o@6I|cp!3E%gqP5%)9Pqd$cD>ZGS{trE5=%WAt diff --git a/Textures/Tiles/grass4.png.import b/Textures/Tiles/grass4.png.import deleted file mode 100644 index a1ddc57b..00000000 --- a/Textures/Tiles/grass4.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bwrhjixkpl3t1" -path="res://.godot/imported/grass4.png-c3b3c17ebaabdb86dc5411e766bd9bc1.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Textures/Tiles/grass4.png" -dest_files=["res://.godot/imported/grass4.png-c3b3c17ebaabdb86dc5411e766bd9bc1.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Textures/Tiles/grassV2.png b/Textures/Tiles/grassV2.png deleted file mode 100644 index 917dc846065098d5e96f09566cafae5f156dd743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2765 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 Lx(})_cpUeCLP)tv diff --git a/Textures/Tiles/grassv3.png.import b/Textures/Tiles/grassv3.png.import deleted file mode 100644 index 3108a6d2..00000000 --- a/Textures/Tiles/grassv3.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://wm6nfo4h77k5" -path="res://.godot/imported/grassv3.png-fd8b4dbf0696016c8cf51491f666580a.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Textures/Tiles/grassv3.png" -dest_files=["res://.godot/imported/grassv3.png-fd8b4dbf0696016c8cf51491f666580a.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Textures/Tiles/grassv5.png b/Textures/Tiles/grassv5.png deleted file mode 100644 index fefe462762293209e2ac30ffa9e825cbda6307c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmV-e0jK_nP)Px$5=lfsR7i=fR5=oZFbv#yoWTW68Xl2Xq@m0^^1zh*h$an%GcY6t5hL635nwCN zqLpN^*6I4VeITGR25)PnPemxzD*%}76nuz@rPw`s1pvzEm8gta&-YiDgkpK3m|lXf zSEUp_I(aqA6-PLA|)m))qeqTIFv~wdZ#!50000 Date: Sat, 23 Dec 2023 20:41:49 +0100 Subject: [PATCH 049/138] Moved the enemy corpse to defaults --- enemy_corpse.tscn | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 enemy_corpse.tscn diff --git a/enemy_corpse.tscn b/enemy_corpse.tscn deleted file mode 100644 index 8a40bdac..00000000 --- a/enemy_corpse.tscn +++ /dev/null @@ -1,26 +0,0 @@ -[gd_scene load_steps=6 format=3 uid="uid://mu6nbyuq02o5"] - -[ext_resource type="Script" path="res://Scripts/container.gd" id="1_4celg"] -[ext_resource type="Texture2D" uid="uid://cy56wx4qynp3m" path="res://Textures/enemy.png" id="2_pvjek"] -[ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="3_131gg"] -[ext_resource type="Resource" uid="uid://bvrl0obu5ejqq" path="res://ItemProtosets.tres" id="4_ehn4b"] - -[sub_resource type="SphereShape3D" id="SphereShape3D_0pnwx"] -radius = 0.2 - -[node name="Node3D" type="Node3D" groups=["Containers"]] -script = ExtResource("1_4celg") -inventory = NodePath("InventoryGridStacked") - -[node name="InventoryGridStacked" type="Node" parent="."] -script = ExtResource("3_131gg") -item_protoset = ExtResource("4_ehn4b") - -[node name="Sprite3D" type="Sprite3D" parent="."] -billboard = 1 -texture = ExtResource("2_pvjek") - -[node name="Area3D" type="Area3D" parent="."] - -[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] -shape = SubResource("SphereShape3D_0pnwx") From 3a90db2fa677ed96c6fb81329cd9827c82c3ee8e Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 23 Dec 2023 20:42:32 +0100 Subject: [PATCH 050/138] Adjusted scenes to new paths --- LevelGenerator.gd | 5 ++--- MeshLibraries/test.tres | 2 +- Scripts/gamedata.gd | 2 +- level_generation.tscn | 18 +++++++----------- project.godot | 4 ++-- 5 files changed, 13 insertions(+), 18 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 313a2298..7ad9612c 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -9,12 +9,11 @@ var level_width : int = 32 var level_height : int = 32 -@onready var defaultBlock: PackedScene = preload("res://Blocks/grass_001.tscn") -@onready var defaultSlope: PackedScene = preload("res://Blocks/Stairs_to_N001.tscn") +@onready var defaultBlock: PackedScene = preload("res://Defaults/Blocks/default_block.tscn") +@onready var defaultSlope: PackedScene = preload("res://Defaults/Blocks/default_slope.tscn") @export var defaultEnemy: PackedScene @export var defaultItem: PackedScene @export var level_manager : Node3D -@export var block_scenes : Array[PackedScene] @export_file var default_level_json diff --git a/MeshLibraries/test.tres b/MeshLibraries/test.tres index 3d555da5..32d409fc 100644 --- a/MeshLibraries/test.tres +++ b/MeshLibraries/test.tres @@ -1,6 +1,6 @@ [gd_resource type="MeshLibrary" load_steps=5 format=3 uid="uid://b8il3gb2idxf4"] -[ext_resource type="Material" uid="uid://buj4ukj1oh4pq" path="res://Materials/floor1.tres" id="1_yx5kh"] +[ext_resource type="Material" uid="uid://buj4ukj1oh4pq" path="res://Defaults/Blocks/Materials/floor1.tres" id="1_yx5kh"] [sub_resource type="BoxMesh" id="BoxMesh_ywr7x"] material = ExtResource("1_yx5kh") diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index efeb04c7..c6448c1f 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -117,7 +117,7 @@ func remove_item_from_data(contentData: Dictionary, id: String): if contentData.data.is_empty(): return if contentData.data[0] is Dictionary: - contentData.data.remove_at(get_array_index_by_id(contentData.data, id)) + contentData.data.remove_at(get_array_index_by_id(contentData, id)) elif contentData.data[0] is String: contentData.data.erase(id) Helper.json_helper.delete_json_file(contentData.dataPath, id) diff --git a/level_generation.tscn b/level_generation.tscn index 90c5876e..903670f2 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -1,21 +1,14 @@ -[gd_scene load_steps=33 format=3 uid="uid://drl78uuphij1l"] +[gd_scene load_steps=26 format=3 uid="uid://drl78uuphij1l"] [ext_resource type="Script" path="res://LevelGenerator.gd" id="1_i8qa4"] [ext_resource type="Script" path="res://LevelManager.gd" id="2_gm6x7"] -[ext_resource type="PackedScene" uid="uid://cpaa3ui52a23c" path="res://Blocks/grass_001.tscn" id="2_plpeq"] -[ext_resource type="PackedScene" uid="uid://b5b2f24f6emf3" path="res://Blocks/concrete_wall001.tscn" id="3_1oyl1"] -[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://enemy_corpse.tscn" id="3_l8ooc"] -[ext_resource type="PackedScene" uid="uid://cmjjw8pjtidpj" path="res://Blocks/concrete_wall002.tscn" id="4_pf75o"] -[ext_resource type="PackedScene" uid="uid://dnsl5rk6de7na" path="res://Blocks/Stairs_to_N001.tscn" id="5_4om2c"] -[ext_resource type="PackedScene" uid="uid://db73ys0cw3b2i" path="res://Blocks/Stairs_to_E001.tscn" id="6_x7pv6"] +[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/enemy_corpse.tscn" id="3_l8ooc"] [ext_resource type="Script" path="res://Scripts/BuildManager.gd" id="6_y7rk5"] -[ext_resource type="PackedScene" uid="uid://dotb8dsoarufo" path="res://Blocks/Stairs_to_S001.tscn" id="7_nhyjt"] [ext_resource type="Script" path="res://Scripts/player.gd" id="8_gposs"] -[ext_resource type="PackedScene" uid="uid://h2antxtbvel4" path="res://Blocks/Stairs_to_W001.tscn" id="8_l45yd"] [ext_resource type="Script" path="res://Scripts/Camera.gd" id="9_gi6l6"] [ext_resource type="Texture2D" uid="uid://8uwpq1ai8qi4" path="res://Textures/survivor.png" id="10_alql8"] [ext_resource type="Script" path="res://Scripts/PlayerShooting.gd" id="11_6i2sa"] -[ext_resource type="PackedScene" uid="uid://b2r6nh12wv41k" path="res://enemy.tscn" id="11_tj1r0"] +[ext_resource type="PackedScene" uid="uid://b2r6nh12wv41k" path="res://Defaults/Mobs/enemy.tscn" id="11_tj1r0"] [ext_resource type="PackedScene" uid="uid://doyjc25kl7104" path="res://bullet_line.tscn" id="12_dip38"] [ext_resource type="AudioStream" uid="uid://gdwwxc0yvg5g" path="res://Sounds/Weapons/Shooting/pistol_shot.wav" id="13_fjasp"] [ext_resource type="AudioStream" uid="uid://cfmgnsm10aj4i" path="res://Sounds/Weapons/Reloading/pistol_reload_sound.mp3" id="14_x756n"] @@ -74,7 +67,6 @@ script = ExtResource("1_i8qa4") defaultEnemy = ExtResource("11_tj1r0") defaultItem = ExtResource("3_l8ooc") level_manager = NodePath("../NavigationRegion3D/LevelManager") -block_scenes = Array[PackedScene]([ExtResource("2_plpeq"), ExtResource("3_1oyl1"), ExtResource("4_pf75o"), ExtResource("5_4om2c"), ExtResource("6_x7pv6"), ExtResource("7_nhyjt"), ExtResource("8_l45yd")]) default_level_json = "res://Mods/Core/Maps/Generichouse.json" [node name="WorldEnvironment" type="WorldEnvironment" parent="TacticalMap"] @@ -148,6 +140,10 @@ hud = NodePath("../../HUD") [node name="Entities" type="Node3D" parent="TacticalMap"] [node name="Enemies" type="Node3D" parent="TacticalMap/Entities"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.4043, 0, -8.78679) + +[node name="Enemy" parent="TacticalMap/Entities/Enemies" instance=ExtResource("11_tj1r0")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.09226, 0.991724, 23.5959) [node name="Projectiles" type="Node3D" parent="TacticalMap/Entities"] diff --git a/project.godot b/project.godot index c8c649ec..3941df41 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="CataX" run/main_scene="res://scene_selector.tscn" -config/features=PackedStringArray("4.1", "Forward Plus") +config/features=PackedStringArray("4.2", "Forward Plus") config/icon="res://icon.svg" [autoload] @@ -24,7 +24,6 @@ GLoot="*res://addons/gloot/gloot_autoload.gd" ItemManager="*res://Scripts/item_manager.gd" General="*res://Scripts/general.gd" CraftingRecipesManager="*res://Scripts/crafting_recipes_manager.gd" -Helper="*res://Scripts/Helper.gd" [display] @@ -38,6 +37,7 @@ movie_writer/movie_file="D:/CataX resources/catax.avi" [editor_plugins] enabled=PackedStringArray("res://addons/gloot/plugin.cfg", "res://addons/markdownlabel/plugin.cfg") + [file_customization] folder_colors={ From 5bc423da403e5a384984aef6175e761df0f943d5 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 23 Dec 2023 20:45:05 +0100 Subject: [PATCH 051/138] Remove extra tiles we don't need them since we have rotation now --- Mods/Core/Tiles/Tiles.json | 36 ------------------------------------ Scripts/gamedata.gd | 1 + 2 files changed, 1 insertion(+), 36 deletions(-) diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index c3e27ae4..60f9335a 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -82,33 +82,6 @@ "name": "Asphalt road with diagonal markings", "sprite": "asphalt_diag_middle.png" }, - { - "categories": [ - "Road" - ], - "description": "A smooth surface for vehicles to drive on. It has markings indicating a west turn", - "id": "road_asphalt_turn_west", - "name": "Asphalt road with markings turning west", - "sprite": "asphalt_horizontal_middle_downleft.png" - }, - { - "categories": [ - "Road" - ], - "description": "A smooth surface for vehicles to drive on. It has markings indicating a east turn", - "id": "road_asphalt_turn_east", - "name": "Asphalt road with markings turning east", - "sprite": "asphalt_horizontal_middle_upright.png" - }, - { - "categories": [ - "Road" - ], - "description": "A smooth surface for vehicles to drive on. It has vertical markings", - "id": "road_asphalt_vertical", - "name": "Asphalt road with vertical markings", - "sprite": "asphalt_middle.png" - }, { "categories": [ "Road" @@ -127,15 +100,6 @@ "name": "Asphalt road with horizontal markings", "sprite": "asphalt_middle_horizontal.png" }, - { - "categories": [ - "Road" - ], - "description": "A smooth surface for vehicles to drive on. It has markings indicating a south turn", - "id": "road_asphalt_turn_south", - "name": "Asphalt road with markings turning south", - "sprite": "asphalt_middle_upright.png" - }, { "categories": [ "Floor", diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index c6448c1f..2b2d4fe3 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -118,6 +118,7 @@ func remove_item_from_data(contentData: Dictionary, id: String): return if contentData.data[0] is Dictionary: contentData.data.remove_at(get_array_index_by_id(contentData, id)) + save_data_to_file(contentData) elif contentData.data[0] is String: contentData.data.erase(id) Helper.json_helper.delete_json_file(contentData.dataPath, id) From 35729f4188bf99817714889c939e97ce2937571f Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 23 Dec 2023 20:46:44 +0100 Subject: [PATCH 052/138] Remove extra sprites too --- Mods/Core/Tiles/Grassrampeast.png | Bin 34080 -> 0 bytes Mods/Core/Tiles/Grassrampeast.png.import | 34 ------------------ Mods/Core/Tiles/Grassrampsouth.png | Bin 34190 -> 0 bytes Mods/Core/Tiles/Grassrampsouth.png.import | 34 ------------------ Mods/Core/Tiles/Grassrampwest.png | Bin 34057 -> 0 bytes Mods/Core/Tiles/Grassrampwest.png.import | 34 ------------------ .../asphalt_horizontal_middle_downleft.png | Bin 7069 -> 0 bytes ...halt_horizontal_middle_downleft.png.import | 34 ------------------ .../asphalt_horizontal_middle_upright.png | Bin 7113 -> 0 bytes ...phalt_horizontal_middle_upright.png.import | 34 ------------------ Mods/Core/Tiles/asphalt_middle.png | Bin 5823 -> 0 bytes Mods/Core/Tiles/asphalt_middle.png.import | 34 ------------------ Mods/Core/Tiles/asphalt_middle_upright.png | Bin 5772 -> 0 bytes .../Tiles/asphalt_middle_upright.png.import | 34 ------------------ Mods/Core/Tiles/dirtrampeast.png | Bin 29921 -> 0 bytes Mods/Core/Tiles/dirtrampeast.png.import | 34 ------------------ Mods/Core/Tiles/dirtrampsouth.png | Bin 30371 -> 0 bytes Mods/Core/Tiles/dirtrampsouth.png.import | 34 ------------------ Mods/Core/Tiles/dirtrampwest.png | Bin 29987 -> 0 bytes Mods/Core/Tiles/dirtrampwest.png.import | 34 ------------------ Mods/Core/Tiles/rockyfloorrampeast.png | Bin 27848 -> 0 bytes Mods/Core/Tiles/rockyfloorrampeast.png.import | 34 ------------------ Mods/Core/Tiles/rockyfloorrampsouth.png | Bin 27998 -> 0 bytes .../Core/Tiles/rockyfloorrampsouth.png.import | 34 ------------------ Mods/Core/Tiles/rockyfloorrampwest.png | Bin 27820 -> 0 bytes Mods/Core/Tiles/rockyfloorrampwest.png.import | 34 ------------------ 26 files changed, 442 deletions(-) delete mode 100644 Mods/Core/Tiles/Grassrampeast.png delete mode 100644 Mods/Core/Tiles/Grassrampeast.png.import delete mode 100644 Mods/Core/Tiles/Grassrampsouth.png delete mode 100644 Mods/Core/Tiles/Grassrampsouth.png.import delete mode 100644 Mods/Core/Tiles/Grassrampwest.png delete mode 100644 Mods/Core/Tiles/Grassrampwest.png.import delete mode 100644 Mods/Core/Tiles/asphalt_horizontal_middle_downleft.png delete mode 100644 Mods/Core/Tiles/asphalt_horizontal_middle_downleft.png.import delete mode 100644 Mods/Core/Tiles/asphalt_horizontal_middle_upright.png delete mode 100644 Mods/Core/Tiles/asphalt_horizontal_middle_upright.png.import delete mode 100644 Mods/Core/Tiles/asphalt_middle.png delete mode 100644 Mods/Core/Tiles/asphalt_middle.png.import delete mode 100644 Mods/Core/Tiles/asphalt_middle_upright.png delete mode 100644 Mods/Core/Tiles/asphalt_middle_upright.png.import delete mode 100644 Mods/Core/Tiles/dirtrampeast.png delete mode 100644 Mods/Core/Tiles/dirtrampeast.png.import delete mode 100644 Mods/Core/Tiles/dirtrampsouth.png delete mode 100644 Mods/Core/Tiles/dirtrampsouth.png.import delete mode 100644 Mods/Core/Tiles/dirtrampwest.png delete mode 100644 Mods/Core/Tiles/dirtrampwest.png.import delete mode 100644 Mods/Core/Tiles/rockyfloorrampeast.png delete mode 100644 Mods/Core/Tiles/rockyfloorrampeast.png.import delete mode 100644 Mods/Core/Tiles/rockyfloorrampsouth.png delete mode 100644 Mods/Core/Tiles/rockyfloorrampsouth.png.import delete mode 100644 Mods/Core/Tiles/rockyfloorrampwest.png delete mode 100644 Mods/Core/Tiles/rockyfloorrampwest.png.import diff --git a/Mods/Core/Tiles/Grassrampeast.png b/Mods/Core/Tiles/Grassrampeast.png deleted file mode 100644 index 5401043e95a998d889d1bca02621754b9244c279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34080 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�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 diff --git a/Mods/Core/Tiles/Grassrampeast.png.import b/Mods/Core/Tiles/Grassrampeast.png.import deleted file mode 100644 index bd37723e..00000000 --- a/Mods/Core/Tiles/Grassrampeast.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bwjpj6wtbq3e6" -path="res://.godot/imported/Grassrampeast.png-0c2899a224cdfe14f464f8eb3a673d45.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/Grassrampeast.png" -dest_files=["res://.godot/imported/Grassrampeast.png-0c2899a224cdfe14f464f8eb3a673d45.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/Grassrampsouth.png b/Mods/Core/Tiles/Grassrampsouth.png deleted file mode 100644 index d3e9e084de350ec37553e21ea27bf811d950befe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34190 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

V-T+1X>%={p?0gAa2gsz*{kyoW` z7P!`pPme#Q?At-M*?B_OK<3#W;u50u5K1^E@#Q|}86PD_ER|>ZauCjNxQHtWN1 zl5h}n=5pqzG2Xat96@DKF5)Utx_k?SdHGq;HfutuA&24~*>`^YA08cTKWv$!0t{_* zlUu^ojo|sH{rGeKS;h?mmhO}b=){T_*m*)GgwCWa8WyUat#YU*pj^!>KWV`cO^YD9 zz&rT5mzk*a@hmj(?cT=x!D~KZ9NK;?_h) z6aveZkt;?WnK2s3SLxtzn&MJHQQQQ=kS)dKzRnUEPzssE)3~OAgieqO-`Rc;H`0}x zp(t(9iQ64UX09*uS9y=zhoVzN=p%-b_i3!;?P-BtBroN#8Uke4m904Owm^MTa(^n-8!4$&8S6ck-$Gvg~ zpdSQ+cFa}`YaG7DUj?coK<~jXxF=9}n=F#4Gf7P(Pk%M8f|5{)s{sE9q0b<4A_Soz zMW%3=zqu5d%_6e|$t;#CW`=_1CrhUsi-WK%Rw&Ff7mHXf0r8Cjnh%7d>^tE^#!iVS zhDG0f6DqU?xBYiwp2V8*OZZ5dDLHq_1;uE$!+W02O4-c88z4qiXfp>!ga>h(Yn70;9X#PF0X!%k)_VZZ;Ds5WXtO!S3%r6REif2TVEjo)T$mL?< zBEW0q67qZ2w;hYY!1>6bgw!j}K)4{yWK0;$Veax78~17YGL|l;zfSzWUJ=Ar6!186 zUY@Td{Om^&q9qB_W~cmS%gQli{?fe6x2*@X+yvn}Pk2n=P^lja)mR&N%eNDR(x*!Faf(at(SYy7y_+klME(b!aprhE0O%I;LKw> z4A`#`_4zAQ}UWPyaA2poY{MKGVUAS!uUt)P+D&CS0VQ1P7zzY0sZ1-F{tLotd; z$t%)`QklE^xdxc_1%1XZB&QgYLF6^4MfOny723T-8MD)bmEi}&@Um(>%X_#b?(QZ( za~*gCmp~>ejRA;K^3MA|yn7@`0+P-n7}^cODTQxYux?j8D=8y!lSRpAi=EEn2I7xa ztV|Y)bx|T2!p-sRf6j=zb^LG|N+zkPQlqNuv2~`w< zVCK#(V)^|mMG~g+p+Y|O3x3+f5hSib-M#7uvB;IR2t{t5#jNH#W2-qPYFNp|BveE< z=7v;)VakmQ@WtirQycdA=u-TCHm~|4u?;JjS)<2qerTwcLm7MNg}I zbg{v_fON5{$?2kHmYFoOmz&ntr;}tYgQ1Dzud^T#v}A^iU@_lmAS!}UG+7P%9LF_) zz3VXNl?Y-SQrI%!{2aOFN(JG_nrH)LQUIx8Y}%q#M3UE83$0%ttyLKlItkT=36IV` zMW84d<;nXj8ZJ`W)EcC{`~EeYJ?Pob_@|g|AK%aLwYiiK?}YT>DN7p%fd( z=?1R3gW1VVg?cL?QHv~~NP{v^7VmXi#g>a04;gY7NSK8c`r;dmt#T18I*U%JitA+l zH&@2j8r_|54J+b+8j~owehKO4-N(aRudSd)+T}`QM=dhJ;yx9r>1QUh1QnOjl%E{wCvUerW z{8Ki~IG_N~V|^5ma^fbel;M;-a}UKTKdTf9zl>EV3wBI=OIN<(8gb=h~4|{_BJoizHSNBnby^ z=6{7?g9udY$g=qi4U9rH!UNA>WitpgiN>+4`F$iFXAJYi&yE+ z{FiHQ9rT;c3=E51)tpF+E2|Zs6=9xyI<2T7mkwTH*aRw^NqioEf0IRB?)QQql z9Al+05?6>4R9~J)X`?uVSSet9By%x#i}>=BN%?V$qT+TE(po8GOgu~(q0}<3FG43U zj&UA&TqoLq6yD=+`3|)QnMm@&?8!zxL39HNDdT#s%My)ICXRBpVO$nED5cd*a_1%s z#l1=2>M^Kt^j>(xRxCI&U9K#f$$9P_SH%OBxXB{-sn))>(%=!j*r3ZW0b>#I$87;xb5R>R`2_&7x# zM2K?mQ?ghZF%6J*f+zoW-MW5W1Mdnt23(cMT&E_LvGC^=u6^FNu31dbsp?pA+7es1*}EjppGwOg&6oG@7K)Q4KI-T#PV4pqJ+2^AK}PtY(37x1ho(+T{5Bx zpVwWaot?t;@=a2r6}-s{DM$i@}+#cAD)$m} zf)FK;p+?b_N(mbuhy;fO19?~=h&D!fd}NWuo_)3;qH4V&NH9(Cg)~ttetHzf4k>Or z*VThq2{H?lYj`i?h;&Qvm03*qjDXr8!jRmXywnD&ei23Bt2aUdx!2XmXJez?QN*aY zg|)00_om*W3=V9g$nK-{kd%ZaaS>u#xph#Aj1(*jI}^&uR#7xifmg_dmz75#6zUuviv?mO+~eH#089A9JV3vaYs&$v3p_BQi=D zj98ApjQfp@7qMpffHH&_h~(N@c#;LQbIP1IA7()_cGeD6C?rMeP}r=aMTS1w_;h4x zfE5XlId>^PgQGU1$_O`fHIMrSfmb= zi_dcLXgw%8OxQ9BW7UnaekYR{MIH&Mq#-Lri7*I?_7N&=w++o_)y|`4d7l>Y)#lz? zyWwAJrSYJ0V|$~R`}9c!k;R}~`){??vYkg8&G=b_KaUSzV=mF~gljB!CHLfdZZ4zO zvnXxGQhonfT<#?LSNBJT!DF%djFF-iInFl}nPuUQznE4oopDg~y?jH7O10)a+?8EP zH~@L!E2CUzbrC+4(31jPCA`~xb3GOsR1A+GN9AInQauiG`eau11-y&$yS5~geE|J@XH}bn*E3dVAJ+hlp+e`!|L*b8=s*}3 zYYRIps7(0fqVnG>i>Nfl9W4_EvLrCf2z4$!tCGai`D;c;)6r#Fw@3(s`4^*Pro2Dkvf+f#_;g(=sQSSJ71DV?(NIkHUGbPcyc) zLCA6^;k`bOxR&|pG_V>A6jy_)unCMFmAjC`>I16}_39*b~vKheYW?sx< zR?#D{49>M-k1xU-GANlaJB_y!|7#{4-dk%n!z+-=MJxs!)(+vo*X6TGxghcL{)6o- z;2?t>X2NT^UZ6U&c=o$VbJLF^Bt8eN)5Nuh-;B0gW}&nG`ws{8d5a>^fz!y&*&kpb zDC>T#U@NFK+UggwsQkGv()IO!niOH;^0*Np)WJK067J@9Kh_zG6H+ZB?4Tx8+=x+^7oK>W3w$DLmN&83OsH*y_|qYAi;g$Uc))Oipz@UD|bT3)W? zt6yGJHPs?(oGE_}t@hh6d%Yhb*Uh@cC@DE4fp8gVv&iD&R>Dn6S@nm6j?G{ieiObj zwuvUn{-b~S=%_M*c@q{dp~I(xp-iE6rdH=~ge0W1xv>+iva^+jWAWoaBbICnvv83G zKoKEZo3@RQi$AmQAQD6&fP59k%~~W~#L;}`#fwSv^0UkMwkXw=lI@~R66Ibrn!CYZ zC0zJ9Zbv?zKUIY4M8oC8ZKuZEAw=Z~fR9Xh+E=bpdF=9 zM6!?I`1i9)ad$J;*>Tn)ivbO)+81lJ2rE|+e->r$@hHl4RZSuME+`jyAZZ8~GS`h8 zn~X(PL7OPZ?N&AJq|&sx9%XU;+WDM_1wueIoj}Ivz4)8x>GKbzFPJGlTKRBXtU$~W?Ntd8H-5+$3aGu5JE zucRT=@i|bZe*mchQ^y^#ydZxZVeL6+$ZQ8pbaawDZV9UBzb`OLZEB!Gl1o z8lI2B#*w!{KKJamlbSHniKKc>@klJc^H$(DKD|27R$_& zU+2RmX`X)^bcz?NNFc&jho8oR!1ww{_f&okM1S>UxET~OXy*XMB+A+4kM=ku?p^*L@-baC>fcB^jf5T3n| zp@Td+lI%TLFER|)WeoN1X(?OD{Ox&AVn5G)5mZsv;6SmgU;8nQQZAsM`&3`!Y*CFT z_7G^`A(KifWlj`H1f??@vF+q_5go-?L>AXFj+sa2!+(DNNNmqqY1$&fr9~%Cqp1-L z!shghfgZJa7C8!W6(4BAHwEKaNdJy1(>5+c1#$b{C>9cd%`rVS{{i=+*v&1dw+6Cpy{7%?8jl3x}c)(#OsfuakLGrTG zKz0u|GX;gL@T(}}bkY{^$dKP}v%7I6`M3G%=OA;WS;3B?+JxJA`@@4H9Xb|3|JYd; zewKmgBH^1S{6rSrm&Agbi1k-`L5(cjZPNjNoH^GXLW?zzcFi1;uzpi*Nj|GehtVT6 ziWiiK06G!wDCCns@dF8t$^zzkCeQy<7I_DYj{vnvrjWX~*Q=Lrb{vbVyN<1k19 zk(_E`0n4|uo(Q27Cqg+7m*5Be-gos6D#m0@_a3j;UPA?*np>_z`l@=D$5GtZvUpJ_ z5G)@dc~;2k@X6J7)LV~mJF)bziEN9 z20e(+%)k@BPU7P&u8dq2ZlYNJIPT@EzsV#5%TUKQCX3mG(aK9;(&fjpuq6d>ER2q) z>!25e^F`(>bIdS{7`DC=H+}JS1|2k89<%&J6Jvfpb52Niz1nvEfUqyaMHJbT&tLw= zHokeynPDRPlJ*iq`%&`Fw>~^PDi)r}%kT4X8ailCwP(d8&|c7Cu`KX*7^fbJ;hhL1 zTD-8qG|FPLrUk6iJ7P5l-yQ}nrp@GhUV;$X5Fo8aD7gfO7kvI7FRSt> zhFDu0HrSOZEW|)UX>q;@(SlnLX>6(Ct4;=2{3BMIwRgSVb|5%HfE2?BmlcX^W(g&m zNrZw#Dwk5e@Ef10hSj*am%mNe6veYk*EO6iAfw4$sewS246hV;7Dbma?CypT2d$>z z02P-kYk)A)<#- z^l%UcWv@YPq>b%pF_)04CKg%E%;(YfwwhU7l!Twq6rbpP`%ms3MFd5Jj%EI`P~#U_ zq-ZyP!VlM?u}G85YqDZs+-8ePod!;5^3L16W*qlmVGz9IPbTHJr9qLx+K3Q=x(4gF zkpVe-{FBXQbEjWN%&_=gW|2=Bu;^d9iDcFls_?L-x|oA(v# zM|`+7%oy|+G0inaB?Kg=P%hzB^dQ%7!H`Ovz@i~tcIEiigwYJz-*IcZA$1yB@Fx5N z()9Csbt6YH?R2)+!Gg*IETdq~2H^f!rRb#&hKg{(HLG<$*RK;rf_jjlLdg6qv=xPZ0GY&SWg+8ZBBYkxE5qtDuuvifuUjPbd(EmK-z*hyki&Nd zC42%TCF#?x!+szea?D@t=*_RpB7&oLNXV)S>E>=et=3cVS!tL6#5Jb61)WA@L&^K#AiXgQw z>15o&Jr_YX5mB|rML{-q`)&BFsU~ybl5r#43Ys}L$m^Z=etPE!v&9fKOWJD8LWNFz zHowjSxdf?2J@PtXRiGAGEmmNWX*5BoRfELZ#PIc1g;G12{5T;S;%0FrZwMQ@Jp0Y0 ztdg+m#4nQp?}_oj`QF?8_|tHa+@}&Efl~h_CGwQ<#BBDx{;xQ{Lb2)mQqxj3X93+Qz5yxfq}Kvtlks4WPDj z#~5xFG3WfJ=ECa5B|ZZks#`e5gD4}JWWXS#+3^+1&mgLl9Y5arEU|e6F@_hmBVJA1efnppXLL8s}eR zAwg_>s2Cd|b03KnsAEB8`keA{`cWbdh8vP)`xC3KHuEfe5z{Dv_pvCJ0YyyOH6)m} z?)1Y~LM97-z10x->xAsf%%_@7f=uKFwafKI?w#-b^sS>@t_CNW zQ+wd}>s&~B)rFA?$F(3iSSri2_1U1XWQP+~$}=}m^R|Ok{vT zI~W9F1mZ1(?3CO(IIZkhd}<|Z0=OFqOHpNy1Y)?B2hVO6A& zMNyF1yRViJON=5Ry%0mb!oqGvVf9FmW$iM~=g3}}TC0|BC-;VGi;RohWfaYwVruG8 zqTYRwsN#3iX8&8xPuCukXohU6)zz=@@`qA`q zTFIXKACB6_hG>x38WPAk+xMsTy?Gdxo)617(bjR`gdf!(fXzb!-8FnNzjhrrK-h%} zAy}292&B0dCN96uQlynx3h3u@Fo038LxCVQb)F2Ibtg+@J0SAi%CppS#Mf_bsoLFakTYd zl#65m_{n^RbEH9@oKC$5ZwvEx(MgUMfCEUnDcE|gRyW;gl5u& z=4Z&lofRtN`uwpNeHqvyRITq-fQjtRYXn}0`yz#3ixF%n_{bsLHxKh0MibE(Z z27xQ!){hT0a%7)E5I zd3EzqFZb?LRG}wO5ziV~2S@tOUdE@#I<@6i&_sd@hq!X=7bNEx|^+NB7qnhbV*O%lJ7wfr99z<0gb#0h?m!hd(#=AHW%;T&6sS7+auPQZbU2K~1x{>X7CM#%id{3rS%}f?K?iwj zK{4pY84w(aDo_Z<{SGm;QG?IZd%y)1s^wb7R_r*4##L3TdW30#F=|SK>EBgt{5T2{ ze=KxFMsWbmt;*iArrx)f#lrGAa__AUr&yabt$hZQ*);Qy;ze<|8f98M!vd?paG~-a zg=}%XNGGlWaW#m_xZ)Zj7CeW7+wF`4In{0Tx-HDfX^8s~J?>m0&3h??v@~*QX2#HY z{GHt+KBTN73yUeTNCIAqz+QYBmL8#Dk z6W{NwBvm^-iT3#WH&=0c5~@?umVxz^Sm8#ZA;MS8st6<3rPMobbc>{^K1#f`YaspG zRzE8PN+BUe&{mR%l2AlSOKwurWGK`Vfl1imJ%}ko%cKigD!COSC1Z^|oe%!i-6LDI zO%zo9}XbwFo1550(v;gr5J1A%*`BkQu_n~hx+U*RLP{}5?H0CMB1#0qOxN_m&(BH z=h|6xSwp=53K%bb9bXm2m}UVfAj>{~k_Cy-bE^s^DH0Asu=7Q$%oTBDOx%wMgmRvS z;F_leldeTJb=MF&qGaQWj2_=hF`z@m(1FcXE`jUJ(Z7XS&_x}>AzIIWJ1KNf@|6=n z(u}VnBa0g}v60p9xft0-%GNe`#^|v7onGeA4Wf1PQAwn6DFwxXaOKwn?Ly58Z!@*E z>nvh44R?@TmF#k0Hg^uHL@jtqS$^dM+LW_8PZ`qp{@H^g1re5P!s2L!2!{(_od=RL zp#2BKX6N28J|@yU=uw-9>nDrAhX$|5or1sDEKXi4!{EQKp2 z&d(Oa*d|W{(@|0uV_d8ne~620lTC4XA_dGDQDqe7tZ$DHExNR#bykP#vAl#sYm4~az~#ZCK`bGo$(#E8QsQ8V zk>?*>X0p-xj6ukE=Z#@y3i-vif3{OX(?2)5Gibj4?YPK~Giq5S?m2`)zja{ zp~et49>-S)6)YrD1#Tf8XzeWc$rwryVlybvz0P99DxriT)M|uy9`_`n)sIy}!fDv_ zy>~~=PGV|3iJ-TLSCmdl8A6GAj^nQE#iNw&`TP%wklu(=M*1G`pjM&o;^b9O0U6Cr zczpQouyO^LpI zuo6S+_gk4QVhpP)cT%AdZ)u~<7HEeG!k}qj4`I9Gl*;&3XW;UKptT57;8e4LGNU8f zC(mZhqwj5$#kx5%g2h%DHWoHb3_M##xOGTIEH;{6Cu(QltVR(^LkVbY2~>Q0`PNRe zXABXSNI>txRU(7IgIwIdv!H$_bu657gc`-0XY86pZ~dY8-+L>06N}@!kH4H&JC~hL zvW=2I_=1+LyWeY%d6!}1l6G@_`F#uR%UVD;P|J1ddRkttRCdsQ1!xJ`G^t2x*)b(c zs%cbS05b>I{I?p%^WRMi&f5$ml9=C%fFc8JXKU;EcP!@ebW%J8p_2lx^981H1%Fsp z_cb@C*PyeRXaGSE=W(CwPUalDv~3L+=)C_&caJbmQ9v=#+^{xuJZ`mF99@q`$%1_T z|6Nq*pr4E;tz_cz1jvNGcY=i)wqEHhh9YiKey|8*!pitJ(0}j4VHIL3%y)nG}Y|`w7i-6K1gIR3w2bHd}7~O7Ib}v>Ca~FcK zXye0c%$c%VWQ^WH$`VvKMx~Z>4Nw1Q>j77dgD;BpKMTC(HFK(mJ7`^tj0%FITsC+3 zz4ER?n8m;NJPVQabbOr-Yh+Fq)%@$Q4CI^3iQx#xYiCgIX+0_uAj|08B)q3wVb%TgumY_m2*bENVTJDUj5QrVF>Uh9Obf zqmT(PyfXt4A^sM`!%se~m}O?B45@#QAXkU2psUX=e-IUgB5Be)?+j~^e0Iu>P|lzZ z#$0>pA|wf=)5NX_q)?Hch9FoxIOB(_11C<`&yhpL+IdKHEC92c2xT0J`NW~!BOT}<2Fn;{WwC>3@Xf^LA1eMaZ zM}m^z2p+MsaS(SArQqu1E<7`c>tm(JuD`1vLB%iRPGn#{NO{#4L;$gL_jW|RZD!T< znMKr3iI_G)2F4^mqb~!`aY}jhOGXKmvW3v15T}Xgk3beXKl%?3j!ayLfQ>FMR+`HY zK!uVEi~g2EcOX0ynumN5&cS=@&Doc;Ozyg%2U)RITM|Zih}rYsVuy|0u+?ZHf3%zT zRdWJT5=ejk5r&_^P=rhdd}8$4pDfO11UKC51=_P%fh-{;7QCkiP_ICU9K}%Np=1?p z%;JNCP`AY`yh%P@(#j!=c3@(VC)9w9zZP=nS_uDu{19{ z|9w<3i$)msANT@c!aDb`=ym;168_}!)A%?9lrIt`Wlw5?gJOZ~un2vtUqHS&wbMPX1w$L3pn3n((sf9TYXY6J;dVf>X*42&C} z1yQAw`US^GFP`LY5s0vmRg!Z>OrN)q9QIlS*qq#_I(s8WV=+hapdjuc`zQL5vrt_n zb4cND;hzLhMNRi&ba6Q~rmU?n{qX%krJgC4xpLiu&1xc; z1eS7fT|IRkV6>AHYh(8)MBZ0jDj0q=&olRsHm8HC0bu=h_{umbfDl|yEk2VpyV?{I zL5nQmoLIX*n9~kF?);6Bd}83gd8-mh+gU;6Im$p)Lmn-q`Aq({=sP?4;xZ6 z*dmImcNElOR=)sIMs^+*V@!~RkGDA0X`J6X3P&lJ93__2BIHXTU0JuhO%SaUbM8c@ z72)K4O3PJE%{A@$*bbk2{;O%#2x^=`&&t3Cg;)Dqf%?Scv+1+^RY-IvqRLT{zmXW*6ghsE&ufG-u6dPx+ub7A}B6I{$VW$h&ZlE z@V)zI`$y802I5$8M8UbVvQD;pvj&#S62WOz?#gQ0gP9#sDyFsYLOS(v3>Nem6oO)_ zmM;hb{)8!Q2$_XVY!24PiLY5<`L;kSzgZ_*dZOZ|C;Q^npssh-vE!VC{~qagY@zZ;th}uvm+9IQHy*6bK2H zyn-mkLTMbQR~=0ms}_3%T87XLpxXT;WDAN&?@|~F%SCcEkdB)ajzhS5f>`b+$pujg z0m2{Z=(&hO@~MzD)-NQreY_eI+j#wl= z0(KqbD5FQHEMzr<7H)`TZ3K058h4S&gUV5gpM+>rjf;I{?33f zTW}A;Yq2shu7K5TW&v$-SP7n)j6v!~cJEBFq6m8pcVpRwCb@?eC|xp;Miha6umaX+ zE))P&K&rn6oK|B;?!_X7KUI^+f>B~h?a?ZfijZX@`E7_+ZYqkWK41IxxP|Z=pYi2d zwR0)&m4lGR#!DzNc25y+w{Ba|f?@n23Nni8l99v#Wb`Z!3kBVX8wDovaSgHp)R zSSM}+m!WX3XS0YWnCa`7jI(};3f3dPaS&Pv>$wKdheGW<_RI!6B}nnzKMx6va@*E~ z)X^R{u%J5$`?N#xW%|fzAAz!V)}V`pb}F{)zOi0{uMSs^GuNV67NJt5_fV_0OiBsl z2Yi8l%?jfz9);*_xJQs?6zz?rfOr;Tu$%YRikO|nN8Wbm-2ZUYJP)f@P9}T`Dlw!v zgW~etV(HpznDLdL4u?^m=H3Vw0$6}b%8+N2))=!)RYTX%EJYzW){(mJMpX_sc)PLVJ)#(;3(eoX;2_9;7^ntC*d~TSE#)cxv4Hzc*~+i zP9lRSqnT{XKbQl5tZ`?}fgID3^w>4TA~{rt|$@JUEiHkj#;= z09n|k1*UrMOXx~0&YA{<7rkEYX)PBNfrCv6Sx{5K?wjIdNAXWSH z0u)T;vv&q<&ud0}nYvKX5?-7s)mtwKiv7ABO z?v=oG><>^eRCl+~NZZ|S56i_#+R%4-4?U6=Ng>B)MHkScPEOCfpr|mkP%?AGWgwT( z7kAOI#XuQ{dqEF;1Uhg@x>wlYs|Dci-5^cr)Kc5bqePr;v8!3dP#^nmY33*g6A{;GvwLSt^%R zl2vt4N5D0Xpn}Suh{;$Twka9KbyfDy3WeBFggfuA7lJ@wTtvH?8UXp4zh^wU&%N&s zGv6pvDL_6OG^=nOZ;0$|o~eqXLS5bu2JjjRqUy;=HSc!b`^nuSli?q{D846ngQ%xk zMH%Fp^^r^9IG2wm$$FWjiCI8US-V}My(|^5f^*4J63=0?RK%3={b7EP2=8#gj`BXA(l49Vo9+vI>xIwSK9--(9j4Rnw$x>?0%EjWU9{%|vnlJMgZH&fpJvK8+ z3_%mHu7Koqt<)H?3|;-4*xoU+_udg2jz!3<0Tn5ZZ@K$MVMqmyTg`l`CNw z+VnM+FevY3l-1!BRbMckZn>9-qE@ zf4#y%1Cd+TNsIg_CP5#N&KDyz{4p*8jv)w_Bfss0QHoK8rphuC**LDTClgB4|@&8`a~x8BGcq7?G!eDyr;hXo-=I+W(i+#^UJT41Ss ztQIqcp33aSs-OR+?Rst#L3xj`D`=pEd|Lx>UQ$&t;|A0xShatvCCJB@<>vl4jogBg zvdF+Vxecz$!ibPwgu#!$=8wajf+&1=^q~~rH{+=7;dvSCyRU9wyhkF)&$rNS4CDZ% zg}6`@+jpP;KUt(4P|om9a%KE4;fo9~dE=!R6)I+YJBM*4Sp=I~ z>Iq*KCl<;OYP(v-B^ybJDmfN8_+9=gH+H539klQnYX^lGT%l0L?0G_^5aB44m|Iug zW?;62IR;>577p;?&+i>w#Xs|xd_~(*6yKRer$vO@hIJ80Cd5iXtwm%J7^?m42CNCh z^YZKHmMps8gTd-Wi!xM57&r!1s&llxHfUskl0`x|{cuHcKAl!N6oXdes7IgW-Zx91 zi-yM))WHd(Sasl80!O`pg?MH!Bp`GVg?o*IU@V}7mHDj)WmtU`ty~{k#Q(}A__s1E zn7sSJpt6Thjc+ILy?53t11B=DNaPg5Dijdnsc5RKV&TWchDUFep>By&N3Vf z`^|cknWZxjPaWr)DhE-rw$PDjeim6^@73)aw`>h$BsJf9oi!JVqfHUKgaIGtgM_E4vvSSYe6-JQp{KtbH}?|bf>c^Y zgE4e2q>eI)#gh=OE7vnW6m53y6#Y`1>3;UPU{TS5056tlUS_Sb6z1C=qA8!w-;#Fde!FDB})iKID#Y%H{uf` z4Azg3Z6=m>E`T$0SRSk6N{}|zJ-8#m65&Ncgh>EW!R_v#EN-HTn-yWGLnUbOv=*f{ zp5%RwXJc)kRRrR7%H!yi)paG@HYo*GWhb46wTwR$uIk#6RH-&9pO3Iuv2hWmId5dq z2n&(bc5MsVRX)!pcuFe8c4{}5qLG%+LI3y*hcdK97;q~z1nU;uV&D(LQolETuC2DK z$1)j#Oss=7pdlsVCb=mkWG9-YP&&1qeLSx59DhEoIG$_PZKXX90fdZXj;qKZ z%9)5N9Ht2ockgb8Muc}HROdE3@BY#L5n{l4`5Qc7>tLfgYm^ni@9c73i^YdmGexX< z6k)Ii5J-@GCNd=j33@CX!bL-yTvO;%`F}$Ly2aHTl|y6~~Ak>-QUS}Z&!pV#?gZXn;{a7pE=0;d(t#Ko{|B+H^0qm(Sj zmNu=!76PxeqdCH4ovy!=r~q*kLOVLgV&CqwaDCx)t5o4ct8s^sSCQh#OILA~i$xBy zgt?!6g2L~ezxk8O#C^DG=ot zS5-1D!@&*&OUM{0iyS|1S?N|Z4`Z!LUEsXBQy1}fnW(r_LCAvn3mrTN?ERJBUYI488>JoSl@c+Sv4!FW=#G*3eUX} z9K`_9lmjO+PlQ)~p^PT?&^~9Uj+{R3pedt5zd%GKi9mVo%ZMNVSB5iLP`v9ljN5%} zP+8DwX^UczOFeTiV_C&so(L-?q9lMJ>4{nD)5jlKMM0%D6n zb2pU21{LLD!nB}OUXH*a972q2N_JU5`3C17u|)7JL>AKFRpdphjLYIXfz=}8B}&82 zCxQS3XrsY; zT8AjYiCwHgNa(~7?ts4ogRHC?83SAD0TfGv3T2?VTk)}ub)$gA19ENGlZiY1JcLv! zG|*Si(FvS$Eg+u~dQcTotF6tBl}r*&}5NMloI$itG`XZZ$55Q$k3?dn03)Ttt}1WIZ6*NQ=j45go+f~<`&^;=LdiC z=tzgEmhgC-sx-->-A<-X<%$Ll?ni)|nW(PaXc6sQ+leMe>-joH_mvZ`H1`W=F$hl6LDz(+U;&S)rlaKd43Y zC7Cns}=NUd$f3W5-XMbQ4Olq*yeI=O}>N<>NssC=uLgaxx)e1l~p zvs{#Mb7K@mas`pWH?*SJ)m%M?xxd{~RbM4Y~hn#g28*V1n1TPqPtFgjM7Kj%CR#nC@R;7FcyshlC16 zK;XpQ%geRq?DI+8o6lzr7PlHyW8K_MRp#P~6nSLqESAu-l3$sxCQK@Tu(4iQL<(3X z;>bWfL!)SwW+6+)2L;H2f*gJ@OlTbWMfq<-P#ZS5T1cqZK<>mmg@9EK&f?=vA{MM) zh|707DyQ1&@;T@w7ov_Kom~4VtE3(|MCnCd@)Zn}@o=B^fKW_atn;lOJ0&bkJFvz- z2xFFDB>oTq+IeA%WEHG>iWCab=V#c$u;h^6smE&Oz1nFe|A=1v3^UJz{R|?H z0r4_OtKqxJfj(B9fK9-PLia>!OJ)tk57x1BKNhl$&j; zaU`5IWvpbYlZ(Qu4IsCj_kMhMgq7QHiO`7Wm31`|fGhjeYlm$h$uoj?ztJmH@W^%+ zB_wj%cC}53A`nHfHlOn_0?6WF&J+V&@l~rCXkIQDD|pI;hTFY@Lk%aAFy~P+Rwjm4 zTcBKoEWuQ1=KRN{Xy#;{<*)O%MhtKW-rU=!QUnyC#Ima_8fCTh3+mZ+U9oh=gZOb* z)s+-Puy_9?Ln(qAOY^x~x2Ln20zfR$N)=^d!L9`= zww#ra2%|c!@-uE>8#~@2c?C@vD72{#tneWXF9;*~aj}k}v-n(#`%@4u)j16IMpzS& zug9S}ki&o4+(h2HE(^Do0mRP<=PGv`-;X7;&M*JdW%KOs+oxvS{qCT7`I~w3#9_n{ zSe=O*?YG~r4Nn4(8OVu)ouUj?{ILx=0@M!G&7fG8m{nqhkDG*%3R$FRYqw4Qy!h3$ ztQk+h;`y=4)yI!T^l?LLwRxhqA7zb|R1;`?vFxPC!0+0qqID6Jar@1-!lv}>{61Mt zE!0o{e%w6!XwqB=EA3j&xa~903s4&@EmY<@h&4O&zj6T4b?w}IstAP-wh+c)VKlHB zi*OG3Ane0ciYMe6s-l#mc0NVnC83N5uMttnrkWGd=ty4tV{k97 z;_X4k6w(*VcAsjhi5LozgOUkp6}al!qI%;BpEKL;2R>6BfM=bP7U{nf(v7Gbu#%wy_p@ z=9kF{Lx(EG*%Q$?)!f0<3TFK^pP3htgc8tzVu&!v7FiU!dG_*JHxb+Eyygn!Y$Z27 z9YfXj9ug?C%0=5{g}Wib?uo1HzZuREF2P_HkzMD#@83N_UOW_u)mdmIQSHvG)r9!Z z^`YZSLSF)-4u!--2@d4o1{Pmci@)JV3G^UZDS^TT;1Csy$HLm(G4VqzJa9!opc!$( zR=JaE_=tr#KbIC45zTvsu_{FoE>A9;0+nEMe^#NZh?@}wNXF=frKccIZe1L$W zqP0j-e*EB8=&mO!V2#2ujM_GIPuYS1xC8fSTpK(6+IA(oW?tNp2tsYc!C3x{jJl>m z5mt{2fnVv|UVMQvwfWrtU{s-~c`H+U4Jy>*@G}V4zBry%l8WM4H!?GCk&+~w9EdQ} zUWDpY&Khwo-s5cMmkCeHfTLH|sPo7F_MIc=@L`G4yTUIP>ZzOEe1seZg zkqHkmW`t7Wgx}nVe^tibxwnxyC5{fkB#Tn)7)j;yV}Zg_kSj69#W=~_V`I3=imV7e z*Yb2R2{z{gDjpdJYpzf?Zl_3jxJ0311WZ4AS8BKNmH*gc{h{8`1J(JTXytvdN#uAVO}8!CV`7N>M7 zWaKX~*lKxt)oZ8I793*UUrdw>}MM_he60+bA%~e0z z-Ag#OSBL>iZJtg!yQIuYC&HTmpe&;YLf%D@i(p*9)7I3kM z56jPsMKeB`7O|{2JOXhlr$up`9l}P4#lR!PLWqdbv-spM#Ou|G4AO-~fmo3Qgp$|i z?yzU6v+&}oiC%&PGu_aSdN4tph_8a~5sh>M^EjwvZW6y;G470O9#${`SZ zRpN3#u_{Qd-b1O`T#pZD0V;Z0w6sPeeyV+nQT!Z1s0g};EF(c^Ij@eR{LG#3jfki| zKBteeBE1e+w0Ute%D2dCHDly;B+TFH`OsnHkO-VXt^>kE=`4sx*A&;t7%bxU>upP$ z^9ofOMGW#IkV}V^&`x<;f5UC@NyH@aB@=pE1{PK$kTQ`L5gHnI$t?GmG!sr62mata z5?ZRcTn2Q&izJ$ix%w(H25aJk7uH|g<2ye)Jkom(8iZ>?C^xBIxcC#BKEY9iTH^M+ z&R^@ALHr2bBt5cKEnE@?ED`=ienwCvmMRyWOY?_l^__5p+G+E$eSnllz9~qt$U0LG zgO2N=7!p3%ZspHofibS~n~=r?xg(P$AY0otXO?2*J{nFDE7$AFZ^S2R7GeEf7joIL zWbz6$=B*cfaGneE29*-{z$smw&^D=JZJ^M5=4&vY$l_$vswnNxGD_M4tD^$R$ zKF%nw3aE^%%&v9Sj!&`iJ?q-}@L%6Mis=5StXbg{;RJ?+HEq0j(>(gYMm_OL^2fP! z&i$cfwsKDstJe`Kpf}{l1`uCh-u2`U>fi;0B%hVJ0+obDQR=}4PKgM?(EGWcw z!J$kW25Tb+3qaQR@j{zGY<2wPqoRdEjm*a;5ReWkUE9MNWc2pG=}~V=&ACs;WYdRh zu{Z+dQV5q^Sh0o|kILiw@rI4pS|ib0Q0?mZye1e6MOpA9E%hLn!3eLV*Im0(-MJn( z{_?LcD^n-}IS!0_zyo(;{0eEfhwB-SoWH!VMvGCm7=8KAnqmApsZnOV*5F!(}%S{}b zBt2OtR_6MuQ}W`WJ`qfqZ$7V?0xGnRj!~D7 z-9AF$80(g}k+nlA5j@EkmM8q7u&nwx*I-@HMWqp6$?#s0$YuKg=2+9!MeDmAWdnjY zwl-oNQOsE^WD;(1Mo81hE#s!VxtJZslnjLP>6@8zg@_5$AcDEd@tb2sK|vJgfFD7I zl10YC(z!(nfX6s}+2qzYAvExLWuE0Ht;Boyo;U+fOXv`ID zT~9NItjW6iTa;((KtDrJJFX29ax2JbjW5QE%Q@Y}VVj)~fAHXlh7mZ1EWd0&x`nm} zAKSgoMJ9xS6^H)@>tMoKiqA`A!w>;VEYyltGE=Tu%GU$zaH0iX;vXcDlSIg zSg%DjK$cQID~nZ~D?uJ7kb!TZpNAq|e)Xzm5v1VPW$ZvLD%5`y-pywdYFDfY86v$c8EE}qWloX8q}c{`D47D4}Ny< zs0dU3NHoxVn=U0(XzozSCKogz1dCef z(OeUJf$Tf)h5TiL{J8@iSr{wl+p%h)V>MGmP{?N0*Yl-~3qe!pafEHXo^`Tt{?@UC zQR{etGOi`dcJ}$QdHnsIENu8m!m5jB35RR}6ZM>iKqX>${>ix6e7IKDR#n1j;Fuut zrP8UpSqxq=c@|1l4GQSN_XzsC?+(jgs%DV)B90bR{h^L)i}B!0!pl0a>78MfeL*v= zMO?XD3vXeJ+wE_OI21n1xS`3NZ#%3rN)lzkJ?ucDj3-}=E8JDO4&c}PL|v51?yjtV zmZp`pgcHRPk#*ks_QBCcCSUz&d6P7)Q>j=M=I_nV3QkmQF$JG&&AD*3c3BtRxf5w};TR_*lJe!Xmy{ zK0+9S16b^eV)EtQthxwJ{t;ePFuR<47*iI1w_iNK5%o&Z)%+U940@0_)xx>#V}u2{ zDnpsEgI@V})>~=aAPvjb4=EhJ4!`hkT}7eBZR16hLXxQ3!ZODyASIj>?%Bwy>`N|C zgwJoEvl#A>`+8ndA!rOOm#aKJ_aW`Ajv|k*bq&XYp!zO#a52#5NO;$Hq0FLr{U=+s zmW6t`wu3E^Lm^@3gMWGNNUtB^f=?RGkE$HeEUnHPff4y`Idb^|p&6f~L|Yv)5sKsk z;nOtM{ruOHW@Xm;^8Ne4>_UYo!BxV-gffa2!br=8ai8WjlLR2(+jh16HwJ*CG#3Z3 zK*CM2E(D03)t-N+dl>^}i@7Txfwv-VdKK~+?g^=?nnGM!p-mRBws}XnMF2W@2#8`C zFDs|C6r^PF3Y}Q0=l2ME4`Y$ia|6rr~0^Hmp3$uO!V?9Sdh0H{WtIZWsUJ z({{IyquW&vwP8yt)mi)+PNSJNaaQ#(rh)nQvcSSJdG*RgL~gow7V)`i-TXbI(D4GI zS(V7)w)>Z*$cbAZ{txuZk`X#fvKJBe(4T-1+I}Vt>l|JWn5N+7BXo4{y|>pZ)hkS; zOm!MbtgE0mRtUlBq_HU3b>Lloz*cV8uDu9xhqwjd z*GS%#BcN1;Oi`%F3$o&4var5HP5DKR6N=fe_kc;R%NoI3r(#P(H(#MNVw$%b>h#J7=RUNiKk;V4f#;QRjmT{ZOixF020fCS`i(JRLWq~DyWb5QK$}h)A zhG00?QZ~MxhpgSmRfG>kiO#Z+y@X}9b(vSy4e)?m?slve802edKlx0Y9VLkZ718Vy za!@ExtqtDXJ+nzV{gxwnRsr|07Rq4Ty$A(L$vHT5Qy#&!tf2}am#tE1??i3gi@|h$ z@b4ZR)dq=N*dYswJ_WZDBhe}Z(PA2SK~sDoi^r%dkDbYYKK1ru(wPuQ;yWn@KLlE9 z??7IYE0B33Y!*uZwAns9$qoEMPQRY_n}ywfYa@b*6$TlohzUx*@bM~L3MaSQ#|RKd zz=}8a2Z;hi2W{+cktMOXsp@Ntvdfx553xIx{%j zkUNTeJPBm)-L;_HG{iWHJs&r_-%PY5ITRT=u2pMYpG6Ma4kDIdQQcSgCUeL_$==E9 zQo+zmhZVO~v(I|#g{0uz6SOc^9K}5Rjf{)1aH;kI5m^WBJMWVq+KizyDyND-w9dDG zet3kW@q@w<``ZdC@>;=5-t2X((x7P%>*ZTY3$xe+e14ozDBogm$B^qr!5N$mMv=69 zOW@Rlka9g%J~-?Y@soQXd^rUTANu-y1{&#JS;mU=-W|NVUOS3p*D95nvDE_RdcAI7 zGnTURFyz(gAVYQ+K_x1XiuRy{YQ&5WBq*8AYJSbXS*Er$$tww#uYVOr9q2|hDVvrw zz8(1+?8j=kzbpzFaAno+n6U~|Cugdt?Lk@lQDV$}5f@`eu5VPQ6qsk6$M25?P-vJlTEDJM%D#t_q*XPSwCT{r~=Qio5_OX zc16;&ZbbrL|JMEy>%=DI+-aCS=X?r+SIr@>ueYQrt^h-onzaw#)~$*Za%0)S>a+}m>Yls84Vn8NYz4q~W9!kuA$BPyGSwPAlY-IJ6#_KfhHveCH0rIB~Wr}qm zmt}Er2@)-p1&j4r-0BOARa?;2z~9-|)0#LIt8Ty#yQUJc4xH0Z6GmpyC02x7;%Eep z68Wl>s>O@|EWY|f6-!RU=(tL(E#t}XYJsgfmqoCw!+mSh=c~$}FwbI%Kzs&DKn67g zgxG7yVkKIlD3U&vGmskyY7#u<;!_b96ge*J*cLQn78^qXfmn# zY_4@%g*0T=$pUeN^FXO?8k4Jr&n!BD=qjcR#!!EU(D9?j%wj1dHvRI;X%W16Ak*`O zgg-ZV?@FxkW-XQhIs?&__z7FD5^}~t5uhN&p?o@dv1bZvJ}le5``UdI8JbV^4P*fz z0R*bXlZ>Yqx2P}!4WXh#t1O5yI;^ppQ*wJ_=L+mBk`}Lh5P1)SD-_DbT))!fS+k9B zh*G@BMQI!os`ha~RYs0nk!PDzs{gN|liZBag)CQuntRp_s7fVNSWo;)!C`(|8Mj?9!Gm*|A&!y=(zkADPUMy2wk^QxDGyYO+f8 z{$7w05{YPZ;)pOpNMvVK=SP3}@Q9YtcsBjl!?2k_!ZH^A6(Pxkia!>A-27KP$fvChR)|%K#HVOhwJbja972Z z3|3%3~{S`d)|Y{sLvKNoa z?;x$$xeLe%U2!UIs4}6zAn)Ubp^kN!%TEMFC^2?#zGRC>X;eWFE9znx8KXYUx<_QL z^vvohSXE?mU7X6%fSsTI)oVxPuUs%1RBSebI7^shaxC8>(=Z?QWf8zJNVE7ZOi*0O zV2f(zJzzM4wF@z|rWK?|F2?CCm5hn?lA(~&eef^VN=}}e zRDF$!{e*DjHrVXNwaABfLfWDb5fYbs$aRgYI)h_aI-w-%ye6S0a+R>GwHUulW9eva%~wp8zwC-Yg8LRPBos076_PC6DkF( zP-z;AhyaAEI7M~S#P3lO0-*>c*sIYb0%BE^)p*_Hmf>rHp)Afm#7!da zvR*NLK`%0yk3a=S;g)qqsSsZRw}9@YSFeyLGx(oidM%2MKjGo6->kIqWz#(P?pCw?a9Bcv7?`o`+Jp~YS*-W!sdo+Ji3Ruu zS7Lbz1x3WvE$jv6GA5NjF+8YmTc2aauiS#kw0!^}RSETmw3*AvABt>2xfp#EJ8vW; zjg{-i^H7I!D?yPq>WLIGZks(>oIm5|cFsnRqco+|f!^AS5R%ARxhTj-sXR&#;_&IK zQC6S9&MmUKhedTwVWCJz+E#|H4rt0;jam5{gxjs;T35>;;fRq1;?fs)|TT%K^mcgB^kE!r;k>Ln8@} zD4E_t*6qrD4+KZf3OIH5SUKU`$rjjZGg$%L`S<6I_r2MVh_0h&?n@v}+hVB6fJ8c#H% zTxBuqOv0?7bh2Ckl;~}=VRR{H5J?8Z(vgnHt zp88fx&*EjVD|eCm>^MCmp(TQZEBLN3GU43)?+(j1LWJI0Le74>p;Gh9PC`#miW^k! zJ#1d~kh0oOAjyRDII`74G^+zCO6znn^QmoIQQ%Vi7?I~QkawMsnmNDr(@`wHjrXAh z*XMMUgEt4INYH?i;$-8?%Vs(r$2exy1bguMprR8SYbvVqdSC5X$zem`@w7g!{jr@VKpkEP-$_?b(`FOg3F>U_FvxZHEKy3T~Y1|4Fx&NKr zEJoHW*O!K+amC`}R)lC}F!`Nawc?J9V;vhG|6P7Ge{g`4Puho9`I4WY^|y~g)vr>+tA=68xhP^+3X@&^)XyV5J5&>~qP3vc5I2<49@yXtYT zv0fEGih*y4!5NGOSBFk(?j&?%dF#P?#oNzg2++oMF;-3yZbd1Yb{i72g5sAp45y<`T3@a34?UgYLY(WyOS)dk*>^)v@_5ytb!vevV+&?RTE>fx# zSaM1c1>eAFY@nYYgb+ucu`IGO{{>tBpH9 z8?WY;X3|C~%I44iVOF^cTuI{z*SHq>;8LIcpBK&U+j&1-jv6C`3)AP4qimWiUuEpP|+^O-mTrVJ_+sdIW*SYAV{D2^RCDuh^+ zWJBekqsa%~9F#&3bR}$Z9|Xr)z4Gf&0Z+gws_vcv;s_3AK;-Zc{+^E$jZh+wqa_dm zuKLBGwQS897LC;kc`UGN+a6{P3QDY-P-GeTW{RsD*O6@$%46{>(-B8wKGhw2x@aG@5|fl(MXKcC5m@dE2?O^? zRdpfdy_5xvd;TEu>3m}I^*beOPXg8BNRYi)3O8V3YqxSI7W(Nl%sju35?Uyv)xzjf zq9h7q4u9awEu8motsuNudK4Jrmq4lqY(;@|BbSQ}>YRoLSTs?OT}KpHTReoQ!!)Dl zEWLIjg_A%H?xVt0dKDM8_sxFLr&m!xYrb+5Du9cMK%~t7@c*3Gcst+w`NJa&oHkN| zy}-Ta@YM#9yk7bGSe~un&Yn}huOnR~WcK^D(4KKC_3KPQX-y~svS^_A-T6NzXK>(% z|K0cOolJB)MCI#WUbb1U_+5|>VhI*P?7q{U{w;gAd2d)sRRk=)&%#LtRVFg8gGie| zAqb0*(5i4JzpE3&@?OdW;V6pCpM@P~E(EN%&%zLZG77D@FKKfA*$yF#z|uuG zw@(vgjR+^@V1*iCC}th+79>RO?tXhz_q=>DFXh*HRgqV&0}c9dKh9?0vM!>ac+lfN z*{COuSDP9H2}&Tj6<)>|ps)zY+#ns<$OSm*h0*%G-{B;lILfd_yFufV=+}oodvG)i z8DEs%F*b4wvXidmD7r}$9um4Ax8lJb^}K-ZMFFZH63s6w zyVI5``B)RHuq4porivFV7aIph7RrqzU1%|Q;xa&@8%uQbLP{K8ARx$gLOGqNSe7I zrd%4=BPxKNPV4gdtB_Bb&pKZq@^-qp@o6{}rBuipxX(`!cbh0OPWRZ2;z2D>AG7`L zH14C?!vaNmHW(LDDa^D{MFG!xY=m2prLAoCKHxQ?oH`-pJhJ-HUpzb_P*4ZDTc#eZ z&jmmGj~5lA@`trcHWqJZkOL&R29}Ib%gvWnN01I=KnlUVu+c(SD|q}7C1JVJye0H3 zlF68$HgV7eIVzM2wBZ{DZ=$!&qE*a@utA>iRmzi36S|HAv6M>}6ZhbR4EIn35+arh z5K?k&xh`1dKI9+lv%7Q}R}|3vid03pG*JpcE6I~ZYflbo**O*s1)Y)x<{_1&i$$_Q z!=ieBok5UQRfrN{-zvm+Oyj-YG3TaQ^isnUuEQ)WFgccy$qWTQMSFd}l z?aALw+T>7R8j*VbkJHNT3CA{~%>-H9!xSMmR4i{V9G3w`xdR2OLHso>e)_9PxdOfZ6v6xULVBL%b$rIP2n%}o($s0J zj%G6^MDr#(FC04mqD>1s7uh^nk2!0iR9zHh@a0|_wETM%Z-^$WvT|Cs= zwQ(2WEQErb2>Fs>L>VY=8Sn3ev~gK+E96*+nrp0z*KN_h_rb7Wx&#W6qg`N4f))Jh&hv*nQnY0?Ks{KN!?JEf9p1OAz-%sFg*OK62AgE3Cu7jom||gmT7# z8*oo{QI&hiLRA7RXySdgmDRZNCE4b={~b?Lk1XUha13NzCD9iv{`&97ufj_NI{2j2 zE)olJseW3|+Pe^Z>7xC?34e2E~m zoK0eLYsdw}CeV(kUhsPr=B9m8+4o+7+C65R{!k&mEi?*D`%+ zu7SXWQ;w~psQUJiS_=vh#mv46_A}PwkNN1fxx)T?iz=Oa@YbL>0bXG|LdInbr5JjU zu?}>|df9|xuGMBAMZm}QyhV9sKRv2s-~ z)`gueGK+JE9L1Lx8Oj1wXqL&b6!EqY3dGr)CuPj9mygc^uyFprj%0~a)i$Zf3{0^A zA!t5P!mtI6-x?%L^Bf%UJzolDWdkb*(2WqHxSks3D0dc*1@rg2m3nP0f}o7e`;k5y zSnUzuqxo3{5ydapB6Jx_B-UcD4g(T#gBFca=;2e>w}+8GH*fnMY^E^>Jr8mj8f+cZ zDDvTMgm&B#nc5=e_dW}e)Dy@ap{;|tatXY}ToGf+PzE|_i)DV#6@Yoh!u1x3UX{rV zdSayGZ{I&U`RbzlIg3VyssSTD6br|? zaRc!D=m(o+EqeDrC5@FA5L^2^>ynKEtHK@xMw-$w=@h^XK_LqsWMM=C;NFwI^%?rv z0aCt@6=&;+$JHI62hE2Po-FET{#q8y*eV^Jdz&N$C2)`_k5Gx2Sa!wWvBGVeM`p3m z=TYDcm`gKvu|0uTY#&9ixq}epDJZVbcDw6Ak8bngSN2Q{BJj36pNhBK1zcl@x}|`OyYt~69UdVOr_b9n{u~eY>F-lNv8RBX8R8=D#Jx5g(BV*v$lWzXMcl4A uDr4XM?yz|hvgorAb9pn1LJA)j&3^&6?~ml&6%=#;0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>Dgq}%6K~#8NJ>7Ye zW!H5j_M7=~dO6ozg(}P>KoXq9u}M*CwbYYCa;w{RyTgu-aM)ox{FlFi^Bee6*%5BL z2dOENAVGj2h@s}HoLHo;aC&$# zobF!?OE>3-v!jb)b!%}rJv|@JjxUDGVHgfxoDN5a=fl?Pi^I~&WH`_3N6*i5;kn^# z?{ZkbwKy!!<@MR+Fu64hhsP(w*~!I_TMu(b!?3oxJ{&!r4O_Q2hu!D9!}9g{jA<^f zoeuLE*Twv0#x)t{kLQQui__u8{ng>c7e~WcuCTDQJe;3qOgD0^<6)S;oF8Vhv*B`b zF>Ksi8lL^`c$ixlhQ+n{;ppIOIM_WMuD!85EUzpN$Ga!P^7{O6nV}wjaXu`}%?}In z^TW#8!f<$WI-D%#I+u~f?)k8pYaRUIY`FbuZj|>=wvUFrCnv+o#^Nx`{3rSB#{I?N z@dvYE{rciCzdSb#$N8JDlhdq`l)zi6Qj zkD%uAR+HJhy*w-olVM>c*FQQNjH<~ zlVNppahP6P7#5>cgy8$Z=V$rc%5auRpPrl#=VzJA-Q{8b(a|u!5M_xHTxJ3UxAh>( z5g|;oNC!`%Ou5GToyB4MwY)#qS--h39KARnP7ZRvjDKx&X;`}vOUYQM_GuK^cy51f zI?SGCym!}!*~^0{)Y)({yBJnBqtscHGX|8kCL?n`+0W1Ub9uCoYf#2vSdH<_VpN37 zNG{H@I59X@upEVBh>MXU!`pv+I&9us9@cIzjLLm0W6R%-drKW}uN}FazP#*OPFCiI zyYH z09kBWxVSn$%q>Ub^0UQVUSG&$7ow%H_Gi)NpoE()uTApaNf(ngAMKqDv)p6t&cd+! z>1hNN&CNp1E#z96`0>ju@!7>N&Ej4}7K=-h;pBNHczrpjbDr16#X63X9zHqC0$)_{ z7Id;cH@y5qEH*+977XjRBm6AxLMC~#7Xjax3}+F@b{732_gKHNJe+1;t~1@rie`Z( z8PCyv79_$uKZ_tQve;RHNv!oEbEQ19Sn1i}5Om3$qR_?(1z7!D?tFZ38ViryGS}tn z`8me15;>3)c~M?=e;TE_aeqAue-h0YhP}rp!`jW2$nat~czBw5L^&dRi+>!$n9ERn z_BgLiW8D_d*nM^uneTmmGEAaihxzwr6k$Gp78vf$pltzN&9<9v7p+5iROCzXtFU3%f zg2HFH4+ATNp2aY;h?BSk?(*>YS*$$nGRA6di@D!4iellfWpOX!E^oa(9dBRK z{9GrfUh82UY-k1SQm|<4EEA?A>$h^>r$-|fi6Z!&!GnEVWyouXvCPezfyHe;FPDnU zOmyS+(y*5WaIfk5Vg-B=z4CPup2BVTc|R7o7=OR-QIit@}&Wc&>pJUgl!Y zKROw<;(Od^HAH4Fi_CIpbCoDUWo;C|m&KyplW5?xkB`QG$6^m31=<4DtJh*#aRHOl z5X*d;-#ZH|^RX4x6w_aU}b)Doof!Vm9lemZFYti_S$jcz=MXq5H zrkkrlr65z_aWnHd3gui}kY1q$vDU(H=M)4roNfvYSPLw9rG9O}k5=cJ_Uz)~8 zAAUBvG6ala9ELES#BEhZ(PeVrLe2i#Tgz2o@`QLRSwuwp1d)r9PC`bxqNT0Lu>09* z4bQk-e7moxQDEdAs%ua`Eb40-&z@tL$tm3JaUB^_#4z? zxKMdF$~XD5|KZIYi;3Cu$)JM;&hp`rFVc0xB3#v|zBjo&>0^EFiWq1*#V+}|tE#Lbh z!eHIG{%VA@_wb|>=Nc{#=fd*yH}^Yu83bC6iFtwF1LcA}W4u}E$N{LhD}AHTR5u6<=GiZjjwj3a2| zbQIUN5-xHO#a+Lah09n)5Qt|NIfh0-FWe)_EV?QAgLJu15jFGV3S18Y8gmuU^u9Eb zX}E{^S?K4#I~s1kHyxgS5dV<1xCj93Jvs?@${2Fr$&df52Rpl;1^#mJr@ub#f}JEZ zi>_5@kAE3H5N#H=S-_Q`0xQErp@zSO%_vaD-pJu1*PyBXf?}3^l!#y&)^38J^(@*? zgCW2XuJA0vH}G7CPo~wPiD@hxX?*cvEHaRHfT-rrECgtIJJ1&7A$-xrMJ$ycU)x#= zEOJdz>^8_X0aGnv=U{IW2mnK zy$gvl0+Czs*DR9o2@uhnTY)waJV_f_B7w`3xWvrScwBcWNM%mO#W2oAJa|XmLz#SWry>M7gUXV;Fs3`4G@9# zpXNOodR$(7eynW~Ld8NXwxrE@U{-WPpdj5sO*faynM6MlN3Qkc{e)NR;Ye{84M}so zmm#3Xv1YCY0#a)8Sc; zVfj0aFdx9t0O@mrb5T;ft|c@SR=Io56j z#-pScS*vPh7C|n6rCXeZ#Igtr0+qQ{%lWv|-T3@J1VS@01S@(nJo|JutOkLEq35yu z8(&>%D0&dGNNBFH8JBVprKw+w;Gl+y&Ie6g6PuQR0+(P^Ru1=|ROhh{T!vLuQ6u!l zSe!8tx)kk=x2D74eyl2sce#Q;lqIMVXk;sWjxQmB{OelKauQN2!Z8=?^6;03 zRZdD$LyK!6Z|JiXR1xw*59FCaizE=_{gA*(u4x{VAOFi&cW4v%1hd$*fpZJ@zOx!3 zaRmv#o?bNU+k6F4%6p@g{QcJ5z+bc)n{{)GZxO*hA-k?@mc^9Q28Z*3qVV%95)v2p zvz@Rc3UZdXoRv$BN+4mn$ea5VHKHU!srd|k_v6Ib?*{JTa^|LlH-=3MQ3%8oVYHa6 zoOR(Tdm+2V&0-Ke=s`Kf?uZ*<;Xe{8&l5+l-2?TBX7b*${wNO=cpl`Lg|#o=3eqGB zL0E-u$Q`%17)xtj;(o&1D331@6(3&K9yq?tf|&DMq7>IRM&yl^azADE(G#@@*XOdx z$NLsSKDi1;!>wZa+!Ow?8FZn@$Sm36b>%!6H@9;bejub50r=c}eQyk&&pggzJp1i& z2MN{;WL10}#Sp69{>o~#(nW8+J{`lGYY{?VkCh=G{EdaMVkc1w77HQd3-$ub(eDvG z@(voi83pon5IAMk$FVw`0|X!EnkEcYSi)w)nkT;*6GG>)-01JH8)zonQCMTXpbg_*~z>C@lgksq*5Jqv85j`PI0mAjYE)4{JH@ zFI0q#)5ypoB4NS2gp}bwER`}PGNBNwS)k_Uagfv8J1%H`E#r*qSV`!~T^PsSXW?30 zU7&k03++32FNw^W2rq@`|0cEG|j~0Sr>LQ5spQRL(($uG*Zi>G(Lp6H;XX@eTrDvE0j}UxjeJxm*R6 z+1mT!WQ6Jvqur1#5d!1_bHbp_yWtQSJK@~@)@rR9e99QANH(;}ACkZI&a|IZd*E^? z=vfxscwhYfX!OV7EJ8)|#lBC13KV)b9ECD(u`@rWC-Oz z@_!UUSQlv zBt_)UeMeNeKIv)xetxnT6ihf9g@H82)P&dPNOx{p@gC4N!N?Qj9FRbKgm z)D)6IQl`mI|J&DgkOm|LLnm-d)}*jcu0ci(%nLv2hjU|sS<35sk6Bev-`v$}ajJ^(UFYx0+h zKitE{y;wn{EfM2`VsVv1i(;bUacNn8)g1Xl3vYfZYAR+HA5m&W@+FOzJ{_T&rL9F- zT!ZlHZ*zahDI_)5<=l$_$vWZ{lo;uvTtZ(2ck>moy3jbtk>44Q{09^(qm^+gOEtctTlozMmhR);EDNR^fF%6(nunT`A+e zvVJ~uhQW(#BfzzdOzz-pc=boy4I^{8VI%B%aVra!K|YHDaRDX+f}44Z5EW%8EUwa2 zbV4}7SFICa$Tzs(<6nj(t&Lf}>u;~Lc0e(Xq-!%ynb0P`q))FcH?zrd6o8P-+wZJa zIo!iy-*{&wk<0P$IN_L(OZN2XFXAS$7%X!mq#2T`*RS6TugQI?tWgS9zY;6w_9)Yy z>SUByVhPU@X|=B+VqLj8X^4xAHm5?)F%qs5;p2vlpTLB>2;tmP6g(V);X%&b-=7XQ z-=20%3={O@0bJ<74gC54_*SBTg>peD2wrByYa=W z|Lo+fpDn?uD~V=jaVUlK@kwBB`_4%EEHZ{Y-Yal?H|+Z3!-i!N7)?r1gg}{$AK%AiiC)Z)SlZC`OZpELPm++8J zB?AkpI>+a8FS97B#U}?LqC|{w-2bByer5gmSWI7Dqt}c3;6n8Z_%~}r6l2U)-sQ~e z_)%n~SQ9p=nun_>G*08H$x&nqKY8z`cXnE?%)k*gZ1m>WRtooCN3@#k$w0))pM_07_|e*^eYv1P zNyV}*T8U+2|KJNxAn0B{$g=w=nj2q-ee>tini?~}W)nZGIFoB?HcGc1rFizi$*_7m zLMAMN3(0J)A@`Cl)ux48EQMHsaXEE!X$?HeNy$bo6Dx}%5y;Z@x#8JIA&pslAt07a zAc#|Q=(+zTE-|AZaZ#~;(TpmfxLelr#mC2^I|y<>zQ?~ltOW`Mp&!4l#LjJ9e`k4k z8Go#Bw;?I@#|Gi~i3seP) zS8@@F6)YS(r#-ZdA7N#}DA_fYtogW*!-Q8p^YUYb5yUXQINz58(W+55!@7}4>EHc8 zpQ6lUEff7sh)amr(stk%;mt&kV*Qj8tjbm37BX-IspKj7a~3FIfnf3~@8C1$Bg=R_ zJc2b}PR96uJuo|exfEZX`$zejl*&BreS59kK^Vu+uB;+oL!$|Tha$_dy7@0No&*i; zpc6OpEU~q|K@je9`WIOz?lYf{v)b)&2lWaI00D$;I+ZLW*-REPmPA9!;!7cK3jxiQ z%^*W$1;H$^wGrx_#hpD(Xl(LO7;<3u5V5@lL2>KJb#n8fJlR3Ki&0J9`QGiF{lw?$ z$_6B)G8qXB&<+u<3K)g534tbQY(jOVVORG!SdrzP}!H$aS(fOS!%( z9sfHYt>@dcU^PVC7&~iRPZCH!U`ZlQVnVT`)4ee~RDfZ*pqc*_j;ckh$GQp4{V`k% zN%+EAR@z3BKz5T@8QVfgEVm<>MOiKrPRT3CKU@R>w)pQbafuV0hoav6`pWR|m;1ww z*QRwVY9!j;;%BmuQTiYNQnw`r&jLu#%0@y%xF;|1;**h3bEU4~`syK+?plbVMWtN& zDWJr`=Xsw+%lPN z>a=Gf3)>t)6xaP$!-ce+v22hoGGLI(*cah1((CvJ7fh)jA*!z6B@)KU68xtzcZr7+7M*@`f8LSsIU@9N5F8H_++R= z`F!!&OIaWdrVx!Wu&}4`tpv@liz;p;TADq~J+sI%s^FhdX)V*+c>nv`!`W^KU>M%& z^`(e#w0`5;ic7#hO0W}xk~ySn*qSk{Mj@?*NP&EWxyK=+C%OKHWY;56&H3=kch_o^ z_!%qLAq^R1Fv*>}w1&cWhJ*Z1e)!KH?9irJwAtNQpV-3oiRz*zSq)@DpCC{E=w^`6>uzX6+nq={IRl(w}GWfW! z(=1k$BMM2W+Hevf3W*ypM~Sy?1(svYEE?bN;NNR$wZyZ)7xz?%@{tlC*}6UZh&g$KzNH)Z)kk>khlcXx9A zeau?wIGiAZREx0KltgORge{7H^Nrkx1+B7VoOsG~D=4s__%vyCPCmdQh>`1Kb1j)L z-wW;exO&F%E*73}G!}VscslI=KCUHmtoxXZ3U?lb$F`58e)C!LZ@ociYm8CU@|AE0 zJrwHoGKur?+1s)HgD=L-8nS`&QMxbQ-_8AU{k+FK$hb`^na5h(g|Vw;h^{bw1}S-S z@Fc!B=G{EML{rpP0gJLgwbK~M{U5HC?0O9XaI56wb2^Nq=jAt!pUElY=b-rHy`S9K znNG(PFCT?L6EsqH_=jkH7USNx)^kyc5n>p^=mwZHO%j5!Ccoc*7Qz#G32pe*!fBuw z2LRKO8d97T1cCJ0@o8=vmm>~;k|T~qOY~8Mu3oU1#djT%Lo;d-C?ud9?E`pm(s5|)P&ZKNJ9?V;1?d=ryoGBBfh*>O zbwXq)R^k>VAXJ-3w(kWcvIvy$;wUaOKK(E*K{fCBr}`FR?VanGnUm4P3tU@dfb3o# zQ>y4&jE0ioQTTv;4UpwB3b`Pe_~n@Rcu^U|!(k9*u0k{i`Kq9sW0{^Itt5&;vgbk= zmapY+T*Kr~{>>XZiW0U-f&Rn5sM4uixI8rNnajlMjPh4qfBTL2HP#(h(3m?5j2Iqg zv5%riTd#xx$6uPX>{)Iz937su{Af@Hv7Uip`z^@iXYsbs5QHIE1R$Rd5iABP)QLl> zbQ@`!i2jUjK?D@lYmjs3+xxO9*d4H~nzpav%QNJVmx3I)h|NjayjFheM4Pgd%)0li`F+6w$^H3rC?8 zeaJ$6Liv{BGcfg+wc7~~b6rS5R?wu}EQC>XQ#3*1qg4DqvS|L^Ti2PXa08;QlOP&n zkOf63CqD=WU=aiZu2r(yofDyhko>F6Qm7}y@L^%pShUDZ^E-Z#rSoA@o=pXptjNse z3M?ptbZynW@{9bjZ*KF=__7R)6+j!l%miJRU}OSmyhRe45&{iAjPhJ5UY4r~k@FHyM^}2URv|M76*?KZ-9Rv? zH$J3L?MBQld?ak&jh~z-A=yDe`}%WJSvkI_-6we+`LKYv!b&D}97xlwz_M6FTeJfhEDq7&x7!dB zMRQ{f4ZEM5#=7E8@;O;OuBT$_5O=1O?a#*jrDoOe74f`! z0|-{JvwO&U+wlagV*QYV{2C1f#wnA8%z6|RYO!#NW6l)NUua;y3Sz=f2`~(vg4CDC z*>UqxmsO6xQXJ3PUz(_*pby zGIbdd;Bj09wrew^pI4*hd?uEC`y11ya9y93a3L(C8&r|IxQ&HG1jc+j?u0^GB)txp zu?!+*!JzFR>JD3q9myfGc!)VjC$rLqbg^76k2PQaiaL7~J@3)^!}n4;a-bMseKl5v z&_V)>W3cKQvwV({K>^6cO;~VIj{8WGokk&Qh>;f~V1x^~uC=&|&M2er#!68(A3(l* zCO@CyW^o1FvXGMe{Tq@(WpbaOkSgvQnj>D zs38YVlQed?X#Hy@#4ouq=x2d`Nk9-r*Gu=+#X?y>C39`ALvn@x5+>gH+FDWKFk>KS zp%Ots3r&vhg;%gDma8*ZbrD*)wy`3NO{4_ASiSLp_^aj+0xU6%zqcon&^5K@Tge__ zQ5FRk_iL&+_jvl-qb@-E3-X>DZ?E)sco8lDEiArVis~kV0lB(-R5nE|vVHqO0{sQD zjK274&=0vunw{ZX}XB=D<~?pswZ=!BeU zQ)6vVjB-hOSoEfnvp_T+XOI&wp^C7$6i7$epMH2$0ke8(WecF-)TqZ|WUNhNXTZ%= zGL9&QNP!EZu$_No2r;0ddmbp5y{@B5_@!JNcanR(^3C-sEm=b}@`HMijGi^-&tkb2 zMMNYuow#@OsMd{;8UwdgMaw#A)wB3e3>RqiF9^d0G&z(@zVb(FCGqpDTGh?r1-r3C z`C|R!&BJd;Yx8e@CF2=B{SSNfu{XaOqVaLUtyt+&w4HE3Euw)KbprVhcWARi77wW- zI1pTyl7Wg6EP{lE&&e`g5ik%)7%c4|=yda)m5#BfllR>E%1Zn7O~zQ|xLF-56Mqk9 z33=jW_-9s$T@#`#BBdoT%EiA*Rz3gdsBQ0z>qv&?L@JN7-0y7RATr4x#TUN zRa?^{U$V7Z+x?q=5V2*Ps<$0WWcl>Bvnn*Jm&6-6*wB6kNT=L9`PsjDW5N?~zsExR~yR##=4T8G}u|!ReGD^ZX z8w?aIbg_yzSr=bs(d4=9f2Yxk8P(Vb$92T1&bkq|^2J9l#_pb_8}VCN9LK@%(bsCE7$FJRbYctv(RvqhOA(AjABrZPOKW(>+g+Ty!KOF1!e6jI5bmI2A z8?nZCj@*kPuo7;8612A=NJL<5je8X32@&HOo_~JaXoawi)7CiFZk&|#GL|UbG@DtGqTzdz{Qi^7q+hL+wx>*utS7RVx3s4TR$r(yDs{^vJ$B$mMz4UHU{ zOt|sY<>ArKkD8+7c72&V!XZ@(iVOW9Dgr@PkP-`S7t2|!4r7KAtmE3N(+KjoyIHVU zojI=OuqP==NjBY307eQH)-=n-e>Xl zAM$~x^^@+SffJ#u8~FG*ix3irljNF<)5RdsTq72I0|Ktba`B7+5^F2Z8lY)Xjz;h;TOV1|fqu>v!_|pqnVbSSH{9C---B zl&BAnyM#j`0+lqCX0vE)kyR2jOQXT9C&#DB;t{IKn=cnfbgmYu+n=Lg5JqF7LXdNW z2#_H7ZnXokIi)J&4jjtqk1brZdCX%AUnmAeV~sEK9xjXT=B7+u98P1q9W5xa7P2)z zS%}gN!;@cSyf?$jV{t4Vyt4EOK?hYJf(QVa6q?{5uIV_OH625d1FIMIvFaXW1D2nM zp-=6+aoE&&1PyrzRaZCiTHtx()d(+NpjueVJ^F0>2jj2KPjb(&+l93;7r{NYxg?6S zkuaTm^u<7pVgJ){4qSurc})jZQ6^}t&_n*X21GfD!ry#rJ!6d!j<4$iNbiOtn3ViIbm4ZIDh-^|b`#W7KzW}2ZanpiZ@&GO zW_d(5i;?TAMM(E{_l`(qC5oL7iL+URxwPLt@6Z3s3$$oatZp=oWgu-usKmtYTwcxmagF#^ zXs33M*uBVNi$GKZr%|qU9&M~8Ts-S_uD?4TH%H--XRMzK!(YaHNw`H|dUbPUSkD?9 zJWA9NT^4T2KTt@6>ITnkna>D4LoVkE>^}=v6JA3pXf3Rh7hq&$4#gp>Mi9H2{k;8V zWPG?1BUz0sgML5wrw?{CGs?A(1&px)#NvWV3|TDOPT1d_)C&0ZR+(and?UW#Gwat$ zF6aui4ge8;fZld`NFvM&U#ck)R>{QSPWLo60zix~~BsEm84xDL%a??iVQJ4| zovkoNi76QQ`aSpQb0gv)eu4T7S6ZFY-gt9b+4+p$8w?nsu;0(X%kY(x=4Sr`k{Y+i&$VdpM`aElfs3Z47NFv`Qrfj}m1 z(#dA5ki{*;V!<_}6!Oi_MH%LUSc&f?wR(t#)^x-y^H7Ys7P)dw+#imjKLU!nmpp?c zjnuI*a)WvdEjXeZSKko3VS5ynYY;i)ZsAB#^t=vDxeh3e8}xfV2hrx@|1UzS&qB86 zR-@RoR9xSVncTz|L4nUt{-6Ef`5(qZ7*z1Yk&m$W{Lao*JA3PgW0e-bccep7hu;%w zSQObO%^la@UhV|DBRGOr%xIrLpiGJwT!##F49&6Uvre*NeR>64heAFLanh2N=|*2h zrp+}dqEO&g{xTlX%4QUTV4G0Md!=S6Zw15ZLO=& zb5FT}$O-aUn5Q4a&nIeNg_rsqBM%7V9?dNznsDv{*K>IkKOSST)5&L6gK&(+XJk6> zf9rZ(p9L)f1QBp4R&PNm9V3*jEjf)mu0nP>hh|n4vSOI#)KYxzD@>&1PktW(pN{z# z?pY3F^4^c{?tqr|l|}RT^0f!?9~pq%Fa)b&hp5mv7sApF`n<$1mK+VY2-LGlqF8nP zDvttAW66BcSuqWCQx^r}XIXGnC2_9bwZzD^|r!Nz;@oz*~ZLP5S1 zyatg#c4P0LSNr^VvB*GW50Yn$h~WB7`xAoJj8NG*BGme4ZJ^(sZ>&ZZ z`ONqJ;{Fbejelb?bvOCLUtcj}#ib4~Bv29vlh(b9PbeI*K&fOtQJ5s`lLB?kR^c*v$(td{ zBT=+^2La83=VymREiEl2oXVU+BrN#Sb*bU`Vf(G+2tMP8oD^Oxgzli0t#fZY2Imoe z3h5T}m#=QcEv~WM&q~(0kMuOTQIJfljK1tVbLVQI0Thr1wkVXTp=TD9VsMu?6Jdzo zaVThYddh&JVEKsoL1&g>&w&G}5OI}K>(Ij|;%cl7WtJ-_LMDPC6Nr60J8eC}IOg}_ zTP+9+swM|MOiq^%|Ev_s3LPw@*?<;yyLM(u@O+_NL*gKYw_sgsMGCje7n582Sj)ke$Zbxfr-?i+2PC#*xJa=KD{=Tq9)2(38Ql_%@u1 z`SAlT;QH%<;m^jhwtW7^oz;8~;f%&h)@;SqQIa0n@YvmWCE&{ucd);BXjPTie?saWlABJhNqv+$|W9r zb7OcI1svA0(2+S5pp1^gJBkZaS=3v&|NLawj7t{&Qf>`3k~<8JHQN{}uYw46cUNvn zVJI6n#)#~g;--8Vmi3(c`Tz9h4q+o}G{nKhvVMh&CeE++oWzl$^=E!L$KTKkzDzB+`&+%(^jDc}j8$6Cje{T_Sh70Z9VO%!3ux|5|x?Q{$p78WE3_pvP$swCUQF9_3 z(TALbM3L}n^R*DJkW9ko!sO~(56EYA`RXMUma^C;WLUI>OJu>t$*dk^oTuk;88Hy> zuMq_YfWm9nr_BaNEcMgm0!<`!9G9z+6%r~4O(KZ(TgYOf9{H4f$o14DAQq+Ia{LTU zH2ySli9DMk&w3-t-5t!wxj@T=aRne*;pXXYjx(Py=^%iMSp=3cX1-!MQ4S^Hh0Ks; zYm_K)g8ESu4F^rX#=2YDeH_S-;(%aUEuE^GSh$a3*3$AbzicNgSXA&)=jN}BuL_a( z5g@p=2nr(_I=cHP3!_;D>lRT+F6l39&tLus)ufg6+RNm%_4`YudiLwwG|Hq$QsPSl zaS${Vic#hk$TD~Lg-i-rc#6Ug!$Eq5gMLqG@F72A=qymtOJ4+-W&pNriNL@)zH}Z% z-F$UK+Y;VHU6i~eFJm`%i%(Xq+r-)tWbW$tiM}9MGJRj9I@y5v)%|-Cl`Uh0?q$@XGi$F3yS}Sw`VU!7kV<9XGG3`@4;^!I> zKp>xW@w;fhByk@VFIY%t}-t)f6xE7;^CcX$uo+04ghaa%u zo-9Ip16L|a^&~RH|HCDJpEvnu`QRxDNmDwOec%0+haNTcdMP5ud?^iQ!#tS zAB*C1As>d_sw6)f_d)oqJIg;7i?-(4=Xh1!lbeTSP>^3n04&~OI1|_6`byjGX|cWL zcaYcPVW4ui@`og{>bl2pCL9KFh7vZB%0X0)8Nb{PrG_+!YVfD>ITG{~Z{V2WS?Kxb2w@ky*fjLvUL>23u@Ko67iJJmhJ%I;K(ql_w>w*SeO zd?9|Z2Qw_ks=^mm@?NBL?lJ<5l5sl-Q7dIZkF#8Z);kZUb?+#ZD2Ds+JBo~1>vxd5 zXp=<<8SwxCg65_}OFsSi>4XNbZDG|*2y&%e7Ah@&t;<6K3ByH@uf0_tgxYD zu5T`j4z&*X(lClUn5%_zfP?}K_RJ!Yr}=a7dtjXP21&T3cK0~oDV7iEC@Y9pi%>tX z(Cv7RGP<@fuulSsEF4GY%wrK)T|nN8Fe1k`c}Vayc@_n3MK%91rjzF}vaFfKjowtI zuEikicU%tHQ=fn=NVNV#8%Q8HS8{eRA{C9FeD#~RnhM^|pg~qcs=V2R^pFv({p_}I z6Bvbn0Ak&SNgxm52?DTS*U&ql*wII%1oBKAGnGKH3%J*gupj_deEY49CN&7)&R16} zEXUJ0KVKeO-eDRaF2dlqCke-|xcVq9O zz6U5eU5$(4^MfMX=@5h~H;K%+CW|4=E!+PR?HnKH)Rg+_Tw7+4izQE7LY<;V=q0R# z&^{B@>KwQfZl?_)F&@{(`XML8Fb5IRq8YI^XNU0Lo8TN zf&1E31lssJq0#hK+{ULttq32y9z2YYBOG}J1V{ayl{>;kd=8liTz1a97ANt`Q6iSH z7&n9fDjHrdAO$X=o z)0ffH{H)ch?k`b-Tnog7UamuKvWivUha<{0ffRBJ5zWPA8oDaPmyPFvchsK#cD z#_!nz@(&0km*F!yp&|V9-yRQ>pZu4v?MTTY2z;4LoF{V1>w_FtwjBufZ(5_-kl^!U zAy7=~W}r!SkCy8Bcc#EX7S-3`!w4^A5lOMN8ma23;=&!3!dT{I2E^ytEZGez(OP>9 zgq_DPX?)z&7o#$EQQ{_$yz%j?m+_ss?w3S%ws26ch9a=fE3c zhP6J6)?;wO8=wHA6Pf^CK%u`;X52_}&1Wy897j*0R2e4&VR(p~M3HDf3!K9!G@tf# z(V$;>)^S{2)`2_WHaos>7zpktUl9R|*USTbagJPenEdg-d2L6T5QGU6K%pEwi%>!1 zb1j~8Y(SiRKOu{QExwD?b;NYRr8t{FHC2kQ`7=qGHZdf;ktS|7O1Dn55wSEGklK!z zjf5z19W0_f`4OZflPD#hjH?-Q{dkCw&BP>^+~<7$qGYgzkti2}CX*(2AWY+Ky3sPi zcNo*S*Ux4Z3Yp)<`Yqn!=OeliCZQVJ#WBPf6+jXUQXp+Qs3p%l!>QRwIF9>}-rL!4I%j zU8+}UMhbBK>njc6uId2Y^pORmY0GO|#MsX!-;bE+HFP2g0!3Kbtu#0i9>TW$Ru(>r zR>haMGw9A3AZGkSerx+w$7pyxwr`3 zx=7(=7Wg!1WIiCD(o+CvsKia7yw*@E}* zs_<>yG8UhyzAaXkZ?I>dz+@BU@+Ci7gvxj>v~q`Icxs0%nt32axCkXMPLL`|vbwbz z(wKXMn?NcRLSGg{_iqy>Sy@q#q7%|6+_cb?XIM=16ZwegEtLI-s)YCsce!?LJarwH zl8@jfrGYJA{c#j5S4c>j`^kk=8OP|V;V-m|9OolYiiiX4#TAk#s9)WVf6qdDNVW(E z3OxB>mUYVb;#OocML#yo>gUjS1GzrpA(kG~TOuP5wtppsT8R=4&_pfAvAu~q}~@(dyqjCc|SFj2xI zP(;&_>iP%>`zU@}qw3OX<`B2lhSJQ9;4#uJQrw3~WGOl zAX-8()=W8^xDJh8JPOx{;pmJ4@onJ_8cE>nMsdXFEY;6)63q`p**s6tT;?v8^Eczz z%(|XM)*%h5wLKy)*K0(P|LjEem|7c8$${)`Q|Cg|N<>1laE-|i{)-1YtVn6s-gA~= z^F=;W3t^pnr{+urB1*vW8ydwovrI$>v=vIPK8IuoO+pwJqxsDoD!xQ{3Xh0lgdh=w zsIa8zHEmXqV?+{dTp*YKJj;DRZSRxC+|8oi`08}ndm1YU>`MTFS?HjC!Q!vr9h5td zh!vYF(gi6*7YniSrPWM9uVSo}Fu69Ux739J`59}-soaGK1#fUj^0a zjRfiGU~=t!q+0~jz5n3|EJzv>@oD8RpKAwCth6j1_lbaYo-76K`fS}W|HZ&2_RE!E z@!iXxMY3?8{>^@`1vw;T7Pc~(NWfu6LM8}BD4WkO=BJroP<#nG~>i46lgGWmeY+e6hG($%C~N>G=m75 zwZm7zSbr3R`_Vl-ZWRw&#F!`s<(-5Rn1ho~?OZ0uE2JWuCg8w*WMpi50LmY@K zH&ArtTw);A*%b=J+2~;mpNf@pfp%A2e``!WDOfRR>qCLd;m&f+gf=2IwU)`B{o6Np zJd8<50=mm2GY}_w-uwD`%fd_ThZ{Rm2~*4~vBK}U`R%Vwiy#e|vbeP{MV0s`Zh#eK zq_s{9>5Fn8LhzCmtUnmLUN57a3u|MRjNt1d1Ib7szF`r#6MuBs*tf^Z_%?+e3nvO_ zIGeu>{ccum+jhIWiZ5=jlkF*hO@wFenK1}5qe$0Oa)vC&0b zqoZx-a?#~4Pa(0PMy{Y}If&Hq`srC8k|hMBoQ&1I%pYoUQO0C$lb`+fukT=mhy#nj zkW1t&Oa^N~eX&qNZ}-Vzu0S6n1EdFmd-TgFN+1abP&A?XGGbb*`F;1G7_wzbnZhI7 zfq>-R3z=~xFTaR%b9s!l$*8|?Zl zz5?XBZE(4k%qFfQ~5b)5X@FJIlU0Yp|#oR0^{T7gQw zLj~m4yI!Mt@U#`xd#gqW$5xH46dZnMHb7on!2S} zQ7GNf#w{Z#t4LX;qWOAf`f5U1$nUvP;hEe31x6|%vaignN~~D~s&WTcdl)G;q(DG@ zQQ$beD!b~b`~ZYT3KQ#9xXv{^kn#C%PpZ)7F_x`k z`H9I@`M^3w*093=gJ*=1muG

zeLErg#qn87{&VA|En^GNP$&1j)Q9h=doEMwpRy za)Uk=+mFdZ=CB|RTaIijZ z%|5O*H1vx_a503BJn@YlHOD`D54S;J2&(k2e-lhDTQ_rlcG^s4hS4mYvB-BwYx`0| zuRqOa5hr1txj;FPjvH}pkj|XU%^abDPGY~WV#l&yetg>b>0_kOP(w`ay&ZejLN229 z|17k**zn5eJVr)D#F(Iuwey`3Fo3$GC>U>KTS$n450xkrtmlyy7Nlm&be?nDV?4}G2tDW_1*O(+t? zqWl^;t``3)GU$ovk%xQ*)K>8EG!)t`0YjMW*BTM6$)Hj|(H%hz`-PzhQl z-Yir!i8aa68HMl*u_I_`0fs#v01cT6`a_lDR2>Y3SfzeI6q0K0fY(BY5@%NavD;pKZ#JC{j>! z=n@uRGM0rBhV>wfe1?m(0}1?-3HS!_cfYaLFw|TcW#w6I8espU`;lT^6@1@qPFksuDVuE#+tGehR)9M|1 z15_Q|%X|6S%fPUEmP6$ao79%=S@k%tFIa>Y{nid0vddLU}Iq)l=+RwA5e+$;=;mh-q#4GWg@7o#p9Upz!)_ zv2`Ok5~dME(A_*mcM?fliyFk_$N%Eh9r5V$bR~;9X4K@4u}+B)3+RCfJ;3?p>G1UT zA&UrNV9yzXji)1c`5k`Q-a-O{3tSC(CKbnE@i02G~=?y3k_| zqD>Z={L#~k;r82`Av&3CltLUFFH)8)kpc-QmkIXxmnb2{v>^gPQxrh}J2ncIh4)N> zz2A+bj5V%A2?@$m!;rvky;ji4Vz8+0_Q`$rJ_*$4y>bR}6H3q!4L9W%n&6H-`QnV08Rg>#ozpWoaw^L9zZb(=OX<0XAkwRwWQpF5!tZT&0M9Ic9IXI6J zJc-MVOq!mD{*fu!^&G^w3(7%WMe1-D1tI;7lb`&n*LJ#}Elhtc#0MPNFiNZWUI~xZ zmSd4uiJNAZVr8@lEQ2!=Q>yoK$NEb))X4@h)mTGP%^ zI&RCDDUKFvNQ5Im%U3|xysi;yf*n=vxRm0KZw_g0#M zbtpzVe8RJIT3y2PC>TPG3>&{t4dLw~W)3o;%|8TX8XiXxgzOHMq_|EX;q&zpLdwO= z2Rbka903ya1h$|SL*Y`i0IqJwP~Q9DctXg_kFt2HVtx;Yj@9L_j#&h%2Rr10?Qe^q z__Eo@ZBkW4w+vXsd+ zaS=`C`#d99GXwaO@eD54^4I(+s|7Por0khI zLKX`Vp1)Yg!sq%?`rrS5dqqlw&Gjg4IYGun39Xa4cc*q<_ZJEwoAxI5!BsKXhIgPo zf7%!m1*Y~Vre|^ zMWgvSg9hvT;v|sNP%?u6KO14yCXShdC7C>#DKH0Sxf=@C*j`UUEZR11T%w7e+-ih9 zdGXO-N@?n0giiclwLU&nrH$~6!xkDBnhHmXKb5lKSCBiei#WZ|n7Z4^`^5(sI( z|JeQ>CC}IiA5Vfp!Z}98z-o+8t=2v%K_^Rw2cZ@d39)v20dXSkgR894WM1+$3VEWE zd8CJco`1gEWRN}g$V@j`VEZ9Lpsdgxi`HR7V78D6^E|bx%^^`3VGATs@NlzcpCWJz zp=?S!S(&G7B0LX%uogx?H$488g43jX=lL`FgBx$Hl+EG^$d3v0iLI@Nnah}MM0xm3 z(B2S-E69J{ag#p?nzS>&PdLUTW+niBP`{o=O<^ANk$^F0T*T*2WAPS2ZGj&)7LTP9 zKSP`*fTA3#cesQ5NC{JpXCKQ!82@;nHn_(%Yz;?{kx|VY%Fxo|7EU|5p;SOnR! zM*J}CLe`%Ac23B1Z&p~YdktU9iBue z;_b~4A8`5Nqf9gcbDqA}DWZ^6L4-x&4sGPf>gh9-0{-+r?$^)SrY#h8&xil{Fzduz z##p+ph~-9+L?VcnWEZ#dSlV;pR$ZRhvW#dOqif0V?L>oKu$K?4xW5jk@ zgn0fiu7WjaE92uG5G{`8pSg<`a&jLBU^Q8lADvR(gDnOwy9lxH2#<+(t*nl0F~-^NJty2P9ixDidp zX#U14ngC5)h^7_f)J9wpf>X{IC<73swaaKSDH`J}q9KN2dz?JXJoqv=m!xSX*uClp zBayP8joC9`8w@;djkROUtqNwbgn=wy*jK0`&sZVIY??9)2@c&v3RaS)Pwte6$mb=S zppKGmkCw?~Up$OZo;rgsnjRL!XH!suqBtzigqsX;k64!l2oU$)O3W4???9qJJ`^y% z*M7Xw`G7&xRG*?0>EdP-^o_9{{Ps7eMHl>L;WGX=f+rV#-}w1ZbM{`x?F-8^xFU`A zKG^r~nM4psdYDTwFTDm5LmspL_=Cf`4Ud>tZkNcRz=#{AF=Y%s-|F79>``C~3?aKC zI`^!iB;0LLENdu7A*B5D=ljhg*t!lmpk&L>YBxbviaq)1U%$SCJb@kq^@r7h2t;_g!t_VEh>!a6ck%e+F6*4D_hxmX! zuxa4@*Ygif+UiAvC7(bc#iUSN24>8E6Oca`F5mX-lX0t=44BBmuedr^0NE@q3jxKf z4vcbhb|AHZA{M;76nC~B1PPRC0MVBKi4?jJGx>S70sdG>D|KvdU&FT$FZ@8q4+B#~ z(;uni++0CWYPzNaDXX}krZO&&v9zR)@5DICnqu^DiOdxzP-k#95hRceH3tba?uXJh zG6_j14{|zF=FVpuVHMG$xVazYo&3?C-QQuAd>mh70h`cx6m8Bz*etU5>3B#4zg-p` zEwZT-60|wUY$RU7Uy@A!jW$jM1x542>H2r zhgdcN7CxhVBo8U-^RfUMQYDp|^Uft`GZzEejYSqs_R+pM?nv#z=VUpBe6HO+d|5oq z8(Og>teK@slI;EdG%P>l?<`6x!4>OTm`~^#pKnncd&fmH0CH*eE~J)=!k5JD6piaa zlzSjW#<_A!fyU$9S7Q{3emK@(a_CUD3rMV=CqcK2k^l~fC$CEvChMgDO${DAzpUe9?iyVltUU#qKTVWLug`HWeEZ#Z)*II0 zFo>bDuGF=>1?8kX3T%&meK=ktGKU(TZD_H(38%n0CT%FcsKGpmO0kMtWqj`GbhA(X z@BPjT>Uxl;+=lS@`s>qj2gm17@Qv%s;Y1z|HkPa>-~Q< z(H{9WhA!Y%%zQKGB2qEf<+ZVqQ6F71iHQu#=wHa(jfE;t`CUNt{02Xx1}xXv1y1HODo{n}-s z$?^JE$4(fFDANQv)DJzhbA3j*#)Vp%;q@U$Q9J`t$gB4}W&gn_mfG%QgI4jzHc*$fcja#q=o5^4gdn0^MOE z@$b(+9EEQjPu`z(p)vI*zZxG#flLt=1){KgG0RjJ@fisri>cp$qB*F-{4nn;VLwgi zE4lSD?nKds0$}tOiHx{kgq7SVk<&rl$69zVZYCF#J6G2HI?E;}*C>&WLN=+Cu|Uu3 zK?@NZ$`>1mIG6jV#%6(}gFU^&LzxgU#EpW;o!kGfk->Yp7;*ke z+=O#@#Q$>V;8wx|DeF$9Xt)JwA}UIy?ryG6K%96hXXCdv6uy4Ras?5K!vP#z2$XVQh%^HkzR1@+w_1O5A(dhjMJIoktvbKfzND#anVaQrx@K;sF z#W1A95UU<@l0`>mnhbj46pYa#9P;ES`@8S1)%Pm*){n+DfO-E$l*IRH_CDjGQ^G`+ z+$bXVYA@ag$F(ld?%)iO1m6vX6r${Jbn1!CE?aNP(q)YK_r-3))9Hu`l4BH8(aGE; zVQ?C*OyO%9gAvM6Vlv`#JQRBxPEz>JI#5bnicz|^2nCN|@p=pKi_u-?wcN|K&V!ba zV&n-K%hR~xD58jC?s93E--ye7a^5Pguzy}JfQi$RhHB9;mdxsfULe_MGR^tETc$Z zm_N5^!?>NG)&nns9%N&mgV??`gZOxJH0~-)WKG$-7L+6MQLeX6cnE&+>3=wA?FOe1 zadliFm_^3ZG4imV;WVLaYY{QF2j5?B4Po-FpWNNCxNb0eJhDdu!ru8V@jnhAWqTvB zCb*xAwu55X!Hrwv$y}`!WWo8qpwJlZL@-{1%aj3BE;)NI@KgoKU&x~I!fsql-tRyx z%MnhATQ6q(>MYlaf+nujoB=k$qWZ$4U(Z@4G*13r=BuGu6pqUZrZlv?`I=orWBni5 zq736hl(I1SJ-GE6WjTBpo|1oiuZ3xSA>%@pLA0lVN?ggpaTAn!>+UoH4%f({d0m$e zbWu7d-xt42$Q-gp7I@U-4`)rD4Mz$0GS`NSF+R|Z6hm7PP(#zeyNxhVBkNk%#+5-0 zy@H}D+=J^?#k~KW^?r{kR}no;-7^uhItlN?J>+;Yp~;W_@oPKv^|7KJxDX-oBbYwT z1K$>srdf=~A!Q(5tdBIw(qX7H(>{UL<@4VBzo>znXntseXeMD#oH&%wxDxJ08#T*y z&8rZIwfD)L;T{X}Mp!t3>wo1+`8Aw;2M^42yy^C<2uV=`ysZE8Jo(Okl$6yYGD^)bf% zkkrMDLH>ea;S(*X=P#wVmYx=7&YDxWGD)JzkN?T5J5sCNF`9`t{~j3UJH^oQ1E2*P ze)7>_3nhHE6?Os@mq2iG@|qj8Z_7}ze4(E&TcmUe=hscDAcSq2%mTL2A=h_UB3E)0 zExq}*_*d!OK%;G6lMC6cFx}0?LRq_9B5Y%zuw0AnUi_wffm{J$u{tM_D2|9Eu02?d z0At1R`xriW-o7`ILkp=cA+chCD0@q(kRyu^n&mUxSD1;NTO2|J_mouHc>XxbmisxE z7%K6{NO4_gTnNj?ZS0P=aH1-0+S-c~)-(3b=Z8=K<6b8(yVtY#Hl>9x$If4Gkyc$B3nS3Rds${wukcDxH2ripQ%J}r zlL&1b%J}HF2W=-Sv(D?je5(n}Ze`rS;%82{)W-P;k4Y(5AaMLYRRex|W% z{7L)fO)878;9y|<5A)Nq&DVl-3n8omTL!~lwv?Nn`F=uIdcp9)m>xjr(Z-W}T&Ons z@Ui1nUO}uaUmyX+5(!R1!xLI*J<^DrsT)`f7U2DSs4rz`!aNNMuuv7VhNSr&zf57c zk6K1Pf-GY2_=r@gRBj(+mH9v_2T{F91YnH9Ns$H~!Y%nc=qLOhR-J{BUn%d&!e|zu zOe|8aL5)Fd&uy$<(;JYeCO%xIHCHUxfJD;PnL^2;11+FhWfNJoMJ>M<+T|_d^~p3y z<~kI-aD1_J^^W~>-g?7|N>qP({(tbO| z4#>j_2uKM~d&bxst9R7z-V%a*cWoUnYx!W?Q%A zMC1w}t$5!PO%}RvPHR#8sUbd>wiVZBJ;J+$$W7$rcS7f;-6Lc2s{$mfWXy!1oGjvz z0hPXf`YW47GOv&#$T9iBKfAw!{DG{NV!ylqcFCfIX|%tKO_MV~e%Yen3C&jVc_BIa z&yheAM}XY4$DCzBl|>0la->JVYkxY(#1hL|EDAzHRkrxvn{P(~(G**xZQigDDt*+3 z!rpv$8fy(g1m+MhsHEA!_O^@tSZFM}50r>&@%zG~+(cehz7_A!Clr11;nAqvu^N$$ zY@9DO4oU-|D0}apFTVx(AX(1c`-P1XQA*_w%A&X%SzJ}P`f`gL`ErBKW#*>FWX)($ zdI-8HHHzUndNbU|IzS}nC0k_I#ew83pn?0}3SUwe(F%u)so1*K)8CETi3qimvNh0R#y%b^Ufe0Oa;_ARhq=m}2A()B6SflFG47>SFe zI^_{qkQ>YH@p&wik8aMK!15WBH*rkegO8oQNy8}_K`m&i%r%5w_ug9{AHo!ig-o}; zy4rR$T!RI)?hqK9H{K|ZnDVR_)v=FzRkTKZP zzel35bIBWo_6i}8WAMDP>0F^)6O;y0Aq-#MvU!N8{E5=5&xtOeBI6*#wVUA}XVTRP zdAYyiF)D(>TH}Sph&SaV&xXGl&lnj*rco;QZ@8OlD}S#>0p$}UdVF>%i%x0yyxreL zaU`emN7c5?uiT~M*xgw2g^(13Xr7LohCKNT0(Hk+9?TD){kwybFy%!lREuoT{E=9+ z9Xc6sH!uWESgFOL5L&#vzbM19;wt1FkU_b8ewA;+4Y(kJb!KnbZ3IC{)c|h2xAJ8l zp70C8B+`iTxptE{`3u2bJoHSRj6+-6f^p=UflrHtnQQstE>zmM4v8ZfKLm<@!~viU zE0-(ad%2AsO%u7YH05pvgs^f&Qq~$UEY|w0Mda~ZiTID!JIO`LmB-5YnO3dwTg%xpC< zObI|z{e7;dZJEWMMCN>s5E8}jiT6FEc|*^?e*N{OSlgFSX#wse=Eh5MJvjwd zPwBq+H9m_hTKMOmjUB*!z;txMYrRhdgRQeTmIpHTZE*1Q!QD}u&=4ARrw`@Me8uV* z_-WoVmk&9Glbgf3Te^*ayE8gU+=ke|?JO`Yf{>_bRh3d^9EV?MeV+{1zLF^B%apj# zle|=7+s;Nr87oT%_xzS{9V%_!n>Isw?TvAR$$FG_JfCQc7W6&@K-#(E&C0r9uDgO0WBa8;1T3Behw>~fqP={jcvf))jHnh`h?T%L*e9^XFzhBRVnsCC zz+~VEUq(+D<@X?xzmipR;F0%1pSq$fme105+(6h;-+DWfXzZQO$$DkBv-nZ)%xbH6 z5v=tUwa6i~Q#aRQ{Z>FZm{LhqJD*1cghv7s@~>jBD~8+%SWHXriUOl=0XE6F!$Pm0{0ce>3DF z!q@Z0$9pr2e)j&!a4WvmM3s!6|6w+K@_+4@{DBi&uMNn71)u$=gR*Gv#kj%n<=Mz^ zHI!IH2R^h#E5E;XZ>7Se5n^xt4`Gv$lesEe%@?RcOj!vDv!@j$^xv3QlnN!%QHT5P+aF6BiMLgGku z$D)cECC|7r7era<8o{K@jgGzy7a@;+0t6VUgL!LP*OobPrAp{6`3FJe1}1O4cXJ0E z&{&T*10h+RYL5hiXWXy?7KIu2oSg{DQ!Dij@_kyjkhgZmoaVw2GDzloSS*rB1C?=E zNC}-qj8E(K@+h3djpqVL7t4Iib^6{SaTb>Jil*I@+i~?Wv?IEhVi6|JEK?P&u;~mE3yXPl)Ew9!P zs_fp9^>S@tCKv2I2rym;%_**RW%*E1${PYh^~s<9+t<5294Tt}Cp&k52pO29#?r{R zvnb6dg|*7>3*qLcv3fmy&cDwB+e5doz&|>=6=?~yW`N+-7r|`A(kRAu!a(5^6w%A> zp^cu%0hYOdqCqCi7e^)|JZF4mxXUZ?f9GQ*EipI0DgMPbkUtZL8rZWi3*yvDv#d=HPv{zqMUD)`C1q1uL}ZITZJEO?EqRl|6_eb3Q(d;zrQ8kVPQS5_gsP~ z;&zacD^v7QpK*P@9unYKxDqbn&~ND2{=>*aR5SVZKf1Sr<%5}qA+dNCP~WeZ5@>$< zo1?<9R_BIpnX$zKk+iR5j%FUkubmzZ+xMqgpeR!mt3`~EsrJF;vy*5yp<4v^u@SXI zF9W^#=31SEGTkoIEepqlwaQ;vgm zDueqYvD7E7oi7h7w}zIk)d7$(2{5dmGFnhk3&IKB7Zc@>lTxn-MTxGsfid(R`3Z%U zAk(yJaq$#zU)g#*T~L-WJ7+*np~vm!9?%i*nSB4By|SZ(IEGKL+GwUthzNoOcB+SM zU^-ZYWbvSb$EZ8pQ5VaDA8s@P*t)e*IGgR+ln@vVd|R;dXnzS_)0?rPwU8W4HeaoZ zv6>773}f#~$ad@6E~T=jQb|)4XGXt>=w-n&cco!O?Bua)B>Ko_Ep+$&WdRAJn=o@b z3Mh=i4e%b@(_LSK#w$+pNc7{dXYK}@cb>1$>$kIzWFxHNCKi_yg~SLbmL!+lffRb9 zlgtZSH@*_xC_ndl_j{{xV^B8Adu@I2G_|_h7?_&A=!VOa$561j_Rdo0Q6hUh_7>`; zME-=Le#Z?^K5gMGEk`lD4y{FJc3X2Nq7BMne0!hd8Zkh|WuN8b`+xCZ$2l@!ln>hv ze1l|GVWGtS;(QMrV*Txe-OivNg|sBTrp+b+`uoI?)l4cpK)6U_mjY=X$%Z31S;X~N zvyLN{1{!JkL0)$N)Op@#r;&!wxmMP)P!c?u==Hak;zk0iSaP7z2_L?0yty8JaQyd$ zCE=8ZPb)}SKq!V6SbW^VS08WlQ9{Rz!Q3sZ97m6ubJ=`mRQ4=DzWP1Z)@^EAL4}M9 z58!4HV({xees=T>xb|1`rhJLRC@zj-5NP??!Z4d14a-Z5b%9PpRkVVP(zudCln5!+ z%4RY7a>y$h(SFY5S!{}YD+`Sys62965_EDb5E8=RB^pB!X=6elDI6r6eE*-^-|@^G zS)rzb0}&5@e%SBYt*~9EhG^^%4TynRRJ%$eY4&raoKKbvs(wkJa79N?^5T3*XoN54 z-Cp@vliCEv?nB*kACd&6WcK6(Eb3M)3)?m)Are9+wDNpm^P&uhWcv@Ih$XcVIz-?i zj*cSC2;9C3^20+MCSjc1gV(TrB=TgJYlQ;tf6_iZT!-5b2{5i!{c^p9C#P6^C(M)3xylCm+w52FM_4vjvcldk*VWq~(IT4R zLd?y+Iu=BMDK=p?lF3*bFGql&AK~)d(KqT73PweLCtP~}(Z$h*K#dP_YgDhlpbL>kDij*iT4n4 zk~jgXk{$!2Js3IWPwNec-{T7r6)~@JrW|_Dy;&2QMCf^+JUGjx*+|@a2GV_g@!24q zuVq!PN7-(DWitdQ%vw|t1q=GM&7AKdaFELyxEu;2yCsE;r(olH6-6l)+0Tx6&reQLR4<8^@PaZeOpmXWP<#Wqiall@R#>@uD!n01C%gEnl7{f z-!_XN3PP|J6rx)Ex&ebw8xJT#`}iX)LS{Zz zI(wMwWn>G>P7WPw^+K-lh%o%D&FD%Z5J=E4C$HP&2%%)h6ma-8ei|IA1t31N-7yb9 z(J8H`lp2S*7Wug4AQ_jj5TeF!YAz)#2-Q~d2oLJy9htA~a2LHc_aHjpE~J_*q(uPj zn17Qnkw>?tXPoY#d8T{$b6*5p#G+w^%+y}E7KtCE6~ZF74byY2Hkw2kxeZ^8QPPU5 zx?=v0qtR;Sk-EO{9(yKmCrBx3GNu-|zWHZ&cUokK_JC!Z4(wx>G~g?r{AN~iXb^S` z(`tg0`|dOQW331ZL9!M~MBBg(-^ee^IvMc%Sr#r(%)f^Mv~}8};s|+dJNHPwn-vC*pIF$EsR%FF#f8hdY?luDW9xjtvq8{*!YsK#7|0M3EdehPQpzy0$D!Xf?{a6wG&C` zPL{@^Z$jQ-^8L5~g5Y15SH^)F%v{Kz4TUa%NFhB65(HwBAoI09-l*@q{jF(ltemW% zAu&ODTEEWd!6f1ay7^+RU^8yVgeVZrb#2_BJqNLL+<+3yB$#26s zf)2Yuk!xYKaujOr7Wm$~>rK)SBwy|!WIiX?AeZ3$KuM{#V#hKq9xi}*1D__woa zG@sazC(sHV2w7q#_Zp#F8a9)g)9Dk1bG{yumt`JHy%lmM2riG1$XK5IK{WnlG#CVf zURf_kqJVy}KP8ad*pKpnZ;&d~l)&miN)aY_-u=Uv%kbA-$7c~n@iI3#1M#zTw!{sR zch#CD8z~KZc`$Mt2m{fu?H>P%u+g*mJyWa-`PJ;5DTkW)C~4&uRJ9|P=q@+ zO0qP5r`8?iL5}z}Db;q?6v~Njgz+-jscl#ZD`R06fRI6_Md5=@)-~{uCNCl=4_<&o z+wsRQ&q!Dj|&W78H~qC>R$61t`2Y-h!)ha0x;;i4&X!DOGK}ybMIHj2T4o zKwh!!R?>_y<8q(#z%{gUKiR+WXxF&AprHJP`*9iaEf9zNC^LB=*2pvC5hCv`1g!O?_Ey#D>|aEi0Y&F53AtjMZP{S$tA4ruBumm zy56wElfRySvR_3wcz)a+Fiy%q)`Wt0zO~v!f|EOXdPf#Qt-wVIvt2BCGk9uoDMFKR zG7(HyM~%nAS_BXeqTKiGKiM90>QN@-3alCABnV`imfV5U$s~7>Dq8Pp*a#;Mfml8G z-g<@XE7yb%P7@L5fx zqaYDQaK;Z(rtiSmm9r&+xH$(ld$8oiS0)K@yYH>FsHMA^932+nyaT^) zJ?7rM?VYiP9e9o8By8l(pM5aym)m;NS-}ZSA~=GjU78myY<*SyU$=0zJ1B#Rzveb5 zLkAW3#o!?WQlt5Ck88<$Ee5zUd0c^&s2^x#M65t+Pc6-RkyC747qGC01!@$ffE3a1 zXmlGfUY|Bv!Px!m7&r}_3sKY(yf>#MweIb!sa7s8E(F;#Z|>~LZ;rYz@bmw8SY!gD zEEnt>lX)4t{yp7OeDRHU64z%eU|firH7^RXS`g0ioRlKH-aUR%N$KMEE3N0dcJA^FP?TL)6f9_qiut%RTW zjwi29e)g|l-)S5h(sz~*xe@=T^*ZQZ_+7ak#ds1;4`fR*+B6~k=yPxW$yNu`Y+kIs zUl{;|0M+%E@%=Qn&4}^oiZJd&L;1Wb?MJ>q4k-=K=y^L?bPL6; z=pSfAn7Q-`=}~Z{aIO-ghcZvzKN_yT76r`wOY~y3{P6v6Zf4FGKPnrvAQEs9pLO6Y))R~Fa z$3-AnaL)wf55Ww9vSP6|*nXBUXe*Q7`+c-mF2I7v;uSZb0qZcp^;g45_7Yk~*fh2o zHP9QVwi(rFT6=K^w0Qf@N}~#;XAmiSX#p)NL2cdH81|me;=d!TD6+lyMVz1m1s7{0 zqAMF4$d6Mr%HuT;*|xdHqTKsVu9YiY%*LFFRpd-)v;p>*Q&B@=EthB zVZU2l578QOos7e0R`NUb0%Md0#;$L_y;hVUOg(R&4Se3Gk&o<}FrS2(D`X*~BcU33 zi)7JZtX-#$o`>bl(S@;a51n?tuEn;h1gOa3fM*7S&|X^Hm5pIzdo6}^)?R~J-Qx^C zXg52|&przoFP%>qG!3e>J1FDy$X9daHWnvQ*eEcPiTL6XMH;XerBjV%<(n}Q$)G#m z35ow*!s?7ql!Z)-_bI=^(PgX(C&PipQ_4e*6Rk{s@>j3zOtKO}jg@UO4;P3wict+7 zA%n&1w_{P^2zSB_SgXgK8O#--5Y7-{7cE-qKq*hOVBrSTr*GypS+SDGOq!CMWfBIa zfMj>8yG6Q8R13Gz5^HDuO(Q36UW!}V zxGi>$??29BUK__bIS;I2=urw>K!`dGUqH&X?!{+Dk?|rh9W|_bXs<)=Wic*-CVW3) ztI1XUV0mFgMV(Emcc7cXBadD1L=0S%Slso%P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L8!|~mK~#8N#hpvC zB*$?@t3QCG31CJpM;p)6n+zl`i^)W+tD{oYudbe)5 zM@H6biU;)02oLw`9+_F+_nQ6YtFONL^ybZ*%MqVGeY$v@=0~LNY7TMa=kW-ylUf4b zN2@@;=7z~b7%cdRf|4E9?z0J z9L;B_hgm-}?OFedt8~f#?z`_UZ&Qpw`LT-5Ur}kgIq9b-w~rq`4r9IodR4s@6!-S+ z+nZ_bKIWKM?ay;MT)Q$zU(N-6$@i89R~k)RwBi}f3K~wm&!s;jPoU57b*#iV8P6PF zHGalG=kM)4exN()Nhc1jbEG9Qo}8SEuBNEge9qYQl3D%=iYJG$o5(#0U(X|uN9@eN z$1rXH#ITB7&mxHX*mKC^=wuu*d33yvVD7#uPY{#qnqxk9vQ8Cq2G>gP6XS8z#d008 zw~Tvu2B<_t`ct@~)0*K8=5Yo3^8U!rwba!dTV)ojI#oX_9QBZWdaVj#GiKZXh!N!T z$`2Hs74I~d3-_&<$ht>w3^Sf1dcySubN6*RE6if4k@e1!HIB62eEs#;pMLbCA6+LF z?Bm?*%BHJ)`7lxGWZp_G$MYT6nbjAahNIk!(|p$NtZr(hexC#rCsmxx$$3>DGCy+#F|1WF;_e1G3WjVh z;Y6k#L5w#JIZthjwTjN);hG6Odapiq(8!mmDxR8rw;;NBpI7UUF#_%JMGz)3*v;`g za?^)DNzGYoh3jV?^KRW)iGiaS-;eJPANbtYQ{UsNHD4E%&-cbUF*<7P;fo*=NOr@2 z1X`bymAb968eE?nnN z&Ti1DdJ~=Bp$4&?fsfBXo!iCVb=aY1-~9Z~u9F?*teyi$J>G5rL_U`#vo(R=Ph=Nc zLF}wX$4X9K(2PG@bH=#9p?6>Xa{0F{rm9)pc$E+Cz6Y3D^@|Ta2VbA9ogwpdtbPdt zBgW@Rwcf=-=H&btTtlV{yIquFLs!!KgTgPQMtWmdL2TwE(qFy-NLcZS^!u8~xpTDU z<}lB7pQqoCg0W5X5I5Wt7t7JU$N{a@u^c{g_*62)loeGc5+{%w7l`ru}@#seT-p6z|RHRke zhJQqa+1}vci=f<$&+$22By2|JYfjElepOpknqBOSl^oahc=uP#*17n{)vqyK+)w}Z zfA-Ni9-aXbE=+fUy3NgU9CFd|xud5taLugY^KQ+3)X6oE0bfr#KlnQPe0bz`Z@MFR5~-z!935k zFsN$hQ?_^TpcC^EyZe8(J@S1G+*hr!hucpBS0KrAatyYQ`8zW+i({}`Z@rTczMe~_7@t(#F zkd68{anUS-j!duF`SHrv!F{d;m9HXo6Le;Jv$cd;RZaJ~9^d0*a2v_D`<129m?@s| zruVbB_}F#1-a}b;8$WysfDBHmB9M7#&Gh~le6D^{r#d&c@AgGix9~~jrnIl?4c}|X zYw_?B;8Yvw?l6a#DwZ1F1XS}h@UfWnl(A0gR(MQ~JLpF-yynX@Oy^~Iw)OGHra5MT zG|cpd53-MHEV?l~JOj8um5_Km7u>D#J6Qug{63fY%Sx_6`0^$1?z%levHw$YbIf*o;o6B4g3kQEQc!_mDAF ze1&WHc!soJemJwuH=nYGp|RVT>tow?l)bD;Nnh{2yy45*xhKdt==={a0aaiY@_E-t zMc2e13-xoRr#KmtXP_r=zsh|2D-c^f@0*uTycf{tS0FfS47@ z3&K2oj`ZB{Ik}#iPUb@8$A`9?Lp?YA72o{)@#0HysG9c3Mi1Mfi0yuvLwFzJXnmEe z_3$R}j3{E+9N_mj_vObi$hZpcHDi2^mYdV^kF5jnP$}dSkqy6^*X5 z?awXNe}_-H-A7ZH^?79AdhqZP&{;(l1%9vA*dF&v%VHX*t)$f5^3b zXLz?YWsdw|<9`pI^SwsuyE&cTL375#OMr0kH1IKWv5@O41}mHK_@vUD#Z!;txcJ)< zdti%Gq}wC+KiEkF@72w5UlrqejI)jy9|OB&U-Na5LRCyh#*ynbBl}~#3VFVV+>hq? z#t(KhAG2+^A0I}cq50@ay=|7ix=jtQO>e#*kIA(p*U0l4pxC>=9-eeb-h_`kswP(Q zW}L}=O`Xf-!{uN8 zynG@7Hy&i-gd3( zyM4H?QSSxl?KOBldgb2>V3D;d#_86({3AV~m@2OGC#xs4s{yyT?fvqve*5wAi+}(9 z%j^A!vsl?JzJA&lv%XfLPEz?C&(pE}7)YR-sQj{O4XUyGysq#Vk8>&=AP+kO@nznd zcb8v%tDE3IuiBeSVT?5yJh`Z>MbEB zQBLOH{Wv%iGk68XX1x1+L*0?_5gtcg=5|`?KeNXx?=HXj_S5wv;)b%Tzp*pcOxyc( z1IC`8ur@QN@`>T+Ukw8fWb6$>u6bUyAyLKpSai7wd6~b8w5xtPh}H4F_J_+~{P~;h z8R6aVb@*OjHOttd`8W4zrgx?z+zjvqc;K5R#6NLxALTJ;JIOLz1j?cM(B@3*J1y(SPZ z6TT+Ua)|Ay)?I^frJK23tx8WYKI&0aeb562cmHBYif^ZMT#Rucw~McnEyhLLFQ9Tp z87p=}>-ulM$oVWG-ff!izxd+vrR>WuFYot@`|kbw%NLtze2d>|DC>i6m=Ajon|0^} zU|v_|Cr1o@Bja;@1?8~k6}+dT{+#S@7R&i?{kxBWh+zuUMH-LH?KqP6*e&3C+y%$_ zcB2U8YV$w*po?|A_}2?}9ScRG|HXC#eDUS=Ch!|Ub$P^(_>n37`x_wpJ|g4OW>o8( zP_5CI$DxZQhP@8 zoS04b`pmLD+V_k6{@we_`|VLL8!t0jSDYFBh)w0HwL?E{Q0)t{3dlZkCgQ7l~x{0<9u1(x-f|qrF-yr`jPRGrzeZPFH)RD2!ItCeY1i7x| zddX1?YcDtai>>r^rgx~$iI4Bz1Hf3^$3wsiZ)450-k*w%g z4f6JQOn$*L$?auko8R=Qw;Om}_X8)B{c&_MFKaxD*L5nNa6k3w#SK44_lwl=H6MfG z#~IY1YECIbNEc!=y;;*c_VGq-zc^f^EwI*5jIAp|$8o{AS@x%UURLxnBma1r*g+Y+ zQA=hFeKTG{WRAzoOpM+Q{72AdT2kp%abl(;@ca5KUbMduBF4u*88^Uw9FNXjcu4QZ zsxUFcZQ^(D9md7hji8%gzY(afKk060%QjXn!cAj4rh$*a_fWz5ZEs<|wt~m4=FB+K zV9%V3yJr9l#s%L5%Zt9n@rZr-RIs_POScPm$B5Z-bis84>=%991e$NA80n9i`(|_; z&o*iNJ^RkF&z;+T%-k=?^%#1qOlz_k*%Ntau%2=0XN|nd9O5~OyG~tr1W8~Q zqQTom*E+UA!RyPyO9Plt4v+Bh=-0*HZvy;7caKGn`R2I$VyZgPLb_u zTvzKNedC#Sc2aLe-!(j*@ywF+RWS)M>U4V<&x80|{E>X7fIGpYUAQ5Y@Pf6IBf-eMcudeLk;@7>>C%ql@=( zwP!JI0AK6^g~ufLDC)(XY%r~(>q%&>GGB9io^cpHC;Rky`pz=Tsn)7~!F%wd>yWp- z$9g;&PM0X$-;FC=ld)Te*Y(&g$9o0l?k6q{W@}FN;c>IPgjnKN@;qMT`Ehf`4Uow* zW^pOr&1od(6|>%|JmNj4@>TUbE@P`Yg0)HypKGOdl516L<;xzbI@S8Ax3)^CHhP3N z_e_3AZcwc1ce!p(6))t+L{;B?mG)Vx{H{NziaGqtp`hf9VdHKv_&BpSo2H{)hJf8BC!2^F*Y*hO94+^u0gEspEN-hUoG-bI7YS9M(O~#~mK) zcpvC=20os?3G_gx^XEx{>V%yoHQ1E*qOr$yeLe%a-orC^ey267vyu#zXpYj;`z9eG!you+J-BQuzcm zbxd2~OiuR6SGXc`nR6s3&DX$taa|uLT(A8i zNFeIMj5AO3BNMLSc#Rp=dR2#`L+#3v&hIsnD*g;r&8`n%eYSVjTnpdrV_-5X3W%hg z!JDdTrXKTIJ@-}dzJ3PJOO0oBGsn+?k2~#^x_*w6_9Y+tN06 zdJX(;BK6U6x?JJ&yBolR3CJJZc|-M6+2rKonLqz@L2C#_*$h|=|O5S zPQS=Gd!VM*&RB3=;>Qi(3mr%6f|!+9=wfq&;*9PYW_@Q5@N6%g-fKXw(mkqoy8-<8 z8l2 zgXFY|Y=$}UzM(D_ybj~Ejw;4|*sKp7s~j0HcE7KKue*LCU$suY>zsw$+b@OwA@B{r zY@TaXU+!bv9TV>-Yl$vzg{p_Mdh}P>Dqi!bzShS}Kv$&O1hM30ZZ&uFzf|E=&C>%0 zzRodYz-xDPUB{{PgzK#4B;H5%<>M7ple*QoGBN!oFq;ziaxHy6cLN`LL*R|(T9UCI z-_>?st~;F{JlE@9~Iu$G#H$ZcevG zt;4?=R0`t=LR0{d9&Cfx*XT^7?Eq(jH9^hH{+I{0T6OaD&LH3#y5hN&$F)9vZlvntn07x zOb%pkD|nw>UH9icJBZ8p+xGygbWMqBjg92mO3iF`h0j&bkDi-zC;i!j=yIQhy*{g3 zeh*MJE+5~|bHrc83y-O&YNt-iil$XJJ1OkafguctfiV_fZH zMz=p7OG9?|9>6U{+=P!SJkF0ZR5y>ERpkGX6Fp*(`K(p3qN<56FC>2V!HTYv@fAlJ zBKPDuZ>zh}gGo-GlMS$*xtRwUC%R4H*D+(d9H{CXK^?3*Up^Mh$*JaP&XM1#d>tOE zqxR8$6|9q#KavF($$VlnFa2&6l{R#K==5ir84JW$xjttdpU-97G;U7Los4IW&-520;KbnfWX4VvdxlO|WG~KaO}Or?uP%QDYNUaWh0nciw~x$EGN-HUanrvW z2uiMs&zjU)uH&onR;YTwM~{_(*UdG@<7T~TE%k}_afh$F4&%(%yy_WWrJ-ZyFqhtV z2GD?FUGOT|bVXGI6KHr}kg>vjxpqXxcKNe?WxU6-2P|=)>&*J7w21BU9M64t32+dr z1havp%Ika%x<~q~qv=-pXUyW{t9o*u`_Ga!s~*H_YE<0%&wn}=jtX{-Cg@c0StC#O zN{!V%&Qk6FbJaq}_j-h%8F#k|tMS== ziLBpgct1yVs(szv05g$p4ZqvWPZQoq`h1QLIzLo3!F{;~#CU8)S3mtTjjje7T@9hN zZoR8n)hlm+45HYqA1!fux#8<@-7{oQj@K@408jMhDp7oH9cUfJbZ|vodIL_`?|<@j}<;2H$VoQ zfm}EDYm=DA$W|cN$8KZz diff --git a/Mods/Core/Tiles/asphalt_horizontal_middle_downleft.png.import b/Mods/Core/Tiles/asphalt_horizontal_middle_downleft.png.import deleted file mode 100644 index 12fc5594..00000000 --- a/Mods/Core/Tiles/asphalt_horizontal_middle_downleft.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://d0cp55fo13nes" -path="res://.godot/imported/asphalt_horizontal_middle_downleft.png-78e8dac225da50c35dfa7c4775a242a3.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/asphalt_horizontal_middle_downleft.png" -dest_files=["res://.godot/imported/asphalt_horizontal_middle_downleft.png-78e8dac225da50c35dfa7c4775a242a3.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/asphalt_horizontal_middle_upright.png b/Mods/Core/Tiles/asphalt_horizontal_middle_upright.png deleted file mode 100644 index 442b8580e30cd253dcf694b99e2a9e7488e89c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7113 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 diff --git a/Mods/Core/Tiles/asphalt_horizontal_middle_upright.png.import b/Mods/Core/Tiles/asphalt_horizontal_middle_upright.png.import deleted file mode 100644 index 0bcc7ff0..00000000 --- a/Mods/Core/Tiles/asphalt_horizontal_middle_upright.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://isj5e03iu8oh" -path="res://.godot/imported/asphalt_horizontal_middle_upright.png-aac2573aa1e7d6ab5345673841f13699.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/asphalt_horizontal_middle_upright.png" -dest_files=["res://.godot/imported/asphalt_horizontal_middle_upright.png-aac2573aa1e7d6ab5345673841f13699.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/asphalt_middle.png b/Mods/Core/Tiles/asphalt_middle.png deleted file mode 100644 index 4abc755a97a4f790e8213a7b159b7e5cd76bb902..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5823 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 JPDHLkV1nDFWX}Kq diff --git a/Mods/Core/Tiles/asphalt_middle.png.import b/Mods/Core/Tiles/asphalt_middle.png.import deleted file mode 100644 index f6966c68..00000000 --- a/Mods/Core/Tiles/asphalt_middle.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cqlsjlth3jlm5" -path="res://.godot/imported/asphalt_middle.png-ea411751a4c72d4150662b9b2e955840.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/asphalt_middle.png" -dest_files=["res://.godot/imported/asphalt_middle.png-ea411751a4c72d4150662b9b2e955840.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/asphalt_middle_upright.png b/Mods/Core/Tiles/asphalt_middle_upright.png deleted file mode 100644 index 5d5f562a1744247049fb9fccbf5f9f5342e4ac6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5772 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 diff --git a/Mods/Core/Tiles/dirtrampeast.png.import b/Mods/Core/Tiles/dirtrampeast.png.import deleted file mode 100644 index 4d4fda4a..00000000 --- a/Mods/Core/Tiles/dirtrampeast.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://buwgr46j20m6d" -path="res://.godot/imported/dirtrampeast.png-b30e2f77904360d98bb54e697c4b7f2c.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/dirtrampeast.png" -dest_files=["res://.godot/imported/dirtrampeast.png-b30e2f77904360d98bb54e697c4b7f2c.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/dirtrampsouth.png b/Mods/Core/Tiles/dirtrampsouth.png deleted file mode 100644 index 1278adda6a14b7dbdca343bcecbf1ade6953859b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30371 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 MimJ(AI4V80RMFa& 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 diff --git a/Mods/Core/Tiles/dirtrampwest.png.import b/Mods/Core/Tiles/dirtrampwest.png.import deleted file mode 100644 index b22f204c..00000000 --- a/Mods/Core/Tiles/dirtrampwest.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bp2j1pa122rq" -path="res://.godot/imported/dirtrampwest.png-4718b11de8ea93b6c0fe5546c955acab.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/dirtrampwest.png" -dest_files=["res://.godot/imported/dirtrampwest.png-4718b11de8ea93b6c0fe5546c955acab.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/rockyfloorrampeast.png b/Mods/Core/Tiles/rockyfloorrampeast.png deleted file mode 100644 index 7a1d7173a669f26fbf431cdd2c47548791caa429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27848 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 diff --git a/Mods/Core/Tiles/rockyfloorrampsouth.png.import b/Mods/Core/Tiles/rockyfloorrampsouth.png.import deleted file mode 100644 index 76d49617..00000000 --- a/Mods/Core/Tiles/rockyfloorrampsouth.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cc7cddqnjf610" -path="res://.godot/imported/rockyfloorrampsouth.png-4a5616173e9da023a145bd8747a61ed9.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/rockyfloorrampsouth.png" -dest_files=["res://.godot/imported/rockyfloorrampsouth.png-4a5616173e9da023a145bd8747a61ed9.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/rockyfloorrampwest.png b/Mods/Core/Tiles/rockyfloorrampwest.png deleted file mode 100644 index 296281e5a0473097493add3a95aed0e3175da2c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27820 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

p4 z7fF(NzDaK6V-N;HcH??=nHwCILCD8*0qQ*G@h%eRlT1jhKHcC3ON8*eqg1`pPWkc| z|GJw;@B6@qHb;*fxst)dl02rL*twV(SHJY@(lBI!y>lYQU3cA^zGqrn1hz4B^?~`D z$Hi-{g?krIlqJa8QZ@fD1jE=dGmr>jdB~bP`xid;D}CRwYi{DG*YU{Icx{fh@iK{s zLLe_ipXzrfFYlIoSjtGICGTzA#J%}%CWJGOOZ z&Kl>GY?>;uNB+c)+HDb@zyJmUkPS{*Ac+b9>J*Sp>`n=>I%iOA0JT5>6hS3&6+8e$ z-X80mo`M(@`-NZnmCdO$bG3>A8;#;QINp2z1C%kf0~|xU%4lvUFS(6p42IU;rCzcD zwceYy^I(N@o8!kHs{yqIvJk%_kYtG*{y^1uYNA_?kEgf;hc1&aGx{=C4W3npLVvjl zEI1YUB!grFw)_d1gmHyj>pFxsWO~z^-&VPJx%Oo0G?#yH)Bfjv@t4zf?qa&;;F0#n z4kDimLF(D}5S7jQqJyG7uNTGG_pAp=u0c?ip$Ou;$_!torbGA7^Dat0_^q#%Bbf~S6xz`0z?Yh=O6jAqy#~x}V z0WN^BTtD4zjvhiNk91C?qMx=%E&S;p81rB%a!s~BQ^q`X%OBJ7)XfR~vp28E3xsb| zB%_lVagan5A}>8*!m~}8C1#4%4Wf%0A}2>fFt>0$_UQakC{b5m?#X!e*=N%>b9wr= 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 P00000NkvXXu0mjff@8nf diff --git a/Mods/Core/Tiles/rockyfloorrampwest.png.import b/Mods/Core/Tiles/rockyfloorrampwest.png.import deleted file mode 100644 index ec7b9d59..00000000 --- a/Mods/Core/Tiles/rockyfloorrampwest.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dfhxgwsr63ok0" -path="res://.godot/imported/rockyfloorrampwest.png-0006169a93943e9ba53d4e50f3905d8b.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/rockyfloorrampwest.png" -dest_files=["res://.godot/imported/rockyfloorrampwest.png-0006169a93943e9ba53d4e50f3905d8b.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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 From 2c30049f841f27e65115cc91da612187780744de Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 23 Dec 2023 22:00:41 +0100 Subject: [PATCH 053/138] Mapeditor allow mob painting --- Mods/Core/Maps/Generichouse.json | 1 + .../Mapeditor/Scripts/GridContainer.gd | 16 ++++- .../Mapeditor/Scripts/TilebrushList.gd | 33 ++++++++-- .../Mapeditor/Scripts/mapeditortile.gd | 65 +++++++++++-------- .../Mapeditor/Scripts/tilebrush.gd | 8 +-- .../Mapeditor/mapeditortile.tscn | 21 ++++-- Scripts/gamedata.gd | 13 ++++ 7 files changed, 116 insertions(+), 41 deletions(-) diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index e5d154f3..c4f9a45e 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -4934,6 +4934,7 @@ }, { "id": "grass_plain_01", + "mob": "scrapwalker", "rotation": 0 }, { diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index ed27e6a0..583bbe8f 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -133,10 +133,20 @@ func paint_single_tile(clicked_tile): if drawRectangle or !clicked_tile: return if erase: - clicked_tile.set_default() + if selected_brush: + if selected_brush.entityType == "mob": + clicked_tile.set_mob_id("") + else: + clicked_tile.set_tile_id("") + clicked_tile.set_rotation_amount(0) + else: + clicked_tile.set_default() elif selected_brush: - clicked_tile.set_tile_id(selected_brush.tileID) - clicked_tile.set_rotation_amount(rotationAmount) # Apply rotation + if selected_brush.entityType == "mob": + clicked_tile.set_mob_id(selected_brush.tileID) + else: + clicked_tile.set_tile_id(selected_brush.tileID) + clicked_tile.set_rotation_amount(rotationAmount) #When this function is called, loop over all the TileGrid's children and get the tileData property. Store this data in the currentLevelData array func storeLevelData(): diff --git a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd index 11c9d7d8..d297e2a7 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd @@ -1,7 +1,5 @@ extends VBoxContainer -#@onready var tileBrush: PackedScene = preload("res://Scenes/ContentManager/Mapeditor/tilebrush.tscn") -#@onready var scrolling_Flow_Container: PackedScene = preload("res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn") @export var scrolling_Flow_Container: PackedScene = null @export var tileBrush: PackedScene = null @@ -14,9 +12,36 @@ var selected_brush: Control: tile_brush_selection_change.emit(selected_brush) func _ready(): + loadMobs() loadTiles() -# this function will read all files in "res://Mods/Core/Tiles/" and for each file it will create a texturerect and assign the file as the texture of the texturerect. Then it will add the texturerect as a child to $HSplitContainer/EntitiesContainer/TilesList +# this function will read all files in Gamedata.data.tiles.data and creates tilebrushes for each tile in the list. It will make separate lists for each category that the tiles belong to. +func loadMobs(): + var mobList: Array = Gamedata.data.mobs.data + + var newMobsList: Control = scrolling_Flow_Container.instantiate() + newMobsList.header = "Mobs" + add_child(newMobsList) + for item in mobList: + if item.has("sprite"): + var imagefileName: String = item["sprite"] + imagefileName = imagefileName.get_file() + # Get the texture from gamedata + var texture: Resource = Gamedata.data.mobs.sprites[imagefileName] + # Create a TextureRect node + var brushInstance = tileBrush.instantiate() + # Assign the texture to the TextureRect + brushInstance.set_tile_texture(texture) + # Since the map editor needs to knw what tile ID is used, + # We store the tile id in a variable in the brush + brushInstance.tileID = item.id + brushInstance.tilebrush_clicked.connect(tilebrush_clicked) + brushInstance.entityType = "mob" + # Add the TextureRect as a child to the TilesList + newMobsList.add_content_item(brushInstance) + instanced_brushes.append(brushInstance) + +# this function will read all files in Gamedata.data.tiles.data and creates tilebrushes for each tile in the list. It will make separate lists for each category that the tiles belong to. func loadTiles(): var tileList: Array = Gamedata.data.tiles.data @@ -47,7 +72,7 @@ func loadTiles(): # Add the TextureRect as a child to the TilesList newTilesList.add_content_item(brushInstance) instanced_brushes.append(brushInstance) - + #Find the list associated with the category func find_list_by_category(category: String) -> Control: var currentCategories: Array[Node] = get_children() diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index 5e000d47..f4d1cf7b 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -1,25 +1,24 @@ extends Control -const defaultTileData: Dictionary = {"id": "", "rotation": 0} +const defaultTileData: Dictionary = {} const defaultTexture: String = "res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" const aboveTexture: String = "res://Scenes/ContentManager/Mapeditor/Images/tileAbove.png" var tileData: Dictionary = defaultTileData.duplicate(): set(data): tileData = data - if tileData.id != "": - # tileData has an id. Now we want to load the json that has that tileid - var tileGameData = Gamedata.data.tiles - # The index in the tiles json data - var myTileIndex: int = Gamedata.get_array_index_by_id(tileGameData,tileData.id) - if myTileIndex != -1: - # We found the tile json with the specified id, so get that json by using the index - var myTileData: Dictionary = tileGameData.data[myTileIndex] - $TextureRect.texture = Gamedata.data.tiles.sprites[myTileData.sprite].albedo_texture + if tileData.has("id"): + $TileSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles,\ + tileData.id).albedo_texture + if tileData.has("rotation"): set_rotation_amount(tileData.rotation) - else: - $TextureRect.texture = load(defaultTexture) + if tileData.has("mob"): + $MobSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.mobs,\ + tileData.mob) + $MobSprite.show() else: - $TextureRect.texture = load(defaultTexture) + $TileSprite.texture = load(defaultTexture) + $MobSprite.texture = null + $MobSprite.hide() signal tile_clicked(clicked_tile: Control) func _on_texture_rect_gui_input(event: InputEvent) -> void: @@ -30,22 +29,32 @@ func _on_texture_rect_gui_input(event: InputEvent) -> void: tile_clicked.emit(self) func set_rotation_amount(amount: int) -> void: - $TextureRect.rotation_degrees = amount + $TileSprite.rotation_degrees = amount tileData.rotation = amount func get_rotation_amount() -> int: - return $TextureRect.rotation_degrees + return $TileSprite.rotation_degrees func set_scale_amount(scaleAmount: int) -> void: custom_minimum_size.x = scaleAmount custom_minimum_size.y = scaleAmount func set_tile_id(id: String) -> void: - tileData.id = id - var jsonTileData: Dictionary = Gamedata.data.tiles - var jsonTile: Dictionary = jsonTileData.data[Gamedata.get_array_index_by_id(jsonTileData,id)] - var tileTexture: Resource = Gamedata.data.tiles.sprites[jsonTile.sprite] - $TextureRect.texture = tileTexture.albedo_texture + if id == "": + tileData.erase("id") + $TileSprite.texture = load(defaultTexture) + else: + tileData.id = id + $TileSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles, id).albedo_texture + +func set_mob_id(id: String) -> void: + if id == "": + tileData.erase("mob") + $MobSprite.hide() + else: + tileData.mob = id + $MobSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.mobs, id) + $MobSprite.show() func _on_texture_rect_mouse_entered() -> void: if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): @@ -55,24 +64,28 @@ func set_default() -> void: tileData = defaultTileData.duplicate() func highlight() -> void: - $TextureRect.modulate = Color(0.227, 0.635, 0.757) + $TileSprite.modulate = Color(0.227, 0.635, 0.757) func unhighlight() -> void: - $TextureRect.modulate = Color(1,1,1) + $TileSprite.modulate = Color(1,1,1) func set_clickable(clickable: bool): if !clickable: mouse_filter = MOUSE_FILTER_IGNORE - $TextureRect.mouse_filter = MOUSE_FILTER_IGNORE + $TileSprite.mouse_filter = MOUSE_FILTER_IGNORE + $MobSprite.mouse_filter = MOUSE_FILTER_IGNORE #This function sets the texture to some static resource that helps the user visualize that something is above #If this tile has a texture in its data, set it to the above texture instead func set_above(): + $MobSprite.texture = null + $MobSprite.hide() if tileData.id != "": - $TextureRect.texture = load(aboveTexture) + $TileSprite.texture = load(aboveTexture) else: - $TextureRect.texture = null + $TileSprite.texture = null func _on_texture_rect_resized(): - $TextureRect.pivot_offset = size / 2 + $TileSprite.pivot_offset = size / 2 + $MobSprite.pivot_offset = size / 2 diff --git a/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd b/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd index b8663493..4c174129 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd @@ -3,18 +3,19 @@ extends Control signal tilebrush_clicked(clicked_tile: Control) var tileID: String = "" var selected: bool = false +var entityType: String = "tile" #When the event was a left mouse button press, adjust the modulate property of the $TileSprite to be 3aa2c1 func _on_texture_rect_gui_input(event): if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: tilebrush_clicked.emit(self) - + func set_tile_texture(res: Resource) -> void: $TileSprite.texture = res - + func get_texture() -> Resource: return $TileSprite.texture - + #Mark the clicked tilebrush as selected func set_selected(is_selected: bool) -> void: selected = is_selected @@ -22,4 +23,3 @@ func set_selected(is_selected: bool) -> void: modulate = Color(0.227, 0.635, 0.757) else: modulate = Color(1,1,1) - diff --git a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn index a411d8df..08f234b4 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn @@ -13,7 +13,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 script = ExtResource("1_7fypm") -[node name="TextureRect" type="TextureRect" parent="."] +[node name="TileSprite" type="TextureRect" parent="."] layout_mode = 1 anchors_preset = -1 anchor_right = 1.0 @@ -23,6 +23,19 @@ grow_vertical = 2 texture = ExtResource("2_rued1") expand_mode = 3 -[connection signal="gui_input" from="TextureRect" to="." method="_on_texture_rect_gui_input"] -[connection signal="mouse_entered" from="TextureRect" to="." method="_on_texture_rect_mouse_entered"] -[connection signal="resized" from="TextureRect" to="." method="_on_texture_rect_resized"] +[node name="MobSprite" type="TextureRect" parent="."] +visible = false +layout_mode = 1 +anchors_preset = -1 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("2_rued1") +expand_mode = 3 + +[connection signal="gui_input" from="TileSprite" to="." method="_on_texture_rect_gui_input"] +[connection signal="mouse_entered" from="TileSprite" to="." method="_on_texture_rect_mouse_entered"] +[connection signal="resized" from="TileSprite" to="." method="_on_texture_rect_resized"] +[connection signal="gui_input" from="MobSprite" to="." method="_on_texture_rect_gui_input"] +[connection signal="mouse_entered" from="MobSprite" to="." method="_on_texture_rect_mouse_entered"] diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index 2b2d4fe3..9c506b8b 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -141,6 +141,19 @@ func save_data_to_file(contentData: Dictionary): if datapath.ends_with(".json"): Helper.json_helper.write_json_file(datapath,JSON.stringify(contentData.data,"\t")) +# Takes contentdata and an id and returns the json that belongs to an id +# For example, contentData can be Gamedata.data.tiles +# and id can be "plain_grass" and it will return the json data for plain_grass +func get_data_by_id(contentData: Dictionary, id: String) -> Dictionary: + return contentData.data[get_array_index_by_id(contentData,id)] + +#Takes contentData and an id and returns the sprite associated with the id +# For example, contentData can be Gamedata.data.tiles +# and id can be "plain_grass" and it will return the sprite for plain_grass +func get_sprite_by_id(contentData: Dictionary, id: String) -> Resource: + var item_json = get_data_by_id(contentData, id) + return contentData.sprites[item_json.sprite] + # This functino is called when an editor has changed data # The contenteditor (that initializes the individual editors) # connects the changed_data signal to this function From 1eceb0fda1268330642b3a48bfe07c07a5cb272f Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 23 Dec 2023 22:37:06 +0100 Subject: [PATCH 054/138] Update scrapwalker64.png --- Mods/Core/Mobs/scrapwalker64.png | Bin 5431 -> 4122 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Mods/Core/Mobs/scrapwalker64.png b/Mods/Core/Mobs/scrapwalker64.png index f074fd02998250328172c74dac7a987e46976773..3867e73a52d112837b506471d4ffefffe805970c 100644 GIT binary patch literal 4122 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 F^*=Y@;jI7w delta 5430 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%0AOOkI_-~%0zJqn3v0b)M)MbgB_ z-k3u|=2HVjlC$HpWP|uRq>SSVS2O6p5%d+x_I*>66F*rB_j#HG{=d^ntqe?);Qu~oW`ZLskZEpUBP zvt@8zdK_6dfc1CysI2khrqf*V(Rhmr2-E{<=%fZwq^)@T%2gTd{e6~55>Z!!uDTjt zC{Nio7~iDnYLk-4BnH7yJ}@a&VZ`t}2DRYaB2>LV75L(V$>JZF*(NOB8R$L=ed5%K z!Q+%XX_+(Wf0%ja$#YYDRd&g(+379FC{|vV7AQwNfu)*uHL^lrl^h=2UQ7)xg zy)HoMIbQQp zSNGNPOQt-Spy!K{*w7&kaaEX$S}9$PjPHg)trpX@f4^Rx)}GG-r6$5@RR?6Qb76I= zSf{ZIB|1ONK)`*n3PoIB1Kgi3+Tc7VWzmocC3eG$*F9~?7b7|v!Ns6DoJoEvZPLxM zYA1u43SogAkp1ntLq!BR9M&ciaglVf1DGmQ zXtGe7e|op%Od}14+eKsukXYX=co<02HLJ6UwQKWnTHl`-KRHwHsT?MaZJ_%?%q~^$ z3J_YoY;bsW+Bv);=?$}Jvv@KQ?75-mRWSKA{PcY=_c_V_Rc+!3AHhyiHanthtFRn~^59MQ=sWF1`1gHe-@1uyx?uskHd?yIk zWPZ5sc=;pS*XI)8<_-YyWn7fn#9l-mjs{#1&d8%!jH|rnd4TyVZ%x(f2&_&)Du%dY ze-edx4zw5mfC~dD>x(#w#AE+B)bM?K4s#*C`xYicog%?b)2tink73X~eE)|9hD{X5 z=3Mz@&SoqR`9EGUmvFV65{7^3?oBaz_KiaA=@YYmk6`9z*tRd(O?`~x2$mdaDETGx z4$S$`?pG%!&s6DpT%gNKU2&Jj_OzN2UNaGzZ{|tvuU3-{*QRuGWQdApUo7fATHF zSEVcRXd2I0KbcvKtOSTt)kB>&cHqS9)c)hMe+h}W5k<|vz;*a3KHvnQU*G-e_{;~d z%nrlIZi@pH*~w`1Z<@0EmXe3r%#>s{U(0*VYttF(5G5m8o&iBErK|pFo^3#O267NL3zch5r~K zr2rD4ZlMKh9(-bSak{Uz)N()IQaJ&D|3VTc-6JViTzo{~l&`W05cq1Gaw3ca#GfxZ zey3ZmJbj|@Ci?z4_Xqb`GC#}b0!;h}j@4M@_*jk0bZh{X1VS44sz6WTf6r^RT$59q z?c@%xUpat7E&tQQNk`~73m{*6Wf$cKZY=~rivKIv8N0(?+WRoquQBmgfOrN}Rg)Qb zmI_=x5#o=#CnupcJ>MD^2P1Q0JOBUnh0ln7Ybfch$e1{*3zT2k09DKsT8Tfw5yHO5 zj&y%nDT)&2-;s%twLBnRe*r7YV{=9@Sm%3>kCyCSQ06f$XM^n*rou_BRaQRc-a8m~ zLJO>jje;O_S6FgFE{wZ;J+uwW^0~C>e{y+R<_gl(MZ#hALm(BsuA{crk`6DF1%C9( z;?^rt?hRriVSO;zRAfT}Q7KSAuK32O9_Xj_dFKusp{-#t4>=z}e?S#qr4jbW@aUyp z)(HWST$8(AC=_P@ZfM?%SdcF&BjcNEQAvpW{M7zYR7rYh0}1~S9NVA3h#pl}`1xX!!qHJd7*Ihu(W;Rotslv0JysV#3upD2=BRudI@5NEl(UR z7nZUX=9)VmZwI5>iNUQknC3Q!>?a_)-vj{v((TyA^aBtpEU?C1C}iG?_~WO$Un}3U gnDPJLw*vzI0}AL1nG#timH+?%07*qoM6N<$f&o8#K>z>% From f165150d6e71190e607b77fc759e43ee8fd920fd Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 2 Jan 2024 23:44:07 +0100 Subject: [PATCH 055/138] Mob spawns on the block --- LevelGenerator.gd | 55 ++++++++++++++++++++++++++++++------------- Scripts/Enemy.gd | 3 +++ level_generation.tscn | 3 --- 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 7ad9612c..3303c4fc 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -26,6 +26,7 @@ func _ready(): func generate_map(): map_save_folder = get_saved_map_folder() generate_level() + # These two functions apply only to maps thet were previously saved in a save game generate_enemies() generate_items() @@ -45,7 +46,7 @@ func generate_enemies() -> void: var enemiesArray = Helper.json_helper.load_json_array_file(map_save_folder + "/enemies.json") for enemy: Dictionary in enemiesArray: add_enemy_to_map.call_deferred(enemy) - + func add_enemy_to_map(enemy: Dictionary): var newEnemy: CharacterBody3D = defaultEnemy.instantiate() newEnemy.add_to_group("Enemies") @@ -69,13 +70,18 @@ func add_item_to_map(item: Dictionary): newItem.global_position.y = item.global_position_y newItem.global_position.z = item.global_position_z +# Generate the map layer by layer +# For each layer, add all the blocks with proper rotation +# If a block has an enemy, add it too func generate_level() -> void: var level_name: String = Helper.current_level_name var tileJSON: Dictionary = {} - var myRotation: int = 0 if level_name == "": get_level_json() else: + # Load the default map from json + # Unless the map_save_folder is set + # In which case we load tha map instead if map_save_folder == "": get_custom_level_json("./Mods/Core/Maps/" + level_name) else: @@ -107,24 +113,12 @@ func generate_level() -> void: tileJSON = level[current_block] if tileJSON.has("id"): if tileJSON.id != "": - var block = create_block_with_id(tileJSON.id) + var block: StaticBody3D = create_block_with_id(tileJSON.id) level_node.add_child(block) block.global_position.x = w block.global_position.z = h - if tileJSON.has("rotation"): - if tileJSON.rotation != 0: - # We subtract 90 so we know that north is - # on the top of the screen - # The default block has a y rotation of 90 - # So it is already pointing north (0 = 90) - # 90 = 0 - points east - # 180 (we add 90 instead of subtract) = 270 = south - # 270 = 180 - points west - myRotation = tileJSON.rotation - if myRotation == 180: - block.rotation_degrees = Vector3(0,myRotation+90,0) - else: - block.rotation_degrees = Vector3(0,myRotation-90,0) + apply_block_rotation(tileJSON, block) + add_block_mob(tileJSON, block) current_block += 1 level_number += 1 @@ -144,6 +138,33 @@ func get_custom_level_json(level_path): level_levels = json_as_dict["levels"] +func apply_block_rotation(tileJSON: Dictionary, block: StaticBody3D): + if tileJSON.has("rotation"): + if tileJSON.rotation != 0: + # We subtract 90 so we know that north is + # on the top of the screen + # The default block has a y rotation of 90 + # So it is already pointing north (0 = 90) + # 90 = 0 - points east + # 180 (we add 90 instead of subtract) = 270 = south + # 270 = 180 - points west + var myRotation: int = tileJSON.rotation + if myRotation == 180: + block.rotation_degrees = Vector3(0,myRotation+90,0) + else: + block.rotation_degrees = Vector3(0,myRotation-90,0) + +func add_block_mob(tileJSON: Dictionary, block: StaticBody3D): + if tileJSON.has("mob"): + var newMob: CharacterBody3D = defaultEnemy.instantiate() + newMob.add_to_group("Enemies") + newMob.set_sprite(Gamedata.get_sprite_by_id(Gamedata.data.mobs,tileJSON.mob)) + get_tree().get_root().add_child(newMob) + newMob.global_position.x = block.global_position.x + newMob.global_position.y = block.global_position.y+0.5 + newMob.global_position.z = block.global_position.z + + # This function takes a tile id and creates a new instance of either a block # or a slope which is a StaticBody3D. Look up the sprite property that is specified in # the json associated with the id. It will then take the sprite from the diff --git a/Scripts/Enemy.gd b/Scripts/Enemy.gd index 848edf6b..045f6ff2 100644 --- a/Scripts/Enemy.gd +++ b/Scripts/Enemy.gd @@ -35,3 +35,6 @@ func add_corpse(pos: Vector3): get_tree().get_root().add_child(corpse) corpse.global_position = pos corpse.add_to_group("mapitems") + +func set_sprite(sprite: Resource): + $Sprite3D.texture = sprite diff --git a/level_generation.tscn b/level_generation.tscn index 903670f2..8c6d3887 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -142,9 +142,6 @@ hud = NodePath("../../HUD") [node name="Enemies" type="Node3D" parent="TacticalMap/Entities"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.4043, 0, -8.78679) -[node name="Enemy" parent="TacticalMap/Entities/Enemies" instance=ExtResource("11_tj1r0")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.09226, 0.991724, 23.5959) - [node name="Projectiles" type="Node3D" parent="TacticalMap/Entities"] [node name="Player" type="CharacterBody3D" parent="TacticalMap/Entities" node_paths=PackedStringArray("sprite") groups=["Players"]] From e8f0c0bada607a9afe000c3feb1d39b84dbe4ad3 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 4 Jan 2024 21:21:31 +0100 Subject: [PATCH 056/138] Mob now has transparancy --- Scripts/Enemy.gd | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Scripts/Enemy.gd b/Scripts/Enemy.gd index 045f6ff2..2db1f402 100644 --- a/Scripts/Enemy.gd +++ b/Scripts/Enemy.gd @@ -37,4 +37,10 @@ func add_corpse(pos: Vector3): corpse.add_to_group("mapitems") func set_sprite(sprite: Resource): - $Sprite3D.texture = sprite + #$Sprite3D.texture = sprite + #$MeshInstance3D.mesh = BoxMesh.new() + var material := StandardMaterial3D.new() + material.albedo_texture = sprite # Set the texture of the material + material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + #material.uv1_scale = Vector3(3,2,1) + $MeshInstance3D.mesh.surface_set_material(0, material) From d894cbf7efc7036fa6fb4539ea7d72ea1902b34f Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 4 Jan 2024 22:06:00 +0100 Subject: [PATCH 057/138] remove commented code --- Scripts/Enemy.gd | 3 --- 1 file changed, 3 deletions(-) diff --git a/Scripts/Enemy.gd b/Scripts/Enemy.gd index 2db1f402..4d295105 100644 --- a/Scripts/Enemy.gd +++ b/Scripts/Enemy.gd @@ -37,10 +37,7 @@ func add_corpse(pos: Vector3): corpse.add_to_group("mapitems") func set_sprite(sprite: Resource): - #$Sprite3D.texture = sprite - #$MeshInstance3D.mesh = BoxMesh.new() var material := StandardMaterial3D.new() material.albedo_texture = sprite # Set the texture of the material material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA - #material.uv1_scale = Vector3(3,2,1) $MeshInstance3D.mesh.surface_set_material(0, material) From 4e49632075d72f13fa0389658e397533d351f13e Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 7 Jan 2024 19:18:37 +0100 Subject: [PATCH 058/138] fix block save load --- Defaults/Blocks/default_block.gd | 1 + Defaults/Blocks/default_slope.gd | 1 + LevelGenerator.gd | 2 ++ Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd | 2 ++ Scripts/Helper/save_helper.gd | 7 +++---- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Defaults/Blocks/default_block.gd b/Defaults/Blocks/default_block.gd index c840bfd3..b71cc759 100644 --- a/Defaults/Blocks/default_block.gd +++ b/Defaults/Blocks/default_block.gd @@ -1,5 +1,6 @@ extends StaticBody3D +var id: String = "" func update_texture(material: BaseMaterial3D) -> void: $MeshInstance3D.mesh = BoxMesh.new() diff --git a/Defaults/Blocks/default_slope.gd b/Defaults/Blocks/default_slope.gd index c840bfd3..b71cc759 100644 --- a/Defaults/Blocks/default_slope.gd +++ b/Defaults/Blocks/default_slope.gd @@ -1,5 +1,6 @@ extends StaticBody3D +var id: String = "" func update_texture(material: BaseMaterial3D) -> void: $MeshInstance3D.mesh = BoxMesh.new() diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 3303c4fc..125acd49 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -117,6 +117,8 @@ func generate_level() -> void: level_node.add_child(block) block.global_position.x = w block.global_position.z = h + # Remmeber the id for save and load purposes + block.id = tileJSON.id apply_block_rotation(tileJSON, block) add_block_mob(tileJSON, block) current_block += 1 diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index f4d1cf7b..6d15d02b 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -1,5 +1,7 @@ extends Control +#If a tile has no data, we save an empty object. Tiledata can have: +# id, rotation, mob const defaultTileData: Dictionary = {} const defaultTexture: String = "res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" const aboveTexture: String = "res://Scenes/ContentManager/Mapeditor/Images/tileAbove.png" diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index b05df3f6..80c2b1c7 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -111,12 +111,11 @@ func save_map_data(target_folder: String) -> void: for w in level_width: block = level.get_child(current_block) if block.global_position.z == h and block.global_position.x == w: - textureName = block.get_texture_string() - textureName = textureName.replace("res://./Mods/Core/Tiles/", "") - mapData.levels[level_y].append({ "texture": textureName,"rotation": 0 }) + mapData.levels[level_y].append({ "id": block.id,\ + "rotation": block.rotation_degrees.y }) if current_block < level_block_count-1: current_block += 1 else: - mapData.levels[level_y].append({ "texture": "","rotation": 0 }) + mapData.levels[level_y].append({}) #Overwrite the file if it exists and otherwise create it Helper.json_helper.write_json_file(target_folder + "/map.json", JSON.stringify(mapData)) From cd36a2408b7bfa2f8fa60d1f39c8b216a21af000 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 7 Jan 2024 20:17:00 +0100 Subject: [PATCH 059/138] rename enemy to mob --- Defaults/Mobs/{enemy.tscn => mob.tscn} | 90 +++++++++---------- .../{enemy_corpse.tscn => mob_corpse.tscn} | 0 Scripts/EnemyFollow.gd | 61 ------------- Scripts/{Enemy.gd => Mob.gd} | 9 +- Scripts/{EnemyAttack.gd => MobAttack.gd} | 18 ++-- Scripts/MobFollow.gd | 61 +++++++++++++ Scripts/{EnemyIdle.gd => MobIdle.gd} | 22 ++--- Scripts/{EnemyStats.gd => MobStats.gd} | 0 8 files changed, 132 insertions(+), 129 deletions(-) rename Defaults/Mobs/{enemy.tscn => mob.tscn} (51%) rename Defaults/Mobs/{enemy_corpse.tscn => mob_corpse.tscn} (100%) delete mode 100644 Scripts/EnemyFollow.gd rename Scripts/{Enemy.gd => Mob.gd} (73%) rename Scripts/{EnemyAttack.gd => MobAttack.gd} (67%) create mode 100644 Scripts/MobFollow.gd rename Scripts/{EnemyIdle.gd => MobIdle.gd} (52%) rename Scripts/{EnemyStats.gd => MobStats.gd} (100%) diff --git a/Defaults/Mobs/enemy.tscn b/Defaults/Mobs/mob.tscn similarity index 51% rename from Defaults/Mobs/enemy.tscn rename to Defaults/Mobs/mob.tscn index c453a610..e07fefa9 100644 --- a/Defaults/Mobs/enemy.tscn +++ b/Defaults/Mobs/mob.tscn @@ -1,15 +1,15 @@ [gd_scene load_steps=15 format=3 uid="uid://b2r6nh12wv41k"] -[ext_resource type="Script" path="res://Scripts/Enemy.gd" id="1_eb130"] -[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/enemy_corpse.tscn" id="2_vyld4"] -[ext_resource type="Script" path="res://Scripts/StateMachine.gd" id="3_68hce"] -[ext_resource type="Script" path="res://Scripts/EnemyAttack.gd" id="4_mt4kh"] -[ext_resource type="Script" path="res://Scripts/EnemyIdle.gd" id="5_bvewq"] -[ext_resource type="Script" path="res://Scripts/EnemyFollow.gd" id="6_0jpem"] -[ext_resource type="Script" path="res://Scripts/EnemyStats.gd" id="7_p4tru"] -[ext_resource type="Texture2D" uid="uid://cy56wx4qynp3m" path="res://Textures/enemy.png" id="8_wgh4n"] -[ext_resource type="Script" path="res://Scripts/Detection.gd" id="9_fj2x0"] -[ext_resource type="Shader" path="res://transparent_lighting.gdshader" id="10_c1y3v"] +[ext_resource type="Script" path="res://Scripts/Mob.gd" id="1_ajqy0"] +[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/mob_corpse.tscn" id="2_eldwl"] +[ext_resource type="Script" path="res://Scripts/StateMachine.gd" id="3_qfjv5"] +[ext_resource type="Script" path="res://Scripts/MobAttack.gd" id="4_fqxd2"] +[ext_resource type="Script" path="res://Scripts/MobIdle.gd" id="5_qf6ud"] +[ext_resource type="Script" path="res://Scripts/MobFollow.gd" id="6_va33k"] +[ext_resource type="Script" path="res://Scripts/MobStats.gd" id="7_a31ax"] +[ext_resource type="Script" path="res://Scripts/Detection.gd" id="8_ugi6q"] +[ext_resource type="Texture2D" uid="uid://cy56wx4qynp3m" path="res://Textures/enemy.png" id="9_vd6sy"] +[ext_resource type="Shader" path="res://transparent_lighting.gdshader" id="10_qbt4f"] [sub_resource type="SphereShape3D" id="SphereShape3D_uyii8"] radius = 0.357674 @@ -19,10 +19,10 @@ size = Vector3(0.35, 0.35, 0.35) [sub_resource type="ShaderMaterial" id="ShaderMaterial_vr552"] render_priority = 0 -shader = ExtResource("10_c1y3v") +shader = ExtResource("10_qbt4f") shader_parameter/color = Color(1, 0.266667, 0.0509804, 1) shader_parameter/energy = 1.0 -shader_parameter/tex = ExtResource("8_wgh4n") +shader_parameter/tex = ExtResource("9_vd6sy") [sub_resource type="QuadMesh" id="QuadMesh_bbnvr"] lightmap_size_hint = Vector2i(7, 7) @@ -30,14 +30,14 @@ material = SubResource("ShaderMaterial_vr552") size = Vector2(0.5, 0.5) orientation = 1 -[node name="Enemy" type="CharacterBody3D" groups=["Enemies"]] +[node name="Mob" type="CharacterBody3D" groups=["Enemies"]] collision_layer = 2 collision_mask = 15 wall_min_slide_angle = 0.0 floor_constant_speed = true -script = ExtResource("1_eb130") -stats = NodePath("EnemyStats") -corpse_scene = ExtResource("2_vyld4") +script = ExtResource("1_ajqy0") +stats = NodePath("MobStats") +corpse_scene = ExtResource("2_eldwl") [node name="NavigationAgent3D" type="NavigationAgent3D" parent="."] path_desired_distance = 0.5 @@ -47,42 +47,42 @@ avoidance_enabled = true debug_enabled = true [node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("initial_state")] -script = ExtResource("3_68hce") -initial_state = NodePath("EnemyIdle") +script = ExtResource("3_qfjv5") +initial_state = NodePath("MobIdle") -[node name="EnemyAttack" type="Node3D" parent="StateMachine" node_paths=PackedStringArray("attack_timer")] -script = ExtResource("4_mt4kh") -stats = NodePath("../../EnemyStats") +[node name="MobAttack" type="Node3D" parent="StateMachine" node_paths=PackedStringArray("attack_timer")] +script = ExtResource("4_fqxd2") +stats = NodePath("../../MobStats") attack_timer = NodePath("AttackCooldown") -enemy = NodePath("../..") +mob = NodePath("../..") -[node name="AttackCooldown" type="Timer" parent="StateMachine/EnemyAttack"] +[node name="AttackCooldown" type="Timer" parent="StateMachine/MobAttack"] -[node name="EnemyIdle" type="Node3D" parent="StateMachine" node_paths=PackedStringArray("nav_agent", "moving_timer")] -script = ExtResource("5_bvewq") +[node name="MobIdle" type="Node3D" parent="StateMachine" node_paths=PackedStringArray("nav_agent", "moving_timer")] +script = ExtResource("5_qf6ud") nav_agent = NodePath("../../NavigationAgent3D") -stats = NodePath("../../EnemyStats") -enemy = NodePath("../..") +stats = NodePath("../../MobStats") +mob = NodePath("../..") move_distance = 50.0 moving_timer = NodePath("MovingCooldown") -[node name="MovingCooldown" type="Timer" parent="StateMachine/EnemyIdle"] +[node name="MovingCooldown" type="Timer" parent="StateMachine/MobIdle"] wait_time = 4.0 -[node name="EnemyFollow" type="Node3D" parent="StateMachine" node_paths=PackedStringArray("nav_agent", "enemy", "pathfinding_timer")] -script = ExtResource("6_0jpem") +[node name="MobFollow" type="Node3D" parent="StateMachine" node_paths=PackedStringArray("nav_agent", "mob", "pathfinding_timer")] +script = ExtResource("6_va33k") nav_agent = NodePath("../../NavigationAgent3D") -enemy = NodePath("../..") -enemyCol = NodePath("../../CollisionShape3D") -stats = NodePath("../../EnemyStats") +mob = NodePath("../..") +mobCol = NodePath("../../CollisionShape3D") +stats = NodePath("../../MobStats") pathfinding_timer = NodePath("Timer") -[node name="Timer" type="Timer" parent="StateMachine/EnemyFollow"] +[node name="Timer" type="Timer" parent="StateMachine/MobFollow"] wait_time = 0.2 autostart = true -[node name="EnemyStats" type="Node" parent="."] -script = ExtResource("7_p4tru") +[node name="MobStats" type="Node" parent="."] +script = ExtResource("7_a31ax") melee_damage = 20.0 melee_range = 1.5 health = 100.0 @@ -93,8 +93,8 @@ senseRange = 50.0 hearingRange = 1000.0 [node name="Detection" type="Node3D" parent="."] -script = ExtResource("9_fj2x0") -stats = NodePath("../EnemyStats") +script = ExtResource("8_ugi6q") +stats = NodePath("../MobStats") [node name="Sprite3D" type="Sprite3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0275174, 0) @@ -105,7 +105,7 @@ pixel_size = 0.05 billboard = 1 shaded = true double_sided = false -texture = ExtResource("8_wgh4n") +texture = ExtResource("9_vd6sy") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] visible = false @@ -122,9 +122,9 @@ cast_shadow = 0 gi_mode = 0 mesh = SubResource("QuadMesh_bbnvr") -[connection signal="timeout" from="StateMachine/EnemyAttack/AttackCooldown" to="StateMachine/EnemyAttack" method="_on_attack_cooldown_timeout"] -[connection signal="timeout" from="StateMachine/EnemyIdle/MovingCooldown" to="StateMachine/EnemyIdle" method="_on_moving_cooldown_timeout"] -[connection signal="timeout" from="StateMachine/EnemyFollow/Timer" to="StateMachine/EnemyFollow" method="_on_timer_timeout"] -[connection signal="player_spotted" from="Detection" to="StateMachine/EnemyAttack" method="_on_detection_player_spotted"] -[connection signal="player_spotted" from="Detection" to="StateMachine/EnemyIdle" method="_on_detection_player_spotted"] -[connection signal="player_spotted" from="Detection" to="StateMachine/EnemyFollow" method="_on_detection_player_spotted"] +[connection signal="timeout" from="StateMachine/MobAttack/AttackCooldown" to="StateMachine/MobAttack" method="_on_attack_cooldown_timeout"] +[connection signal="timeout" from="StateMachine/MobIdle/MovingCooldown" to="StateMachine/MobIdle" method="_on_moving_cooldown_timeout"] +[connection signal="timeout" from="StateMachine/MobFollow/Timer" to="StateMachine/MobFollow" method="_on_timer_timeout"] +[connection signal="player_spotted" from="Detection" to="StateMachine/MobAttack" method="_on_detection_player_spotted"] +[connection signal="player_spotted" from="Detection" to="StateMachine/MobIdle" method="_on_detection_player_spotted"] +[connection signal="player_spotted" from="Detection" to="StateMachine/MobFollow" method="_on_detection_player_spotted"] diff --git a/Defaults/Mobs/enemy_corpse.tscn b/Defaults/Mobs/mob_corpse.tscn similarity index 100% rename from Defaults/Mobs/enemy_corpse.tscn rename to Defaults/Mobs/mob_corpse.tscn diff --git a/Scripts/EnemyFollow.gd b/Scripts/EnemyFollow.gd deleted file mode 100644 index 81567b88..00000000 --- a/Scripts/EnemyFollow.gd +++ /dev/null @@ -1,61 +0,0 @@ -extends State -class_name EnemyFollow - - - -@export var nav_agent: NavigationAgent3D -@export var enemy: CharacterBody3D -@export var enemyCol: NodePath -@export var stats: NodePath -@export var pathfinding_timer: Timer - -var targeted_player - -@onready var target_location = enemy.position - - -func Enter(): - print("Following the player") - pathfinding_timer.start() - makepath() - -func Exit(): - pathfinding_timer.stop() - -func Physics_Update(_delta: float): - var dir = enemy.to_local(nav_agent.get_next_path_position()).normalized() - enemy.velocity = dir * get_node(stats).current_move_speed - enemy.move_and_slide() - - if !targeted_player: - return - var space_state = get_world_3d().direct_space_state - # TO-DO Change playerCol to group of players - var query = PhysicsRayQueryParameters3D.create(get_node(enemyCol).global_position, targeted_player.global_position, int(pow(2, 1-1) + pow(2, 3-1)),[self]) - var result = space_state.intersect_ray(query) - - - if result: - - if result.collider.is_in_group("Players")&& Vector3(get_node(enemyCol).global_position).distance_to(targeted_player.global_position) <= get_node(stats).melee_range / 2: - print("changing state to enemyattack...") - Transistioned.emit(self, "enemyattack") - - - - - if Vector3(enemy.global_position).distance_to(target_location) <= 0.5: - Transistioned.emit(self, "enemyidle") - - - -func makepath() -> void: - nav_agent.target_position = target_location -# print("From follow: ", target_location) - -func _on_timer_timeout(): - makepath() - -func _on_detection_player_spotted(player): - target_location = player.position - targeted_player = player diff --git a/Scripts/Enemy.gd b/Scripts/Mob.gd similarity index 73% rename from Scripts/Enemy.gd rename to Scripts/Mob.gd index 4d295105..601666c4 100644 --- a/Scripts/Enemy.gd +++ b/Scripts/Mob.gd @@ -2,8 +2,11 @@ extends CharacterBody3D var tween: Tween var original_scale +# id for the mob json. this will be used to load the data when creating a mob +# when saving a mob in between levels, we will use some static json defined by this id +# and some dynamic json like the mob health and buffs and debuffs +var id: String -@export var sprite: NodePath @export var stats: NodePath @export var corpse_scene: PackedScene @@ -36,8 +39,8 @@ func add_corpse(pos: Vector3): corpse.global_position = pos corpse.add_to_group("mapitems") -func set_sprite(sprite: Resource): +func set_sprite(newSprite: Resource): var material := StandardMaterial3D.new() - material.albedo_texture = sprite # Set the texture of the material + material.albedo_texture = newSprite # Set the texture of the material material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA $MeshInstance3D.mesh.surface_set_material(0, material) diff --git a/Scripts/EnemyAttack.gd b/Scripts/MobAttack.gd similarity index 67% rename from Scripts/EnemyAttack.gd rename to Scripts/MobAttack.gd index 39cf943a..3a2c1393 100644 --- a/Scripts/EnemyAttack.gd +++ b/Scripts/MobAttack.gd @@ -1,10 +1,10 @@ extends State -class_name EnemyAttack +class_name MobAttack @export var stats: NodePath @export var attack_timer: Timer -@export var enemy: NodePath -@export var enemy_sprite: NodePath +@export var mob: NodePath +@export var mob_sprite: NodePath var tween: Tween @@ -24,13 +24,13 @@ func Physics_Update(_delta: float): var space_state = get_world_3d().direct_space_state # TO-DO Change playerCol to group of players - var query = PhysicsRayQueryParameters3D.create(get_node(enemy).global_position, targeted_player.global_position, int(pow(2, 1-1) + pow(2, 3-1)), [self]) + var query = PhysicsRayQueryParameters3D.create(get_node(mob).global_position, targeted_player.global_position, int(pow(2, 1-1) + pow(2, 3-1)), [self]) var result = space_state.intersect_ray(query) if result: - if result.collider.is_in_group("Players") && Vector3(get_node(enemy).global_position).distance_to(targeted_player.global_position) <= get_node(stats).melee_range: + if result.collider.is_in_group("Players") && Vector3(get_node(mob).global_position).distance_to(targeted_player.global_position) <= get_node(stats).melee_range: if !is_in_attack_mode: is_in_attack_mode = true @@ -53,12 +53,12 @@ func attack(): # print(Vector2(targeted_player.global_position)) # print(Vector2(to_local(targeted_player.position))) # print(Vector2(to_local(targeted_player.global_position))) -# print(Vector2(targeted_player.position - get_node(enemy).global_position)) +# print(Vector2(targeted_player.position - get_node(mob).global_position)) #3d # tween = create_tween() -# tween.tween_property(get_node(enemy_sprite), "position", targeted_player.position - get_node(enemy).global_position, 0.1 ) -# tween.tween_property(get_node(enemy_sprite), "position", Vector2(0,0), 0.1 ) +# tween.tween_property(get_node(mob_sprite), "position", targeted_player.position - get_node(mob).global_position, 0.1 ) +# tween.tween_property(get_node(mob_sprite), "position", Vector2(0,0), 0.1 ) if targeted_player.has_method("_get_hit"): targeted_player._get_hit(get_node(stats).melee_damage) @@ -67,7 +67,7 @@ func attack(): func stop_attacking(): print("I stopped attacking") attack_timer.stop() - Transistioned.emit(self, "enemyfollow") + Transistioned.emit(self, "mobfollow") func _on_detection_player_spotted(player): diff --git a/Scripts/MobFollow.gd b/Scripts/MobFollow.gd new file mode 100644 index 00000000..dd5b8f1e --- /dev/null +++ b/Scripts/MobFollow.gd @@ -0,0 +1,61 @@ +extends State +class_name MobFollow + + + +@export var nav_agent: NavigationAgent3D +@export var mob: CharacterBody3D +@export var mobCol: NodePath +@export var stats: NodePath +@export var pathfinding_timer: Timer + +var targeted_player + +@onready var target_location = mob.position + + +func Enter(): + print("Following the player") + pathfinding_timer.start() + makepath() + +func Exit(): + pathfinding_timer.stop() + +func Physics_Update(_delta: float): + var dir = mob.to_local(nav_agent.get_next_path_position()).normalized() + mob.velocity = dir * get_node(stats).current_move_speed + mob.move_and_slide() + + if !targeted_player: + return + var space_state = get_world_3d().direct_space_state + # TO-DO Change playerCol to group of players + var query = PhysicsRayQueryParameters3D.create(get_node(mobCol).global_position, targeted_player.global_position, int(pow(2, 1-1) + pow(2, 3-1)),[self]) + var result = space_state.intersect_ray(query) + + + if result: + + if result.collider.is_in_group("Players")&& Vector3(get_node(mobCol).global_position).distance_to(targeted_player.global_position) <= get_node(stats).melee_range / 2: + print("changing state to mobattack...") + Transistioned.emit(self, "mobattack") + + + + + if Vector3(mob.global_position).distance_to(target_location) <= 0.5: + Transistioned.emit(self, "mobidle") + + + +func makepath() -> void: + nav_agent.target_position = target_location +# print("From follow: ", target_location) + +func _on_timer_timeout(): + makepath() + +func _on_detection_player_spotted(player): + target_location = player.position + targeted_player = player diff --git a/Scripts/EnemyIdle.gd b/Scripts/MobIdle.gd similarity index 52% rename from Scripts/EnemyIdle.gd rename to Scripts/MobIdle.gd index b209e08f..dc1be9ad 100644 --- a/Scripts/EnemyIdle.gd +++ b/Scripts/MobIdle.gd @@ -1,11 +1,11 @@ extends State -class_name EnemyIdle +class_name MobIdle var idle_speed @export var nav_agent: NavigationAgent3D @export var stats: NodePath -@export var enemy: NodePath +@export var mob: NodePath @export var move_distance: float @export var moving_timer: Timer @@ -19,7 +19,7 @@ var rng = RandomNumberGenerator.new() func Enter(): - print("Enemy idle") + print("Mob idle") idle_speed = get_node(stats).idle_move_speed moving_timer.start() @@ -28,18 +28,18 @@ func Exit(): func Physics_Update(_delta: float): if is_looking_to_move: - var dir = get_node(enemy).to_local(nav_agent.get_next_path_position()).normalized() - get_node(enemy).velocity = dir * get_node(stats).current_idle_move_speed - get_node(enemy).move_and_slide() + var dir = get_node(mob).to_local(nav_agent.get_next_path_position()).normalized() + get_node(mob).velocity = dir * get_node(stats).current_idle_move_speed + get_node(mob).move_and_slide() - if Vector3(get_node(enemy).global_position).distance_to(target_location) <= 0.5: + if Vector3(get_node(mob).global_position).distance_to(target_location) <= 0.5: is_looking_to_move = false func _on_detection_player_spotted(_player): - Transistioned.emit(self, "enemyfollow") + Transistioned.emit(self, "mobfollow") func makepath() -> void: @@ -49,12 +49,12 @@ func makepath() -> void: func _on_moving_cooldown_timeout(): var space_state = get_world_3d().direct_space_state - var random_dir = Vector3(rng.randf_range(-1,1), get_node(enemy).global_position.y, rng.randf_range(-1, 1)) - var query = PhysicsRayQueryParameters3D.create(get_node(enemy).global_position, get_node(enemy).global_position + (random_dir * move_distance), int(pow(2, 1-1) + pow(2, 3-1)),[self]) + var random_dir = Vector3(rng.randf_range(-1,1), get_node(mob).global_position.y, rng.randf_range(-1, 1)) + var query = PhysicsRayQueryParameters3D.create(get_node(mob).global_position, get_node(mob).global_position + (random_dir * move_distance), int(pow(2, 1-1) + pow(2, 3-1)),[self]) var result = space_state.intersect_ray(query) if !result: is_looking_to_move = true - target_location = get_node(enemy).global_position + (random_dir * move_distance) + target_location = get_node(mob).global_position + (random_dir * move_distance) makepath() diff --git a/Scripts/EnemyStats.gd b/Scripts/MobStats.gd similarity index 100% rename from Scripts/EnemyStats.gd rename to Scripts/MobStats.gd From 6c7b0b7085bd4962c3cce386affa9954f60e1167 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 7 Jan 2024 20:18:01 +0100 Subject: [PATCH 060/138] Save and load mob and block rotation --- LevelGenerator.gd | 36 ++++++++++++----------- Scripts/Helper/save_helper.gd | 55 +++++++++++++++++++++-------------- level_generation.tscn | 6 ++-- 3 files changed, 55 insertions(+), 42 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 125acd49..8ad1cb59 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -11,7 +11,7 @@ var level_height : int = 32 @onready var defaultBlock: PackedScene = preload("res://Defaults/Blocks/default_block.tscn") @onready var defaultSlope: PackedScene = preload("res://Defaults/Blocks/default_slope.tscn") -@export var defaultEnemy: PackedScene +@export var defaultMob: PackedScene @export var defaultItem: PackedScene @export var level_manager : Node3D @export_file var default_level_json @@ -27,7 +27,7 @@ func generate_map(): map_save_folder = get_saved_map_folder() generate_level() # These two functions apply only to maps thet were previously saved in a save game - generate_enemies() + generate_mobs() generate_items() func get_saved_map_folder() -> String: @@ -40,20 +40,22 @@ func get_saved_map_folder() -> String: return target_folder return "" -func generate_enemies() -> void: +func generate_mobs() -> void: if map_save_folder == "": return - var enemiesArray = Helper.json_helper.load_json_array_file(map_save_folder + "/enemies.json") - for enemy: Dictionary in enemiesArray: - add_enemy_to_map.call_deferred(enemy) - -func add_enemy_to_map(enemy: Dictionary): - var newEnemy: CharacterBody3D = defaultEnemy.instantiate() - newEnemy.add_to_group("Enemies") - get_tree().get_root().add_child(newEnemy) - newEnemy.global_position.x = enemy.global_position_x - newEnemy.global_position.y = enemy.global_position_y - newEnemy.global_position.z = enemy.global_position_z + var mobsArray = Helper.json_helper.load_json_array_file(map_save_folder + "/mobs.json") + for mob: Dictionary in mobsArray: + add_mob_to_map.call_deferred(mob) + +func add_mob_to_map(mob: Dictionary) -> void: + var newMob: CharacterBody3D = defaultMob.instantiate() + newMob.add_to_group("mobs") + newMob.set_sprite(Gamedata.get_sprite_by_id(Gamedata.data.mobs,mob.id)) + get_tree().get_root().add_child(newMob) + newMob.global_position.x = mob.global_position_x + newMob.global_position.y = mob.global_position_y + newMob.global_position.z = mob.global_position_z + newMob.id = mob.id func generate_items() -> void: if map_save_folder == "": @@ -72,7 +74,7 @@ func add_item_to_map(item: Dictionary): # Generate the map layer by layer # For each layer, add all the blocks with proper rotation -# If a block has an enemy, add it too +# If a block has an mob, add it too func generate_level() -> void: var level_name: String = Helper.current_level_name var tileJSON: Dictionary = {} @@ -158,8 +160,8 @@ func apply_block_rotation(tileJSON: Dictionary, block: StaticBody3D): func add_block_mob(tileJSON: Dictionary, block: StaticBody3D): if tileJSON.has("mob"): - var newMob: CharacterBody3D = defaultEnemy.instantiate() - newMob.add_to_group("Enemies") + var newMob: CharacterBody3D = defaultMob.instantiate() + newMob.add_to_group("mobs") newMob.set_sprite(Gamedata.get_sprite_by_id(Gamedata.data.mobs,tileJSON.mob)) get_tree().get_root().add_child(newMob) newMob.global_position.x = block.global_position.x diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 80c2b1c7..a4c5d5dd 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -3,8 +3,8 @@ extends Node #This script is loaded in to the helper.gd autoload singleton #It can be accessed trough helper.save_helper #This scipt provides functions to help transitioning between levels -#It has functions to save the current level and the location of items, enemies and tiles -#It also has functions to load saved data and place the items, enemies and tiles on the map +#It has functions to save the current level and the location of items, mobs and tiles +#It also has functions to load saved data and place the items, mobs and tiles on the map var current_save_folder: String = "" @@ -19,7 +19,7 @@ func save_current_level(global_pos: Vector2) -> void: return save_map_data(target_folder) - save_enemy_data(target_folder) + save_mob_data(target_folder) save_item_data(target_folder) #Creates a new save folder. The name of this folder will be the current date and time @@ -36,25 +36,26 @@ func create_new_save(): else: print_debug("Failed to create a unique folder for the demo.") -#Save the type and position of all enemies on the map -func save_enemy_data(target_folder: String) -> void: - var enemyData: Array = [] - var defaultEnemy: Dictionary = {"enemyid": "enemy1", \ +#Save the type and position of all mobs on the map +func save_mob_data(target_folder: String) -> void: + var mobData: Array = [] + var defaultMob: Dictionary = {"id": "scrapwalker", \ "global_position_x": 0, "global_position_y": 0, "global_position_z": 0} - var mapEnemies = get_tree().get_nodes_in_group("Enemies") - var newEnemyData: Dictionary - for enemy in mapEnemies: - enemy.remove_from_group("Enemies") - newEnemyData = defaultEnemy.duplicate() - newEnemyData["global_position_x"] = enemy.global_position.x - newEnemyData["global_position_y"] = enemy.global_position.y - newEnemyData["global_position_z"] = enemy.global_position.z - enemyData.append(newEnemyData.duplicate()) - enemy.queue_free() - Helper.json_helper.write_json_file(target_folder + "/enemies.json",\ - JSON.stringify(enemyData)) + var mapMobs = get_tree().get_nodes_in_group("mobs") + var newMobData: Dictionary + for mob in mapMobs: + mob.remove_from_group("mobs") + newMobData = defaultMob.duplicate() + newMobData["global_position_x"] = mob.global_position.x + newMobData["global_position_y"] = mob.global_position.y + newMobData["global_position_z"] = mob.global_position.z + newMobData["id"] = mob.id + mobData.append(newMobData.duplicate()) + mob.queue_free() + Helper.json_helper.write_json_file(target_folder + "/mobs.json",\ + JSON.stringify(mobData)) -#Save the type and position of all enemies on the map +#Save the type and position of all mobs on the map func save_item_data(target_folder: String) -> void: var itemData: Array = [] var defaultitem: Dictionary = {"itemid": "item1", \ @@ -94,7 +95,6 @@ func save_map_data(target_folder: String) -> void: var block: StaticBody3D var current_block: int = 0 var level_y: int = 0 - var textureName: String = "" var level_block_count: int = 0 for level: Node3D in mapLevels: #The level will be destroyed after saving so we remove them from the group @@ -111,8 +111,19 @@ func save_map_data(target_folder: String) -> void: for w in level_width: block = level.get_child(current_block) if block.global_position.z == h and block.global_position.x == w: + + # if the rotation is 90 it is facing north + # In that case we subtract 90 so it is saved as 0 + # If the rotation is 0 it is facing east + # In that case we add 90, the same for 90 and 180 degrees + var blockRotation: int = block.rotation_degrees.y + var myRotation: int + if blockRotation == 90: + myRotation = blockRotation-90 + else: + myRotation = blockRotation+90 mapData.levels[level_y].append({ "id": block.id,\ - "rotation": block.rotation_degrees.y }) + "rotation": myRotation }) if current_block < level_block_count-1: current_block += 1 else: diff --git a/level_generation.tscn b/level_generation.tscn index 8c6d3887..050cda02 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -2,13 +2,13 @@ [ext_resource type="Script" path="res://LevelGenerator.gd" id="1_i8qa4"] [ext_resource type="Script" path="res://LevelManager.gd" id="2_gm6x7"] -[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/enemy_corpse.tscn" id="3_l8ooc"] +[ext_resource type="PackedScene" uid="uid://b2r6nh12wv41k" path="res://Defaults/Mobs/mob.tscn" id="2_jhj6h"] +[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/mob_corpse.tscn" id="3_l8ooc"] [ext_resource type="Script" path="res://Scripts/BuildManager.gd" id="6_y7rk5"] [ext_resource type="Script" path="res://Scripts/player.gd" id="8_gposs"] [ext_resource type="Script" path="res://Scripts/Camera.gd" id="9_gi6l6"] [ext_resource type="Texture2D" uid="uid://8uwpq1ai8qi4" path="res://Textures/survivor.png" id="10_alql8"] [ext_resource type="Script" path="res://Scripts/PlayerShooting.gd" id="11_6i2sa"] -[ext_resource type="PackedScene" uid="uid://b2r6nh12wv41k" path="res://Defaults/Mobs/enemy.tscn" id="11_tj1r0"] [ext_resource type="PackedScene" uid="uid://doyjc25kl7104" path="res://bullet_line.tscn" id="12_dip38"] [ext_resource type="AudioStream" uid="uid://gdwwxc0yvg5g" path="res://Sounds/Weapons/Shooting/pistol_shot.wav" id="13_fjasp"] [ext_resource type="AudioStream" uid="uid://cfmgnsm10aj4i" path="res://Sounds/Weapons/Reloading/pistol_reload_sound.mp3" id="14_x756n"] @@ -64,7 +64,7 @@ radius = 1.5 [node name="LevelGenerator" type="Node3D" parent="TacticalMap" node_paths=PackedStringArray("level_manager") groups=["level_generator"]] script = ExtResource("1_i8qa4") -defaultEnemy = ExtResource("11_tj1r0") +defaultMob = ExtResource("2_jhj6h") defaultItem = ExtResource("3_l8ooc") level_manager = NodePath("../NavigationRegion3D/LevelManager") default_level_json = "res://Mods/Core/Maps/Generichouse.json" From 9e84a848c8b4389a6cbd12f12ebbc103949a049b Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 8 Jan 2024 21:00:33 +0100 Subject: [PATCH 061/138] Fix save initialization --- LevelGenerator.gd | 11 +---------- Mods/Core/Maps/Generichouse.json | 2 ++ Scripts/Helper.gd | 6 ++++-- Scripts/Helper/save_helper.gd | 18 ++++++++++++++++++ scene_selector.tscn | 6 +----- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 8ad1cb59..235c458d 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -24,21 +24,12 @@ func _ready(): $"../NavigationRegion3D".bake_navigation_mesh() func generate_map(): - map_save_folder = get_saved_map_folder() + map_save_folder = Helper.save_helper.get_saved_map_folder(Helper.current_level_pos) generate_level() # These two functions apply only to maps thet were previously saved in a save game generate_mobs() generate_items() -func get_saved_map_folder() -> String: - var level_pos: Vector2 = Helper.current_level_pos - var current_save_folder: String = Helper.save_helper.current_save_folder - var dir = DirAccess.open(current_save_folder) - var map_folder = "map_x" + str(level_pos.x) + "_y" + str(level_pos.y) - var target_folder = current_save_folder+ "/" + map_folder - if dir.dir_exists(map_folder): - return target_folder - return "" func generate_mobs() -> void: if map_save_folder == "": diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index c4f9a45e..97934407 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -5079,6 +5079,7 @@ }, { "id": "grass_plain_01", + "mob": "scrapwalker", "rotation": 0 }, { @@ -5339,6 +5340,7 @@ }, { "id": "grass_plain_01", + "mob": "scrapwalker", "rotation": 0 }, { diff --git a/Scripts/Helper.gd b/Scripts/Helper.gd index b069982f..7c690407 100644 --- a/Scripts/Helper.gd +++ b/Scripts/Helper.gd @@ -2,7 +2,7 @@ extends Node3D var current_level_name : String var chunks: Dictionary = {} #Stores references to tilegrids representing the overmap -var current_level_pos: Vector2 = Vector2(0,0) +var current_level_pos: Vector2 = Vector2(0.1,0.1) var current_map_seed: int = 0 const json_Helper_Class = preload("res://Scripts/Helper/json_helper.gd") var json_helper: Node = null @@ -20,7 +20,9 @@ func _ready(): #see overmap.gd for how global_pos is used there func switch_level(level_name: String, global_pos: Vector2) -> void: current_level_name = level_name - if current_level_pos != Vector2(0,0): + # This is only true if the game has just initialized + # In that case no level has once been loaded so there is no game to save + if current_level_pos != Vector2(0.1,0.1): save_helper.save_current_level(current_level_pos) current_level_pos = global_pos get_tree().change_scene_to_file("res://level_generation.tscn") diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index a4c5d5dd..7377475e 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -130,3 +130,21 @@ func save_map_data(target_folder: String) -> void: mapData.levels[level_y].append({}) #Overwrite the file if it exists and otherwise create it Helper.json_helper.write_json_file(target_folder + "/map.json", JSON.stringify(mapData)) + + +# This function determines the saved map folder path for the current level. +# It constructs this path using the current level's position and the current +# save folder's path. If the map folder for the level exists, it returns +# the full path to this folder; otherwise, it returns an empty string. +# The current_save_folder is determined when the game is first started +# and does not change unless the user start a new game. +func get_saved_map_folder(level_pos: Vector2) -> String: + var current_save_folder: String = Helper.save_helper.current_save_folder + var dir = DirAccess.open(current_save_folder) + var map_folder = "map_x" + str(level_pos.x) + "_y" + str(level_pos.y) + var target_folder = current_save_folder+ "/" + map_folder + # For example, the target_folder could be: "C:\Users\User\AppData\Roaming\Godot\app_userdata\ + # CataX\save\2024-01-08T202236\map_x0_y0" + if dir.dir_exists(map_folder): + return target_folder + return "" diff --git a/scene_selector.tscn b/scene_selector.tscn index dcc195db..a6b407ef 100644 --- a/scene_selector.tscn +++ b/scene_selector.tscn @@ -1,9 +1,7 @@ -[gd_scene load_steps=5 format=3 uid="uid://bhqlst5h43xwm"] +[gd_scene load_steps=3 format=3 uid="uid://bhqlst5h43xwm"] [ext_resource type="Script" path="res://Scripts/scene_selector.gd" id="1_a5yxj"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="1_sue5h"] -[ext_resource type="PackedScene" uid="uid://dddjfurdx4wcs" path="res://documentation.tscn" id="2_mdmxg"] -[ext_resource type="PackedScene" uid="uid://buahqv18qlohm" path="res://Scenes/ContentManager/contentmanager.tscn" id="3_4iq2k"] [node name="SceneSelector" type="Control" node_paths=PackedStringArray("option_levels")] layout_mode = 3 @@ -14,8 +12,6 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_a5yxj") option_levels = NodePath("OptionButton") -documentation_menu = ExtResource("2_mdmxg") -content_manager_menu = ExtResource("3_4iq2k") [node name="PlayDemo" type="Button" parent="."] layout_mode = 1 From 653c517ce080fda10039c0c907d6bd31c18f56a5 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 8 Jan 2024 22:36:24 +0100 Subject: [PATCH 062/138] Fix overmap coordinates Tile overmap coordinates are now consistent Added a home button to return to 0,0 --- Scenes/Overmap/Overmap.tscn | 5 +++ Scenes/Overmap/Scripts/Overmap.gd | 64 ++++++++++++++++++++++++++----- 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/Scenes/Overmap/Overmap.tscn b/Scenes/Overmap/Overmap.tscn index 5c8f4fd1..92f42054 100644 --- a/Scenes/Overmap/Overmap.tscn +++ b/Scenes/Overmap/Overmap.tscn @@ -70,4 +70,9 @@ vertical_alignment = 1 layout_mode = 2 text = "Travel to location" +[node name="HomeButton" type="Button" parent="MarginContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Home" + [connection signal="button_up" from="MarginContainer/HBoxContainer/VBoxContainer/TravelButton" to="." method="_on_travel_button_button_up"] +[connection signal="button_up" from="MarginContainer/HBoxContainer/VBoxContainer/HomeButton" to="." method="_on_home_button_button_up"] diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index 9a5aa8c2..5b47a004 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -65,8 +65,11 @@ func update_chunks(): # After generating new chunks, you may want to unload any that are off-screen. unload_chunks() - -func generate_chunk(grid_position: Vector2): +# This function creates terrain for a specific area on the overmap. It uses a grid_position +# to determine where to generate the terrain. The function employs a noise algorithm +# to select tile types from a predefined list, creating a chunk of terrain data. +# This data is stored in a global dictionary for later use in rendering the overmap. +func generate_chunk(grid_position: Vector2) -> void: var chunk = [] for y in range(chunk_size): # x goes from 0 to chunk_size - 1 for x in range(chunk_size): # y goes from 0 to chunk_size - 1 @@ -78,8 +81,12 @@ func generate_chunk(grid_position: Vector2): # Scale noise_value to a valid index in the tiles array # Ensure noise_value is scaled correctly based on the number of tiles. var tile_index = int((noise_value + 1) / 2 * tiles.size()) % tiles.size() - chunk.append({"tile": tiles[tile_index], "tacticalmap":\ - get_random_mapname_1_in_100()}) + if global_x == 0 and global_y == 0: + chunk.append({"tile": tiles[tile_index], "global_x": global_x, \ + "global_y": global_y, "tacticalmap": Gamedata.data.maps.data[0]}) + else: + chunk.append({"tile": tiles[tile_index], "global_x": global_x, \ + "global_y": global_y, "tacticalmap": get_random_mapname_1_in_100()}) # Store the chunk using the grid_position as the key. Helper.chunks[grid_position] = chunk @@ -112,7 +119,8 @@ func unload_chunks(): var mouse_button_pressed: bool = false -#We will emit this signal when the position_coords change +# We will emit this signal when the position_coords change +# Which happens when the user has panned the overmap signal position_coord_changed(delta) func _input(event): if !visible: @@ -153,8 +161,17 @@ func on_position_coord_changed(delta): update_chunks() if positionLabel: positionLabel.text = "Position: " + str(position_coord) - - + +# This function creates and populates a GridContainer with tiles based on chunk data. +# It takes two arguments: chunk, an array containing data for each tile in the chunk, +# and chunk_position, a Vector2 representing the chunk's position in the world. +# The function generates a new GridContainer, sets its columns to chunk_width, and +# ensures no space between tiles. It then iterates over the chunk array, creating +# a tile for each entry. Each tile's metadata is set with global and local positions, +# and additional data like map files if available. Tiles are added as children to +# the GridContainer, which is positioned based on chunk_position. The function returns +# the populated GridContainer. This process visually represents a section of the +# overmap in a grid format. func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): var grid_container = GridContainer.new() grid_container.columns = chunk_width # Set the number of columns to chunk_width. @@ -178,14 +195,18 @@ func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): var tile = overmapTile.instantiate() var local_x = column*tile_size var local_y = row*tile_size - var global_x = chunk_position.x + local_x - var global_y = chunk_position.y + local_y + var global_x = chunk[i].global_x + var global_y = chunk[i].global_y # Assign the tile's row and column information tile.set_meta("global_pos", Vector2(global_x,global_y)) tile.set_meta("local_pos", Vector2(local_x,local_y)) if chunk[i].tacticalmap != "": tile.set_meta("map_file", chunk[i].tacticalmap) # Set the metadata of the tile tile.set_color(Color(1, 0.8, 0.8)) # Make the tile slightly red + + if global_x == 0 and global_y == 0: + tile.set_color(Color(0.3, 0.3, 1)) # blue color + tile.set_texture(texture) tile.connect("tile_clicked", _on_tile_clicked) # Add the tile as a child to the grid container @@ -227,3 +248,28 @@ func _on_travel_button_button_up(): var mapFile = selected_overmap_tile.get_meta("map_file") var global_pos: Vector2 = selected_overmap_tile.get_meta("global_pos") Helper.switch_level(mapFile, global_pos) + + +func _on_home_button_button_up(): + # Calculate the screen center offset + var screen_center_offset = get_viewport_rect().size * 0.5 + + # Convert screen center offset to world coordinates based on the tile size + var halfTileSize = tile_size/12 + var world_center_offset = screen_center_offset / halfTileSize + + # Calculate the new position as the negative of the world center offset + var new_position_coord = -world_center_offset + + # Calculate the delta for moving the tiles + var delta = new_position_coord - position_coord + + # Update position_coord to the new position + position_coord = new_position_coord + + # Emit the signal to update the overmap's position and tiles + emit_signal("position_coord_changed", delta) + + # Optionally, update the position label if it exists + if positionLabel: + positionLabel.text = "Position: (0, 0)" From f3378495e8fc2415135860a22318b3a162d5d509 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 9 Jan 2024 22:01:53 +0100 Subject: [PATCH 063/138] Rename level select to load game --- Scripts/scene_selector.gd | 19 +++++++++---------- scene_selector.tscn | 11 +++++------ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index 5e727553..2c4a20b4 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -1,7 +1,7 @@ extends Control var level_files : Array -@export var option_levels : OptionButton +@export var load_game_list : OptionButton # Called when the node enters the scene tree for the first time. @@ -9,9 +9,9 @@ func _ready(): dir_contents("./Mods/Core/Maps/") for level_file in level_files: - option_levels.add_item(level_file) - - + load_game_list.add_item(level_file) + + func dir_contents(path): var dir = DirAccess.open(path) if dir: @@ -29,12 +29,12 @@ func dir_contents(path): func _on_view_level_pressed(): - Helper.switch_level(level_files[option_levels.get_selected_id()],Vector2(0,0)) + Helper.switch_level(level_files[load_game_list.get_selected_id()],Vector2(0,0)) -#When the play demo button is pressed -#Create a new folder in the user directory -#The name of the folder should be the current date and time so it's unique -#This unique folder will contain save data for this game and can be loaded later +# When the play demo button is pressed +# Create a new folder in the user directory +# The name of the folder should be the current date and time so it's unique +# This unique folder will contain save data for this game and can be loaded later func _on_play_demo_pressed(): Helper.save_helper.create_new_save() Helper.switch_level("Generichouse.json", Vector2(0, 0)) @@ -42,6 +42,5 @@ func _on_play_demo_pressed(): func _on_help_button_pressed(): get_tree().change_scene_to_file("res://documentation.tscn") - func _on_content_manager_button_button_up(): get_tree().change_scene_to_file("res://Scenes/ContentManager/contentmanager.tscn") diff --git a/scene_selector.tscn b/scene_selector.tscn index a6b407ef..1e3a9b4a 100644 --- a/scene_selector.tscn +++ b/scene_selector.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://Scripts/scene_selector.gd" id="1_a5yxj"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="1_sue5h"] -[node name="SceneSelector" type="Control" node_paths=PackedStringArray("option_levels")] +[node name="SceneSelector" type="Control"] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -11,7 +11,6 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_a5yxj") -option_levels = NodePath("OptionButton") [node name="PlayDemo" type="Button" parent="."] layout_mode = 1 @@ -23,16 +22,16 @@ theme_override_fonts/font = ExtResource("1_sue5h") theme_override_font_sizes/font_size = 60 text = "Play demo" -[node name="ViewLevel" type="Button" parent="."] +[node name="LoadGameButton" type="Button" parent="."] layout_mode = 1 offset_top = 378.0 offset_right = 453.0 offset_bottom = 457.0 theme_override_fonts/font = ExtResource("1_sue5h") theme_override_font_sizes/font_size = 25 -text = "View selected level ---->>>" +text = "Load game ---->>>" -[node name="OptionButton" type="OptionButton" parent="."] +[node name="LoadGameList" type="OptionButton" parent="."] layout_mode = 1 offset_left = 477.0 offset_top = 378.0 @@ -58,6 +57,6 @@ theme_override_font_sizes/font_size = 25 text = "Content Manager" [connection signal="pressed" from="PlayDemo" to="." method="_on_play_demo_pressed"] -[connection signal="pressed" from="ViewLevel" to="." method="_on_view_level_pressed"] +[connection signal="pressed" from="LoadGameButton" to="." method="_on_view_level_pressed"] [connection signal="pressed" from="HelpButton" to="." method="_on_help_button_pressed"] [connection signal="button_up" from="ContentManagerButton" to="." method="_on_content_manager_button_button_up"] From c68672d06355dc844dbc5fb6345c379355a277ca Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 9 Jan 2024 22:07:24 +0100 Subject: [PATCH 064/138] Change the load maps function --- Scripts/scene_selector.gd | 20 +------------------- scene_selector.tscn | 3 ++- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index 2c4a20b4..44640947 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -6,28 +6,10 @@ var level_files : Array # Called when the node enters the scene tree for the first time. func _ready(): - dir_contents("./Mods/Core/Maps/") - + level_files = Helper.json_helper.file_names_in_dir("./Mods/Core/Maps/") for level_file in level_files: load_game_list.add_item(level_file) - -func dir_contents(path): - var dir = DirAccess.open(path) - if dir: - dir.list_dir_begin() - var file_name = dir.get_next() - while file_name != "": - if dir.current_is_dir(): - print("Found directory: " + file_name) - else: - print("Found file: " + file_name) - level_files.append(file_name) - file_name = dir.get_next() - else: - print("An error occurred when trying to access the path.") - - func _on_view_level_pressed(): Helper.switch_level(level_files[load_game_list.get_selected_id()],Vector2(0,0)) diff --git a/scene_selector.tscn b/scene_selector.tscn index 1e3a9b4a..ca5e94cd 100644 --- a/scene_selector.tscn +++ b/scene_selector.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://Scripts/scene_selector.gd" id="1_a5yxj"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="1_sue5h"] -[node name="SceneSelector" type="Control"] +[node name="SceneSelector" type="Control" node_paths=PackedStringArray("load_game_list")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -11,6 +11,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_a5yxj") +load_game_list = NodePath("LoadGameList") [node name="PlayDemo" type="Button" parent="."] layout_mode = 1 From b745a2ebd956bcd1f3c439e402368366b1af420e Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 9 Jan 2024 22:38:44 +0100 Subject: [PATCH 065/138] Add load game function --- Scripts/Helper/json_helper.gd | 17 +++++++++++++++++ Scripts/Helper/save_helper.gd | 9 ++++++++- Scripts/scene_selector.gd | 16 +++++++++------- scene_selector.tscn | 2 +- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/Scripts/Helper/json_helper.gd b/Scripts/Helper/json_helper.gd index c3dda655..380b131b 100644 --- a/Scripts/Helper/json_helper.gd +++ b/Scripts/Helper/json_helper.gd @@ -63,6 +63,23 @@ func file_names_in_dir(dirName: String, extensionFilter: Array = []) -> Array: return fileNames +# This function lists all the files in a specified directory. +# it takes ne argument: `dirName` (the path of the directory +# to list folders from) +func folder_names_in_dir(path: String) -> Array: + var dirs: Array = [] + var dir = DirAccess.open(path) + if dir: + dir.list_dir_begin() + var folder_name = dir.get_next() + while folder_name != "": + if dir.current_is_dir(): + dirs.append(folder_name) + folder_name = dir.get_next() + else: + print("An error occurred when trying to access the path.") + return dirs + #This function takes a json string and saves it as a json file. func write_json_file(path: String, json: String): # Save the JSON string to the selected file location diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 7377475e..cf5c7d0a 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -1,7 +1,7 @@ extends Node #This script is loaded in to the helper.gd autoload singleton -#It can be accessed trough helper.save_helper +#It can be accessed trough Helper.save_helper #This scipt provides functions to help transitioning between levels #It has functions to save the current level and the location of items, mobs and tiles #It also has functions to load saved data and place the items, mobs and tiles on the map @@ -148,3 +148,10 @@ func get_saved_map_folder(level_pos: Vector2) -> String: if dir.dir_exists(map_folder): return target_folder return "" + +# Function to load game.json from a given saved game folder +func load_game_from_folder(save_folder_name: String) -> Dictionary: + current_save_folder = "user://save/" + save_folder_name + var game_data_path = current_save_folder + "/game.json" + var gameJSON: Dictionary = Helper.json_helper.load_json_dictionary_file(game_data_path) + return gameJSON diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index 44640947..8f6c5f2c 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -1,17 +1,19 @@ extends Control -var level_files : Array +var saved_game_folders : Array @export var load_game_list : OptionButton - # Called when the node enters the scene tree for the first time. func _ready(): - level_files = Helper.json_helper.file_names_in_dir("./Mods/Core/Maps/") - for level_file in level_files: - load_game_list.add_item(level_file) + saved_game_folders = Helper.json_helper.folder_names_in_dir("user://save/") + for saved_game in saved_game_folders: + load_game_list.add_item(saved_game) -func _on_view_level_pressed(): - Helper.switch_level(level_files[load_game_list.get_selected_id()],Vector2(0,0)) +func _on_load_game_button_pressed(): + #Helper.switch_level(level_files[load_game_list.get_selected_id()],Vector2(0,0)) + var selected_game_folder = saved_game_folders[load_game_list.get_selected_id()] + # Here you can call the function to load the game using the selected folder + # Example: Helper.load_game(selected_game_folder) # When the play demo button is pressed # Create a new folder in the user directory diff --git a/scene_selector.tscn b/scene_selector.tscn index ca5e94cd..c18c0f62 100644 --- a/scene_selector.tscn +++ b/scene_selector.tscn @@ -58,6 +58,6 @@ theme_override_font_sizes/font_size = 25 text = "Content Manager" [connection signal="pressed" from="PlayDemo" to="." method="_on_play_demo_pressed"] -[connection signal="pressed" from="LoadGameButton" to="." method="_on_view_level_pressed"] +[connection signal="pressed" from="LoadGameButton" to="." method="_on_load_game_button_pressed"] [connection signal="pressed" from="HelpButton" to="." method="_on_help_button_pressed"] [connection signal="button_up" from="ContentManagerButton" to="." method="_on_content_manager_button_button_up"] From faab8761512ee889a89a5cc911e7fbcf070afb39 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 9 Jan 2024 22:50:07 +0100 Subject: [PATCH 066/138] Initial load game implementation --- Scripts/scene_selector.gd | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index 8f6c5f2c..a56da4b7 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -10,10 +10,12 @@ func _ready(): load_game_list.add_item(saved_game) func _on_load_game_button_pressed(): - #Helper.switch_level(level_files[load_game_list.get_selected_id()],Vector2(0,0)) var selected_game_folder = saved_game_folders[load_game_list.get_selected_id()] - # Here you can call the function to load the game using the selected folder - # Example: Helper.load_game(selected_game_folder) + Helper.save_helper.load_game_from_folder(selected_game_folder) + # We pass the name of the default map and coordinates + # If there is a saved game, it will not load the provided map + # but rather the one that was saved in the game that was loaded + Helper.switch_level("Generichouse.json", Vector2(0, 0)) # When the play demo button is pressed # Create a new folder in the user directory From 517e484dceba0d823bcd564363ed188fb7b8a2b5 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 9 Jan 2024 23:36:41 +0100 Subject: [PATCH 067/138] Save the overmap too --- Scenes/Overmap/Scripts/Overmap.gd | 23 +++++++++--------- Scripts/Helper.gd | 6 ++++- Scripts/Helper/save_helper.gd | 39 +++++++++++++++++++++++++++---- Scripts/scene_selector.gd | 1 + 4 files changed, 52 insertions(+), 17 deletions(-) diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index 5b47a004..08734cfd 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -5,7 +5,6 @@ extends Control @export var overmapTile: PackedScene = null @export var travelButton: Button = null @export var overmapTileLabel: Label = null -var position_coord: Vector2 = Vector2(0, 0) var last_position_coord: Vector2 = Vector2() var tiles: Array = ["1.png", "arcstones1.png", "forestunderbrushscale5.png", "rockyfloor4.png"] var noise = FastNoiseLite.new() @@ -37,7 +36,7 @@ func _ready(): # and `position_coord` is the current position in the world func update_chunks(): # Convert the current position to grid coordinates based on the grid's pixel size - var grid_position = (position_coord / grid_pixel_size).floor() * grid_pixel_size + var grid_position = (Helper.position_coord / grid_pixel_size).floor() * grid_pixel_size #The position is increase arbitrarily so it is more center of screen grid_position.x += grid_pixel_size grid_position.y += grid_pixel_size @@ -53,8 +52,8 @@ func update_chunks(): if not grid_chunks.has(chunk_grid_position): # Use chunk data to create and fill the GridContainer. - var localized_x: float = chunk_grid_position.x-position_coord.x - var localized_y: float = chunk_grid_position.y-position_coord.y + var localized_x: float = chunk_grid_position.x-Helper.position_coord.x + var localized_y: float = chunk_grid_position.y-Helper.position_coord.y var new_grid_container = create_and_fill_grid_container(chunk_data,\ Vector2(localized_x,localized_y)) tilesContainer.call_deferred("add_child",new_grid_container) @@ -107,7 +106,7 @@ func unload_chunks(): var dist = 0 var rangeLimit = 0 for chunk_position in grid_chunks.keys(): - dist = chunk_position.distance_to(position_coord) + dist = chunk_position.distance_to(Helper.position_coord) #Lowering this number 5 will cause newly created chunks #to be instantly deleted and recreated rangeLimit = 3 * grid_pixel_size @@ -134,18 +133,18 @@ func _input(event): # Adjust the position based on the mouse movement, divided by 100 for sensitivity. var motion = event.relative / 2 # Calculate the new position first. - var new_position_coord = position_coord - motion + var new_position_coord = Helper.position_coord - motion # Round the new_position_coord to the nearest integer. new_position_coord = new_position_coord.round() # Calculate the delta based on the old and the rounded new positions. - var delta = new_position_coord - position_coord + var delta = new_position_coord - Helper.position_coord if delta != Vector2.ZERO: # Update position_coord to the new rounded position. - position_coord = new_position_coord + Helper.position_coord = new_position_coord # Emit the signal to update other parts of the game that depend on the position. emit_signal("position_coord_changed", delta) # Update last_position_coord for the next input event. - last_position_coord = position_coord + last_position_coord = Helper.position_coord #This function will move all the tilegrids on screen when the position_coords change @@ -160,7 +159,7 @@ func on_position_coord_changed(delta): update_tiles_position(delta) update_chunks() if positionLabel: - positionLabel.text = "Position: " + str(position_coord) + positionLabel.text = "Position: " + str(Helper.position_coord) # This function creates and populates a GridContainer with tiles based on chunk data. # It takes two arguments: chunk, an array containing data for each tile in the chunk, @@ -262,10 +261,10 @@ func _on_home_button_button_up(): var new_position_coord = -world_center_offset # Calculate the delta for moving the tiles - var delta = new_position_coord - position_coord + var delta = new_position_coord - Helper.position_coord # Update position_coord to the new position - position_coord = new_position_coord + Helper.position_coord = new_position_coord # Emit the signal to update the overmap's position and tiles emit_signal("position_coord_changed", delta) diff --git a/Scripts/Helper.gd b/Scripts/Helper.gd index 7c690407..0a2bae1b 100644 --- a/Scripts/Helper.gd +++ b/Scripts/Helper.gd @@ -1,9 +1,13 @@ extends Node3D var current_level_name : String +# Overmap data var chunks: Dictionary = {} #Stores references to tilegrids representing the overmap var current_level_pos: Vector2 = Vector2(0.1,0.1) var current_map_seed: int = 0 +var position_coord: Vector2 = Vector2(0, 0) + +# Helper scripts const json_Helper_Class = preload("res://Scripts/Helper/json_helper.gd") var json_helper: Node = null const save_Helper_Class = preload("res://Scripts/Helper/save_helper.gd") @@ -24,9 +28,9 @@ func switch_level(level_name: String, global_pos: Vector2) -> void: # In that case no level has once been loaded so there is no game to save if current_level_pos != Vector2(0.1,0.1): save_helper.save_current_level(current_level_pos) + save_helper.save_overmap_state() current_level_pos = global_pos get_tree().change_scene_to_file("res://level_generation.tscn") - func line(pos1: Vector3, pos2: Vector3, color = Color.WHITE_SMOKE) -> MeshInstance3D: var mesh_instance := MeshInstance3D.new() diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index cf5c7d0a..e01df14d 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -150,8 +150,39 @@ func get_saved_map_folder(level_pos: Vector2) -> String: return "" # Function to load game.json from a given saved game folder -func load_game_from_folder(save_folder_name: String) -> Dictionary: +func load_game_from_folder(save_folder_name: String) -> void: current_save_folder = "user://save/" + save_folder_name - var game_data_path = current_save_folder + "/game.json" - var gameJSON: Dictionary = Helper.json_helper.load_json_dictionary_file(game_data_path) - return gameJSON + +# Function to save the current state of the overmap +func save_overmap_state() -> void: + # Prepare the path for the save file + var save_path = Helper.save_helper.current_save_folder + "/overmap_state.json" + # Prepare the data structure to save + var save_data: Dictionary = { + "position_coord_x": Helper.position_coord.x, + "position_coord_y": Helper.position_coord.y, + "chunk_data": Helper.chunks + } + Helper.json_helper.write_json_file(save_path, JSON.stringify(save_data)) + +# Function to load the saved state of the overmap +func load_overmap_state() -> void: + var overmap_path: String = current_save_folder + "/overmap_state.json" + var overmap_state_data: Dictionary = Helper.json_helper.load_json_dictionary_file(overmap_path) + + # Load the overmap data + if overmap_state_data: + # Retrieve the saved position coordinate + var saved_position_coord_x: int = overmap_state_data.get("position_coord_x", 0) + var saved_position_coord_y: int = overmap_state_data.get("position_coord_y", 0) + # Retrieve the saved chunk data + var saved_chunk_data: Dictionary = overmap_state_data.get("chunk_data", {}) + + # Apply the saved data to the overmap + Helper.position_coord.x = saved_position_coord_x + Helper.position_coord.y = saved_position_coord_y + Helper.chunks = saved_chunk_data + + print("Overmap state loaded from: ", overmap_path) + else: + print("Failed to parse overmap state file: ", overmap_path) diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index a56da4b7..87bab474 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -12,6 +12,7 @@ func _ready(): func _on_load_game_button_pressed(): var selected_game_folder = saved_game_folders[load_game_list.get_selected_id()] Helper.save_helper.load_game_from_folder(selected_game_folder) + Helper.save_helper.load_overmap_state() # We pass the name of the default map and coordinates # If there is a saved game, it will not load the provided map # but rather the one that was saved in the game that was loaded From b17d3612a47c71e274a8232505567bd98a049be7 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 10 Jan 2024 02:00:44 +0100 Subject: [PATCH 068/138] Properly save overmap --- Scenes/Overmap/Scripts/Overmap.gd | 4 +-- Scripts/Helper/save_helper.gd | 44 +++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index 08734cfd..5ae777fa 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -36,14 +36,14 @@ func _ready(): # and `position_coord` is the current position in the world func update_chunks(): # Convert the current position to grid coordinates based on the grid's pixel size - var grid_position = (Helper.position_coord / grid_pixel_size).floor() * grid_pixel_size + var grid_position: Vector2 = (Helper.position_coord / grid_pixel_size).floor() * grid_pixel_size #The position is increase arbitrarily so it is more center of screen grid_position.x += grid_pixel_size grid_position.y += grid_pixel_size for x in range(-1, 1): for y in range(-1, 1): - var chunk_grid_position = grid_position + Vector2(x, y) * grid_pixel_size + var chunk_grid_position: Vector2 = grid_position + Vector2(x, y) * grid_pixel_size # Use the separate noise_chunks Dictionary for retrieving the noise data if not Helper.chunks.has(chunk_grid_position): generate_chunk(chunk_grid_position) diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index e01df14d..907de5ba 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -149,39 +149,39 @@ func get_saved_map_folder(level_pos: Vector2) -> String: return target_folder return "" -# Function to load game.json from a given saved game folder -func load_game_from_folder(save_folder_name: String) -> void: - current_save_folder = "user://save/" + save_folder_name - -# Function to save the current state of the overmap + # Function to save the current state of the overmap func save_overmap_state() -> void: - # Prepare the path for the save file - var save_path = Helper.save_helper.current_save_folder + "/overmap_state.json" - # Prepare the data structure to save + var save_path = current_save_folder + "/overmap_state.json" var save_data: Dictionary = { "position_coord_x": Helper.position_coord.x, "position_coord_y": Helper.position_coord.y, - "chunk_data": Helper.chunks + "chunk_data": {} } + + # Convert Vector2 keys to strings + for key in Helper.chunks: + var key_str = str(key.x) + "," + str(key.y) + save_data["chunk_data"][key_str] = Helper.chunks[key] + Helper.json_helper.write_json_file(save_path, JSON.stringify(save_data)) # Function to load the saved state of the overmap func load_overmap_state() -> void: - var overmap_path: String = current_save_folder + "/overmap_state.json" - var overmap_state_data: Dictionary = Helper.json_helper.load_json_dictionary_file(overmap_path) + var overmap_path = current_save_folder + "/overmap_state.json" + var overmap_state_data = Helper.json_helper.load_json_dictionary_file(overmap_path) - # Load the overmap data if overmap_state_data: - # Retrieve the saved position coordinate - var saved_position_coord_x: int = overmap_state_data.get("position_coord_x", 0) - var saved_position_coord_y: int = overmap_state_data.get("position_coord_y", 0) - # Retrieve the saved chunk data - var saved_chunk_data: Dictionary = overmap_state_data.get("chunk_data", {}) - - # Apply the saved data to the overmap - Helper.position_coord.x = saved_position_coord_x - Helper.position_coord.y = saved_position_coord_y - Helper.chunks = saved_chunk_data + Helper.position_coord = Vector2(overmap_state_data["position_coord_x"],\ + overmap_state_data["position_coord_y"]) + Helper.chunks.clear() + + # Convert string keys back to Vector2 + var chunk_data = overmap_state_data["chunk_data"] + for key_str in chunk_data: + var key_parts = key_str.split(",") + if key_parts.size() == 2: + var key = Vector2(float(key_parts[0]), float(key_parts[1])) + Helper.chunks[key] = chunk_data[key_str] print("Overmap state loaded from: ", overmap_path) else: From b107e5f5fb293d6d2a2acaa5a72809aeab3f4302 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 10 Jan 2024 13:08:39 +0100 Subject: [PATCH 069/138] Return load game function --- Scripts/Helper/save_helper.gd | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 907de5ba..05259d5f 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -149,7 +149,11 @@ func get_saved_map_folder(level_pos: Vector2) -> String: return target_folder return "" - # Function to save the current state of the overmap +# Function to load game.json from a given saved game folder +func load_game_from_folder(save_folder_name: String) -> void: + current_save_folder = "user://save/" + save_folder_name + +# Function to save the current state of the overmap func save_overmap_state() -> void: var save_path = current_save_folder + "/overmap_state.json" var save_data: Dictionary = { From e89e5d56741a21a0330694ae111af4bb1b414310 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:46:09 +0100 Subject: [PATCH 070/138] Preserve player inventory between maps --- Scenes/Overmap/Scripts/Overmap.gd | 9 ++++++--- Scripts/general.gd | 2 ++ Scripts/hud.gd | 5 +++++ hud.tscn | 1 + 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index 5ae777fa..5a3d1846 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -14,6 +14,11 @@ var chunk_size = 32 var tile_size = 32 var grid_pixel_size = chunk_size*tile_size var selected_overmap_tile: Control = null +# We will emit this signal when the position_coords change +# Which happens when the user has panned the overmap +signal position_coord_changed(delta) +#Fires when the player has pressed the travel button +signal change_level_pressed() func _ready(): var gameFileJson: Dictionary = Helper.json_helper.load_json_dictionary_file(\ @@ -118,9 +123,6 @@ func unload_chunks(): var mouse_button_pressed: bool = false -# We will emit this signal when the position_coords change -# Which happens when the user has panned the overmap -signal position_coord_changed(delta) func _input(event): if !visible: return @@ -244,6 +246,7 @@ func _on_tile_clicked(clicked_tile): func _on_travel_button_button_up(): + change_level_pressed.emit() var mapFile = selected_overmap_tile.get_meta("map_file") var global_pos: Vector2 = selected_overmap_tile.get_meta("global_pos") Helper.switch_level(mapFile, global_pos) diff --git a/Scripts/general.gd b/Scripts/general.gd index 3374490e..985e5eeb 100644 --- a/Scripts/general.gd +++ b/Scripts/general.gd @@ -3,3 +3,5 @@ extends Node var is_mouse_outside_HUD = false var is_allowed_to_shoot = true +#This holds the inventory data of the player inventory between maps +var player_inventory_dict: Dictionary diff --git a/Scripts/hud.gd b/Scripts/hud.gd index a12b318c..e3db8269 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -76,6 +76,7 @@ func _input(event): func _ready(): #temporary hack ItemManager.create_item_protoset(item_protoset) + get_node(inventory).deserialize(General.player_inventory_dict) @@ -239,3 +240,7 @@ func _on_progress_bar_timer_timeout(): func _on_shooting_ammo_changed(current_ammo, max_ammo): get_node(ammo_HUD).text = str(current_ammo) + "/" + str(max_ammo) + + +func _on_overmap_change_level_pressed(): + General.player_inventory_dict = get_node(inventory).serialize() diff --git a/hud.tscn b/hud.tscn index a75ea9e6..c0273050 100644 --- a/hud.tscn +++ b/hud.tscn @@ -432,3 +432,4 @@ visible = false [connection signal="button_down" from="BuildingMenu/Concrete" to="." method="_on_concrete_button_down"] [connection signal="start_craft" from="CraftingMenu" to="." method="_on_crafting_menu_start_craft"] [connection signal="pressed" from="CraftingMenu/Panel/StartCraftingButton" to="CraftingMenu" method="_on_start_crafting_button_pressed"] +[connection signal="change_level_pressed" from="Overmap" to="." method="_on_overmap_change_level_pressed"] From f0ba3d5a94895c42e8bf0ea8726ee8682aecaafb Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 12 Jan 2024 16:07:18 +0100 Subject: [PATCH 071/138] Preserve player inventory across saves --- Scripts/Helper.gd | 1 + Scripts/Helper/save_helper.gd | 23 ++++++++++++++++++++++- Scripts/scene_selector.gd | 5 ++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Scripts/Helper.gd b/Scripts/Helper.gd index 0a2bae1b..812a86b2 100644 --- a/Scripts/Helper.gd +++ b/Scripts/Helper.gd @@ -29,6 +29,7 @@ func switch_level(level_name: String, global_pos: Vector2) -> void: if current_level_pos != Vector2(0.1,0.1): save_helper.save_current_level(current_level_pos) save_helper.save_overmap_state() + save_helper.save_player_inventory() current_level_pos = global_pos get_tree().change_scene_to_file("res://level_generation.tscn") diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 05259d5f..2571edc0 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -139,7 +139,6 @@ func save_map_data(target_folder: String) -> void: # The current_save_folder is determined when the game is first started # and does not change unless the user start a new game. func get_saved_map_folder(level_pos: Vector2) -> String: - var current_save_folder: String = Helper.save_helper.current_save_folder var dir = DirAccess.open(current_save_folder) var map_folder = "map_x" + str(level_pos.x) + "_y" + str(level_pos.y) var target_folder = current_save_folder+ "/" + map_folder @@ -190,3 +189,25 @@ func load_overmap_state() -> void: print("Overmap state loaded from: ", overmap_path) else: print("Failed to parse overmap state file: ", overmap_path) + +# Function to save the player's inventory to a JSON file. +func save_player_inventory() -> void: + var save_path = current_save_folder + "/player_inventory.json" + var inventory_data = JSON.stringify(General.player_inventory_dict) + Helper.json_helper.write_json_file(save_path, inventory_data) + + + # Function to load the player's inventory data +func load_player_inventory() -> void: + var load_path = current_save_folder + "/player_inventory.json" + + # Load the inventory data from the file + var loaded_inventory_data = Helper.json_helper.load_json_dictionary_file(load_path) + + if loaded_inventory_data: + # Update the General.player_inventory_dict with the loaded data + General.player_inventory_dict = loaded_inventory_data + print_debug("Player inventory loaded from: " + load_path) + else: + print_debug("Failed to load player inventory from: " + load_path) + diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index 87bab474..bf13ad7a 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -6,13 +6,16 @@ var saved_game_folders : Array # Called when the node enters the scene tree for the first time. func _ready(): saved_game_folders = Helper.json_helper.folder_names_in_dir("user://save/") - for saved_game in saved_game_folders: + # Iterate over the saved_game_folders array in reverse order + for i in range(saved_game_folders.size() - 1, -1, -1): + var saved_game = saved_game_folders[i] load_game_list.add_item(saved_game) func _on_load_game_button_pressed(): var selected_game_folder = saved_game_folders[load_game_list.get_selected_id()] Helper.save_helper.load_game_from_folder(selected_game_folder) Helper.save_helper.load_overmap_state() + Helper.save_helper.load_player_inventory() # We pass the name of the default map and coordinates # If there is a saved game, it will not load the provided map # but rather the one that was saved in the game that was loaded From 8263876fb0fd2641c70e9c0b74179dd364b7bd30 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 12 Jan 2024 18:30:51 +0100 Subject: [PATCH 072/138] Enemy corpse loot is saved and loaded --- LevelGenerator.gd | 1 + Scripts/Helper/save_helper.gd | 11 ++++--- Scripts/ItemDetector.gd | 2 -- Scripts/hud.gd | 61 ++++++++++++++--------------------- hud.tscn | 1 + 5 files changed, 32 insertions(+), 44 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 235c458d..69b78de4 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -62,6 +62,7 @@ func add_item_to_map(item: Dictionary): newItem.global_position.x = item.global_position_x newItem.global_position.y = item.global_position_y newItem.global_position.z = item.global_position_z + newItem.get_node(newItem.inventory).deserialize(item.inventory) # Generate the map layer by layer # For each layer, add all the blocks with proper rotation diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 2571edc0..1a7560af 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -58,16 +58,17 @@ func save_mob_data(target_folder: String) -> void: #Save the type and position of all mobs on the map func save_item_data(target_folder: String) -> void: var itemData: Array = [] - var defaultitem: Dictionary = {"itemid": "item1", \ - "global_position_x": 0, "global_position_y": 0, "global_position_z": 0} + var defaultItem: Dictionary = {"itemid": "item1", \ + "global_position_x": 0, "global_position_y": 0, "global_position_z": 0, "inventory": []} var mapitems = get_tree().get_nodes_in_group("mapitems") var newitemData: Dictionary for item in mapitems: item.remove_from_group("mapitems") - newitemData = defaultitem.duplicate() + newitemData = defaultItem.duplicate() newitemData["global_position_x"] = item.global_position.x newitemData["global_position_y"] = item.global_position.y newitemData["global_position_z"] = item.global_position.z + newitemData["inventory"] = item.get_node(item.inventory).serialize() itemData.append(newitemData.duplicate()) item.queue_free() Helper.json_helper.write_json_file(target_folder + "/items.json",\ @@ -186,9 +187,9 @@ func load_overmap_state() -> void: var key = Vector2(float(key_parts[0]), float(key_parts[1])) Helper.chunks[key] = chunk_data[key_str] - print("Overmap state loaded from: ", overmap_path) + print_debug("Overmap state loaded from: ", overmap_path) else: - print("Failed to parse overmap state file: ", overmap_path) + print_debug("Failed to parse overmap state file: ", overmap_path) # Function to save the player's inventory to a JSON file. func save_player_inventory() -> void: diff --git a/Scripts/ItemDetector.gd b/Scripts/ItemDetector.gd index b446d0ab..69317036 100644 --- a/Scripts/ItemDetector.gd +++ b/Scripts/ItemDetector.gd @@ -11,8 +11,6 @@ func _on_area_entered(area): #print(area.get_owner().get_items()) - - func _on_area_exited(area): if area.get_owner().is_in_group("Containers"): diff --git a/Scripts/hud.gd b/Scripts/hud.gd index e3db8269..de3617e5 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -62,7 +62,7 @@ func _input(event): if event.is_action_pressed("toggle_inventory"): get_node(inventory_control).visible = !get_node(inventory_control).visible get_node(proximity_inventory_control).visible = !get_node(proximity_inventory_control).visible - + if event.is_action_pressed("crafting_menu"): get_node(crafting_menu).visible = !get_node(crafting_menu).visible if event.is_action_pressed("overmap"): @@ -70,15 +70,12 @@ func _input(event): overmap.hide() else: overmap.show() - # Called when the node enters the scene tree for the first time. func _ready(): #temporary hack ItemManager.create_item_protoset(item_protoset) get_node(inventory).deserialize(General.player_inventory_dict) - - # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): @@ -87,9 +84,7 @@ func _process(_delta): get_node(tooltip).global_position = get_node(tooltip).get_global_mouse_position() + Vector2(0, -5 - get_node(tooltip).size.y) else: get_node(tooltip).visible = false - - - + if is_progress_bar_well_progressing_i_guess: get_node(progress_bar_filling).scale.x = lerp(1, 0, get_node(progress_bar_timer).time_left / progress_bar_timer_max_time) @@ -102,37 +97,26 @@ func _on_player_update_doll(head, right_arm, left_arm, torso, right_leg, left_le get_node(right_leg_health).modulate = lerp(damaged_color, healthy_color, right_leg/100) get_node(left_leg_health).modulate = lerp(damaged_color, healthy_color, left_leg/100) - - func _on_player_update_stamina_hud(stamina): get_node(stamina_HUD).text = str(round(stamina)) + "%" - - - +# The parameter items isall the items from the inventory that has entered proximity func _on_item_detector_add_to_proximity_inventory(items): var duplicated_items = items - for item in duplicated_items: var duplicated_item = item.duplicate() - #duplicated_item.get_parent().remove_child(item) + # Store the original inventory + duplicated_item.set_meta("original_parent", item.get_inventory()) + duplicated_item.set_meta("original_item", item) get_node(proximity_inventory).add_child(duplicated_item) - #get_node(proximity_inventory_control).refresh() - - +# The parameter items is all the items from the inventory that has left proximity func _on_item_detector_remove_from_proximity_inventory(items): -# for prox_item in get_node(proximity_inventory).get_children(): -# print("test") -# if prox_item in items: -# prox_item.queue_free() - for prox_item in get_node(proximity_inventory).get_children(): for item in items: if item.get_property("assigned_id") == prox_item.get_property("assigned_id"): prox_item.queue_free() - func _on_concrete_button_down(): construction_chosen.emit("concrete_wall") @@ -145,12 +129,11 @@ func _on_inventory_item_mouse_entered(item): is_showing_tooltip = true get_node(tooltip_item_name).text = str(item.get_property("name", "")) get_node(tooltip_item_description).text = item.get_property("description", "") - + func _on_inventory_item_mouse_exited(_item): is_showing_tooltip = false func check_if_resources_are_available(item_id, amount_to_spend: int): - var inventory_node = get_node(inventory) print("checking if we have the item id in inv") if inventory_node.get_item_by_id(item_id): @@ -158,13 +141,10 @@ func check_if_resources_are_available(item_id, amount_to_spend: int): var item_total_amount : int = 0 var current_amount_to_spend = amount_to_spend var items = inventory_node.get_items_by_id(item_id) - for item in items: item_total_amount += inventory_node.get_item_stack_size(item) - if item_total_amount >= current_amount_to_spend: return true - return false func try_to_spend_item(item_id, amount_to_spend : int): @@ -184,7 +164,7 @@ func try_to_spend_item(item_id, amount_to_spend : int): return false else: return false - + func merge_items_to_total_amount(items, inventory, total_amount : int): var current_total_amount = total_amount for item in items: @@ -194,17 +174,16 @@ func merge_items_to_total_amount(items, inventory, total_amount : int): elif inventory.get_item_stack_size(item) < item.get_property("max_stack_size"): current_total_amount -= item.get_property("max_stack_size") - inventory.get_item_stack_size(item) inventory.set_item_stack_size(item, item.get_property("max_stack_size")) - + elif inventory.get_item_stack_size(item) == current_total_amount: current_total_amount = 0 - + elif inventory.get_item_stack_size(item) > current_total_amount: inventory.set_item_stack_size(item, current_total_amount) current_total_amount = 0 - + if inventory.get_item_stack_size(item) == 0: inventory.remove_item(item) - func _on_crafting_menu_start_craft(recipe): @@ -217,8 +196,6 @@ func _on_crafting_menu_start_craft(recipe): var item item = get_node(inventory).create_and_add_item(recipe["crafts"]) get_node(inventory).set_item_stack_size(item, recipe["craft_amount"]) - - func start_progress_bar(time : float): get_node(progress_bar).visible = true @@ -237,10 +214,20 @@ func interrupt_progress_bar(): func _on_progress_bar_timer_timeout(): interrupt_progress_bar() - func _on_shooting_ammo_changed(current_ammo, max_ammo): get_node(ammo_HUD).text = str(current_ammo) + "/" + str(max_ammo) - +# Called when the users presses the travel button on the overmap +# We save the player inventory to a autoload singleton so we can load it on the next map func _on_overmap_change_level_pressed(): General.player_inventory_dict = get_node(inventory).serialize() + +# When an item is added to the player inventory +# We check where it came from and delete it from that inventory +# This happens when the player moves an item from $CtrlInventoryGridExProx +func _on_inventory_grid_stacked_item_added(item): + if item.has_meta("original_parent"): + var original_parent = item.get_meta("original_parent") + var original_item = item.get_meta("original_item") + if original_parent and original_parent.has_method("remove_item"): + original_parent.remove_item(original_item) # Remove from original parent diff --git a/hud.tscn b/hud.tscn index c0273050..ac862c57 100644 --- a/hud.tscn +++ b/hud.tscn @@ -425,6 +425,7 @@ visible = false [connection signal="timeout" from="ProgressBar/ProgressBarTimer" to="." method="_on_progress_bar_timer_timeout"] [connection signal="mouse_entered" from="OutsideOfHUD" to="OutsideOfHUD" method="_on_mouse_entered"] [connection signal="mouse_exited" from="OutsideOfHUD" to="OutsideOfHUD" method="_on_mouse_exited"] +[connection signal="item_added" from="InventoryGridStacked" to="." method="_on_inventory_grid_stacked_item_added"] [connection signal="item_mouse_entered" from="CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_entered"] [connection signal="item_mouse_exited" from="CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_exited"] [connection signal="item_mouse_entered" from="CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_entered"] From cde03db19310be6676a59caac6901a7c0091dacf Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 12 Jan 2024 20:34:36 +0100 Subject: [PATCH 073/138] Save and load player health and death --- Scenes/GameOver.tscn | 46 +++++++++++++++++++++++++++++++ Scripts/GameOver.gd | 7 +++++ Scripts/Helper.gd | 17 ++++++++++++ Scripts/Helper/save_helper.gd | 51 ++++++++++++++++++++++++++++++++--- Scripts/player.gd | 8 +++--- hud.tscn | 6 ++++- 6 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 Scenes/GameOver.tscn create mode 100644 Scripts/GameOver.gd diff --git a/Scenes/GameOver.tscn b/Scenes/GameOver.tscn new file mode 100644 index 00000000..c0755658 --- /dev/null +++ b/Scenes/GameOver.tscn @@ -0,0 +1,46 @@ +[gd_scene load_steps=2 format=3 uid="uid://ckuh2s0nvwg0x"] + +[ext_resource type="Script" path="res://Scripts/GameOver.gd" id="1_77h6a"] + +[node name="GameOver" 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_77h6a") + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.129412, 0.14902, 0.180392, 1) + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -94.5 +offset_top = -42.5 +offset_right = 94.5 +offset_bottom = 42.5 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="GameOverLabel" type="Label" parent="VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 36 +text = "Game over" + +[node name="ReturnButton" type="Button" parent="VBoxContainer"] +layout_mode = 2 +text = "Return to main menu" + +[connection signal="button_up" from="VBoxContainer/ReturnButton" to="." method="_on_return_button_button_up"] diff --git a/Scripts/GameOver.gd b/Scripts/GameOver.gd new file mode 100644 index 00000000..3575088b --- /dev/null +++ b/Scripts/GameOver.gd @@ -0,0 +1,7 @@ +extends Control + + + +func _on_return_button_button_up(): + Helper.reset() + get_tree().change_scene_to_file("res://scene_selector.tscn") diff --git a/Scripts/Helper.gd b/Scripts/Helper.gd index 812a86b2..02d38781 100644 --- a/Scripts/Helper.gd +++ b/Scripts/Helper.gd @@ -19,6 +19,22 @@ func _ready(): save_helper = save_Helper_Class.new() add_child(save_helper) +# Called when the game is over and everything will need to be reset to default +func reset(): + chunks = {} #Stores references to tilegrids representing the overmap + current_level_pos = Vector2(0.1,0.1) + current_map_seed = 0 + position_coord = Vector2(0, 0) + save_helper.current_save_folder = "" + var mapMobs = get_tree().get_nodes_in_group("mobs") + for mob in mapMobs: + mob.remove_from_group("mobs") + mob.queue_free() + var mapitems = get_tree().get_nodes_in_group("mapitems") + for item in mapitems: + item.remove_from_group("mapitems") + item.queue_free() + #Level_name is a filename in /mods/core/maps #global_pos is the absolute position on the overmap #see overmap.gd for how global_pos is used there @@ -30,6 +46,7 @@ func switch_level(level_name: String, global_pos: Vector2) -> void: save_helper.save_current_level(current_level_pos) save_helper.save_overmap_state() save_helper.save_player_inventory() + save_helper.save_player_state(get_tree().get_first_node_in_group("Players")) current_level_pos = global_pos get_tree().change_scene_to_file("res://level_generation.tscn") diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 1a7560af..5b08740d 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -2,13 +2,13 @@ extends Node #This script is loaded in to the helper.gd autoload singleton #It can be accessed trough Helper.save_helper -#This scipt provides functions to help transitioning between levels -#It has functions to save the current level and the location of items, mobs and tiles +#This script provides functions to help transitioning between maps +#It has functions to save the current map and the location of items, mobs and tiles #It also has functions to load saved data and place the items, mobs and tiles on the map var current_save_folder: String = "" -# Function to save the current level state +# Function to save the current map state func save_current_level(global_pos: Vector2) -> void: var dir = DirAccess.open(current_save_folder) var map_folder = "map_x" + str(global_pos.x) + "_y" + str(global_pos.y) @@ -212,3 +212,48 @@ func load_player_inventory() -> void: else: print_debug("Failed to load player inventory from: " + load_path) +# Function to save the player's state to a JSON file. +func save_player_state(player: CharacterBody3D) -> void: + if !player: + return + var save_path = current_save_folder + "/player_state.json" + var player_state: Dictionary = { + "is_alive": player.is_alive, + "left_arm_health": player.current_left_arm_health, + "right_arm_health": player.current_right_arm_health, + "head_health": player.current_head_health, + "torso_health": player.current_torso_health, + "left_leg_health": player.current_left_leg_health, + "right_leg_health": player.current_right_leg_health, + "stamina": player.current_stamina, + "hunger": player.current_hunger, + "thirst": player.current_thirst, + "nutrition": player.current_nutrition, + "pain": player.current_pain + } + Helper.json_helper.write_json_file(save_path, JSON.stringify(player_state)) + +# Function to load the player's state from a JSON file. +func load_player_state(player: CharacterBody3D) -> void: + var load_path = current_save_folder + "/player_state.json" + var player_state = Helper.json_helper.load_json_dictionary_file(load_path) + + if player_state: + player.is_alive = player_state["is_alive"] + player.current_left_arm_health = player_state["left_arm_health"] + player.current_right_arm_health = player_state["right_arm_health"] + player.current_head_health = player_state["head_health"] + player.current_torso_health = player_state["torso_health"] + player.current_left_leg_health = player_state["left_leg_health"] + player.current_right_leg_health = player_state["right_leg_health"] + player.current_stamina = player_state["stamina"] + player.current_hunger = player_state["hunger"] + player.current_thirst = player_state["thirst"] + player.current_nutrition = player_state["nutrition"] + player.current_pain = player_state["pain"] + # Emit signals to update the HUD + player.update_doll.emit(player.current_head_health, player.current_right_arm_health, player.current_left_arm_health, player.current_torso_health, player.current_right_leg_health, player.current_left_leg_health) + player.update_stamina_HUD.emit(player.current_stamina) + else: + print_debug("Failed to load player state from: ", load_path) + diff --git a/Scripts/player.gd b/Scripts/player.gd index 16e68d5d..4210c88c 100644 --- a/Scripts/player.gd +++ b/Scripts/player.gd @@ -66,8 +66,8 @@ func _ready(): current_right_leg_health = right_leg_health current_head_health = head_health current_torso_health = torso_health - current_stamina = stamina + Helper.save_helper.load_player_state(self) func _process(_delta): @@ -207,8 +207,10 @@ func check_if_alive(): #return true func die(): - print("Player died") - is_alive = false + if is_alive: + print("Player died") + is_alive = false + $"../../../HUD".get_node("GameOver").show() func transfer_damage_to_torso(damage: float): current_torso_health -= damage diff --git a/hud.tscn b/hud.tscn index ac862c57..ccd75c69 100644 --- a/hud.tscn +++ b/hud.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=23 format=3 uid="uid://clhj525tmme3k"] +[gd_scene load_steps=24 format=3 uid="uid://clhj525tmme3k"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="1_pxloi"] [ext_resource type="Script" path="res://Scripts/hud.gd" id="1_s3xoj"] @@ -19,6 +19,7 @@ [ext_resource type="PackedScene" uid="uid://cpcn3qq8okj12" path="res://item_craft_button.tscn" id="15_otw1a"] [ext_resource type="ButtonGroup" uid="uid://bcjuavqvre6mk" path="res://crafting_recipes_button_group.tres" id="16_2oloe"] [ext_resource type="PackedScene" uid="uid://bgswuol251m3u" path="res://Scenes/Overmap/Overmap.tscn" id="19_oomhy"] +[ext_resource type="PackedScene" uid="uid://ckuh2s0nvwg0x" path="res://Scenes/GameOver.tscn" id="20_jlthm"] [sub_resource type="Theme" id="Theme_xn5t2"] default_font = ExtResource("1_pxloi") @@ -422,6 +423,9 @@ autowrap_mode = 3 [node name="Overmap" parent="." instance=ExtResource("19_oomhy")] visible = false +[node name="GameOver" parent="." instance=ExtResource("20_jlthm")] +visible = false + [connection signal="timeout" from="ProgressBar/ProgressBarTimer" to="." method="_on_progress_bar_timer_timeout"] [connection signal="mouse_entered" from="OutsideOfHUD" to="OutsideOfHUD" method="_on_mouse_entered"] [connection signal="mouse_exited" from="OutsideOfHUD" to="OutsideOfHUD" method="_on_mouse_exited"] From 5c85c8f915b0c0898346db90b6f7455ba0ae373f Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:21:50 +0100 Subject: [PATCH 074/138] add furniture sprites --- Mods/Core/Furniture/chair_32.png | Bin 0 -> 1527 bytes Mods/Core/Furniture/chair_32.png.import | 34 ++++++++++++++++++++++++ Mods/Core/Furniture/table_64.png | Bin 0 -> 4553 bytes Mods/Core/Furniture/table_64.png.import | 34 ++++++++++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 Mods/Core/Furniture/chair_32.png create mode 100644 Mods/Core/Furniture/chair_32.png.import create mode 100644 Mods/Core/Furniture/table_64.png create mode 100644 Mods/Core/Furniture/table_64.png.import diff --git a/Mods/Core/Furniture/chair_32.png b/Mods/Core/Furniture/chair_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d21017c58c6d4c4ea8bdde8c988b0359a86005c2 GIT binary patch literal 1527 zcmZ{kdpHwn9LMKQv&>N`_n}b-Z4n}x8Is5)5yNIyE*shwlSGUx;WR=KqR#2MTyu@( zGNY^9qp@6DSVyu+Cuf}VJm;_TJn!%KeV)(v_dehEegAmr?ru(?Eoxf;007AO2+C8e zIvXV~EAHg;=aLhdfWfT(UGVvKXq(uR+dL}? zD>mUz7&TBa0&O6BF(F|A|48V%;FH(@ZWvxTd?X&Q*{2}^d19=xfju`b^k0Yx%#t}j zD1I90LT8lS315YTe0ZLo0~pmb`zk(kP%6i|Le`1ZKBb73Da1ufUodL!9JZdwx=bsF zUJP;czOUTRY<#$1PfxG{X7{5qDJW}Fd}D4H4OK3%Y!%KfwK z;ABjngZb5bU>>n4ut5t-2f45pZjG31m5dl`>lF$vuFm%aoz)IW@Iq9@x__XJP8(Fn z@qvvlsIIQ=0JJPjU|Hkk0-B8p1Xd_JvKjXV&)8pLSYp{(FX%6_cloQ9>znxH?McGW z4rEP_$`iC5Gc(|jUq|cr&ge2mdv;%E7Q3x*w5W6*&qTvGqbGb-F$SUuzFHz<&QMTm zvZfV~20Fg-+gx&ob2KzDg)_oQW)WU7kT-quJ~y`q<+&yU;_3t#a@HEjNt34960(<& z$4c#rho2Kpu#3_k>K^su34~2HqO;9&A0xNL6^{Ns@Y&s!?u+0JZCPX7GmU18Q>6NcvgZ9Hq}IsqX?2-%d$#kPIA;B*)-b zd*4amo=}sydxZk%y38y^G-jQIL=Q1lvy~o+^yM>m_&a#Ky#PE?qp#jk4U0_@We`54 zoz1k^*HOSw|ki-j+40s5S7e#oso z;Qwem+30~y#mO{mm+t<->E3f~-(6Ymrx)2H9sXtYJ9rJv7zB7I7E(g#DYKa3w4mLf7DGeF2Lv8EwU$X+D+U4h>Gy{F4t>PIu zmkY9l(3fpW?$0A?CrUun02^wICQBcJAO^>I>n3i;;mp{Tx;G54Mc`f>5tZV%XYuki zT7!$cJ8gH!fW4RDGDwCE<~YY`E$EBBRGya&1<9HsZ4hrf2EH}=O?NUs2)6o$c3w^4 zv?d`9$E{n#Mc1l|k7kT_^F*cDd#$JRRC`Q3f7|VATLRMfIY|!wk5ffV` zsi>t|HE}#1F?S6-^Y+!+1MbDt==vWKcaB;@7gBs_hc!BvA`|CEhMsVpyMO99e7Zdi z8|3qYSiroxS*zYN%&1lqI}~fu>9_%7s=cbV|>?U}~)w&Vc`rB9H`>533UDo(9{iyCFG(Te!-fN^8ek6S%_h z#2?g`hi!Fkw5~68DQFb+>ANwih@;~f!~|TveQ?JqLUGojh4cL=d)FVt-Sp!Yxz(SB zO7ew3;XZ7lr5uC0$Rl&mDu>eZAD|y&R)h(T zVQiJRlhvY&YAd6d@oy`8%f%}7XM-ZX9qVF6NyRw E8x?@N`v3p{ literal 0 HcmV?d00001 diff --git a/Mods/Core/Furniture/chair_32.png.import b/Mods/Core/Furniture/chair_32.png.import new file mode 100644 index 00000000..1acfaf68 --- /dev/null +++ b/Mods/Core/Furniture/chair_32.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cd6qkw2b1gu6g" +path="res://.godot/imported/chair_32.png-1dd6d4d4c3d7476cf856d93fd3b41d64.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Furniture/chair_32.png" +dest_files=["res://.godot/imported/chair_32.png-1dd6d4d4c3d7476cf856d93fd3b41d64.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Mods/Core/Furniture/table_64.png b/Mods/Core/Furniture/table_64.png new file mode 100644 index 0000000000000000000000000000000000000000..cf9fa076608ee8708724bab65321bdbb4e979c24 GIT binary patch literal 4553 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 VP8Ct)SN{?KgqA+MT*EHve*izhpNRkf literal 0 HcmV?d00001 diff --git a/Mods/Core/Furniture/table_64.png.import b/Mods/Core/Furniture/table_64.png.import new file mode 100644 index 00000000..1a2379e3 --- /dev/null +++ b/Mods/Core/Furniture/table_64.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cqfqxgp12asw1" +path="res://.godot/imported/table_64.png-2a25967c15d24af83aad9c2836306f55.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Furniture/table_64.png" +dest_files=["res://.godot/imported/table_64.png-2a25967c15d24af83aad9c2836306f55.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 From 2165638246585456644743e442ebd967d1c6e1ee Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:22:24 +0100 Subject: [PATCH 075/138] Minor fix on existing widgets --- Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn | 4 +--- Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn index d3932de2..b7e267a2 100644 --- a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=6 format=3 uid="uid://vfj2if40vf10"] +[gd_scene load_steps=5 format=3 uid="uid://vfj2if40vf10"] [ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd" id="1_wp6ou"] -[ext_resource type="PackedScene" uid="uid://cccnrdolr1bfo" path="res://Scenes/ContentManager/Mapeditor/tilebrush.tscn" id="2_djlno"] [ext_resource type="PackedScene" uid="uid://b8i6wfk3fngy4" path="res://Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn" id="2_erosr"] [ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_x7b0a"] [ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="5_5ngda"] @@ -14,7 +13,6 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_wp6ou") -tileBrush = ExtResource("2_djlno") tileImageDisplay = NodePath("VBoxContainer/FormGrid/TileImageDisplay") IDTextLabel = NodePath("VBoxContainer/FormGrid/IDTextLabel") NameTextEdit = NodePath("VBoxContainer/FormGrid/NameTextEdit") diff --git a/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn b/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn index 0aa31b26..fb41e1c4 100644 --- a/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn +++ b/Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn @@ -51,7 +51,6 @@ theme_override_font_sizes/font_size = 16 text = "-" [node name="ContentItems" type="ItemList" parent="ListControls"] -custom_minimum_size = Vector2(200, 200) layout_mode = 2 size_flags_vertical = 3 focus_next = NodePath("../HBoxContainer/CollapseButton") From 04a5ba53e84a4c5c87b532130a664ac6f94a1de8 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:22:56 +0100 Subject: [PATCH 076/138] Initial furniture editor --- Mods/Core/Furniture/Furniture.json | 5 + .../Custom_Editors/FurnitureEditor.tscn | 112 ++++++++++++++++++ .../Custom_Editors/Scripts/FurnitureEditor.gd | 72 +++++++++++ .../Scripts/TerrainTileEditor.gd | 2 - Scenes/ContentManager/Scripts/content_list.gd | 4 + .../ContentManager/Scripts/contenteditor.gd | 1 + Scripts/gamedata.gd | 9 +- 7 files changed, 202 insertions(+), 3 deletions(-) create mode 100644 Mods/Core/Furniture/Furniture.json create mode 100644 Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn create mode 100644 Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd diff --git a/Mods/Core/Furniture/Furniture.json b/Mods/Core/Furniture/Furniture.json new file mode 100644 index 00000000..9d869000 --- /dev/null +++ b/Mods/Core/Furniture/Furniture.json @@ -0,0 +1,5 @@ +[ + { + "id": "table_round_wood" + } +] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn b/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn new file mode 100644 index 00000000..eb8bb0b5 --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn @@ -0,0 +1,112 @@ +[gd_scene load_steps=5 format=3 uid="uid://cng4m3os6smj8"] + +[ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="1_gm4uu"] +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd" id="1_wqqit"] +[ext_resource type="PackedScene" uid="uid://b8i6wfk3fngy4" path="res://Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn" id="2_ekwf5"] +[ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="3_o3k3a"] + +[node name="FurnitureEditor" type="Control" node_paths=PackedStringArray("furnitureImageDisplay", "IDTextLabel", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "furnitureSelector", "imageNameStringLabel")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_wqqit") +furnitureImageDisplay = NodePath("VBoxContainer/FormGrid/TileImageDisplay") +IDTextLabel = NodePath("VBoxContainer/FormGrid/IDTextLabel") +NameTextEdit = NodePath("VBoxContainer/FormGrid/NameTextEdit") +DescriptionTextEdit = NodePath("VBoxContainer/FormGrid/DescriptionTextEdit") +CategoriesList = NodePath("VBoxContainer/FormGrid/Editable_Item_List") +furnitureSelector = NodePath("Sprite_selector") +imageNameStringLabel = NodePath("VBoxContainer/FormGrid/ImageNameLabel") + +[node name="VBoxContainer" 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="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="CloseButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Close" + +[node name="SaveButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Save" + +[node name="FormGrid" type="GridContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +columns = 2 + +[node name="ImageLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Sprite:" + +[node name="TileImageDisplay" type="TextureRect" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(128, 128) +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_stretch_ratio = 0.4 +texture = ExtResource("1_gm4uu") +expand_mode = 3 + +[node name="ImageNameLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Sprite name:" + +[node name="ImageNameStringLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 + +[node name="IDLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "ID:" + +[node name="IDTextLabel" type="Label" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 + +[node name="NameLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Name" + +[node name="NameTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 +focus_next = NodePath("../DescriptionTextEdit") +focus_previous = NodePath("../TileImageDisplay") + +[node name="DescriptionLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Description" + +[node name="DescriptionTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.9 +focus_next = NodePath("../Editable_Item_List") +focus_previous = NodePath("../NameTextEdit") + +[node name="CategoriesLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Categories:" + +[node name="Editable_Item_List" parent="VBoxContainer/FormGrid" instance=ExtResource("2_ekwf5")] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +header = "Categories" + +[node name="Sprite_selector" parent="." instance=ExtResource("3_o3k3a")] +visible = false diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd new file mode 100644 index 00000000..2157f3e3 --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd @@ -0,0 +1,72 @@ +extends Control + +#This scene is intended to be used inside the content editor +#It is supposed to edit exactly one piece of furniture +#It expects to save the data to a JSON file that contains all furniture data from a mod +#To load data, provide the name of the furniture data file and an ID + +@export var furnitureImageDisplay: TextureRect = null +@export var IDTextLabel: Label = null +@export var NameTextEdit: TextEdit = null +@export var DescriptionTextEdit: TextEdit = null +@export var CategoriesList: Control = null +@export var furnitureSelector: Popup = null +@export var imageNameStringLabel: Label = null + +# This signal will be emitted when the user presses the save button +# This signal should alert Gamedata that the furniture data array should be saved to disk +# The content editor has connected this signal to Gamedata already +signal data_changed() + +# The data that represents this furniture +# The data is selected from the Gamedata.data.furnitures.data array +# based on the ID that the user has selected in the content editor +var contentData: Dictionary = {}: + set(value): + contentData = value + load_furniture_data() + furnitureSelector.sprites_collection = Gamedata.data.furnitures.sprites + +# This function updates the form based on the contentData that has been loaded +func load_furniture_data(): + if furnitureImageDisplay != null and contentData.has("sprite"): + var myTexture: Resource = Gamedata.data.furnitures.sprites[contentData["sprite"]] + furnitureImageDisplay.texture = myTexture.albedo_texture + imageNameStringLabel.text = contentData["sprite"] + if IDTextLabel != null: + IDTextLabel.text = str(contentData["id"]) + if NameTextEdit != null and contentData.has("name"): + NameTextEdit.text = contentData["name"] + if DescriptionTextEdit != null and contentData.has("description"): + DescriptionTextEdit.text = contentData["description"] + if CategoriesList != null and contentData.has("categories"): + CategoriesList.clear_list() + for category in contentData["categories"]: + CategoriesList.add_item_to_list(category) + +#The editor is closed, destroy the instance +#TODO: Check for unsaved changes +func _on_close_button_button_up(): + queue_free() + +# This function takes all data from the form elements stores them in the contentData +# Since contentData is a reference to an item in Gamedata.data.furniture.data +# the central array for furnituredata is updated with the changes as well +# The function will signal to Gamedata that the data has changed and needs to be saved +func _on_save_button_button_up(): + contentData["sprite"] = imageNameStringLabel.text + contentData["name"] = NameTextEdit.text + contentData["description"] = DescriptionTextEdit.text + contentData["categories"] = CategoriesList.get_items() + data_changed.emit() + +#When the furnitureImageDisplay is clicked, the user will be prompted to select an image from +# "res://Mods/Core/Furnitures/". The texture of the furnitureImageDisplay will change to the selected image +func _on_furniture_image_display_gui_input(event): + if event is InputEventMouseButton and event.pressed: + furnitureSelector.show() + +func _on_sprite_selector_sprite_selected_ok(clicked_sprite) -> void: + var furnitureTexture: Resource = clicked_sprite.get_texture() + furnitureImageDisplay.texture = furnitureTexture + imageNameStringLabel.text = furnitureTexture.resource_path.get_file() diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd index fd2bf5cd..d3b06159 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd @@ -5,8 +5,6 @@ extends Control #It expects to save the data to a JSON file that contains all tile data from a mod #To load data, provide the name of the tile data file and an ID - -@export var tileBrush: PackedScene @export var tileImageDisplay: TextureRect = null @export var IDTextLabel: Label = null @export var NameTextEdit: TextEdit = null diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 9851e878..48d9a163 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -31,6 +31,10 @@ func load_data(): if contentData.is_empty(): return contentItems.clear() + if !contentData.has("data"): + return + if contentData.data.is_empty(): + return #If the first item is a string, it's a list of files. #Otherwise, it's a list of objects representing some kind of data if contentData.data[0] is String: diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index 3021d33c..6eec5973 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -14,6 +14,7 @@ func _ready(): load_content_list(Gamedata.data.maps, "Maps") load_content_list(Gamedata.data.tiles, "Terrain Tiles") load_content_list(Gamedata.data.mobs, "Mobs") + load_content_list(Gamedata.data.furniture, "Furniture") func load_content_list(data: Dictionary, strHeader: String): # Instantiate a contentlist diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index 9c506b8b..be7097eb 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -14,10 +14,13 @@ func _ready(): data.mobs = {} data.overmaptiles = {} data.maps = {} + data.furniture = {} data.tiles.dataPath = "./Mods/Core/Tiles/Tiles.json" data.tiles.spritePath = "./Mods/Core/Tiles/" data.mobs.dataPath = "./Mods/Core/Mobs/Mobs.json" data.mobs.spritePath = "./Mods/Core/Mobs/" + data.furniture.spritePath = "./Mods/Core/Furniture/" + data.furniture.dataPath = "./Mods/Core/Furniture/Furniture.json" data.overmaptiles.spritePath = "./Mods/Core/OvermapTiles/" data.maps.dataPath = "./Mods/Core/Maps/" load_sprites() @@ -33,6 +36,8 @@ func load_data() -> void: if FileAccess.file_exists(dataPath): Helper.json_helper.create_new_json_file(dataPath) data[dict].data = Helper.json_helper.load_json_array_file(dataPath) + else: + data[dict].data = [] #This loads all the sprites and assigns them to the proper dictionary func load_sprites(): @@ -96,8 +101,10 @@ func duplicate_item_in_data(contentData: Dictionary, id: String, newID: String): # This file will get the name as specified by id, so for example "myhouse" # After the ID is added, the data array will be saved to disk func add_id_to_data(contentData: Dictionary, id: String): + if !contentData.has("data"): + return if contentData.dataPath.ends_with((".json")): - if get_array_index_by_id(contentData.data,id) != -1: + if get_array_index_by_id(contentData,id) != -1: print_debug("Tried to add an existing id to an array") return contentData.data.append({"id": id}) From 2faa88454f0f26d740b33279d1746c9705ab6a6d Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 13 Jan 2024 16:50:02 +0100 Subject: [PATCH 077/138] Finalize furniture editor --- Mods/Core/Furniture/Furniture.json | 19 ++++++++++++++- .../Custom_Editors/FurnitureEditor.tscn | 18 +++++++++++--- .../Custom_Editors/Scripts/FurnitureEditor.gd | 24 +++++++++++++++---- .../ContentManager/Scripts/contenteditor.gd | 3 +++ Scenes/ContentManager/contenteditor.tscn | 4 +++- Scripts/gamedata.gd | 2 +- 6 files changed, 60 insertions(+), 10 deletions(-) diff --git a/Mods/Core/Furniture/Furniture.json b/Mods/Core/Furniture/Furniture.json index 9d869000..9b361f5c 100644 --- a/Mods/Core/Furniture/Furniture.json +++ b/Mods/Core/Furniture/Furniture.json @@ -1,5 +1,22 @@ [ { - "id": "table_round_wood" + "categories": [ + "Urban", + "Livingroom" + ], + "description": "A round wooden table. This weathered relic from a bygone era stands as a testament to a simpler time, a stark contrast to the harsh reality surrounding it.\nThe table's surface bears the scars a history as a dining spot.", + "id": "table_round_wood", + "name": "Round wooden table", + "sprite": "table_64.png" + }, + { + "categories": [ + "Urban", + "Livingroom" + ], + "description": "A simple wooden chair, its construction is basic yet sturdy, a testament to durability in the face of decay. \nWith a rough-hewn seat and a backrest that bears the marks of time, this chair offers a momentary respite from the unforgiving environment.", + "id": "chair_wood", + "name": "Wooden chair", + "sprite": "chair_32.png" } ] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn b/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn index eb8bb0b5..1ab08e01 100644 --- a/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn @@ -13,7 +13,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_wqqit") -furnitureImageDisplay = NodePath("VBoxContainer/FormGrid/TileImageDisplay") +furnitureImageDisplay = NodePath("VBoxContainer/FormGrid/FurnitureImageDisplay") IDTextLabel = NodePath("VBoxContainer/FormGrid/IDTextLabel") NameTextEdit = NodePath("VBoxContainer/FormGrid/NameTextEdit") DescriptionTextEdit = NodePath("VBoxContainer/FormGrid/DescriptionTextEdit") @@ -49,11 +49,14 @@ columns = 2 layout_mode = 2 text = "Sprite:" -[node name="TileImageDisplay" type="TextureRect" parent="VBoxContainer/FormGrid"] +[node name="FurnitureImageDisplay" type="TextureRect" parent="VBoxContainer/FormGrid"] custom_minimum_size = Vector2(128, 128) layout_mode = 2 size_flags_horizontal = 0 size_flags_stretch_ratio = 0.4 +focus_next = NodePath("../NameTextEdit") +focus_previous = NodePath("../Editable_Item_List") +focus_mode = 2 texture = ExtResource("1_gm4uu") expand_mode = 3 @@ -84,7 +87,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.1 focus_next = NodePath("../DescriptionTextEdit") -focus_previous = NodePath("../TileImageDisplay") +focus_previous = NodePath("../FurnitureImageDisplay") [node name="DescriptionLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 @@ -97,6 +100,7 @@ size_flags_vertical = 3 size_flags_stretch_ratio = 0.9 focus_next = NodePath("../Editable_Item_List") focus_previous = NodePath("../NameTextEdit") +wrap_mode = 1 [node name="CategoriesLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 @@ -106,7 +110,15 @@ text = "Categories:" layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +focus_next = NodePath("../FurnitureImageDisplay") +focus_previous = NodePath("../DescriptionTextEdit") +focus_mode = 2 header = "Categories" [node name="Sprite_selector" parent="." instance=ExtResource("3_o3k3a")] visible = false + +[connection signal="button_up" from="VBoxContainer/HBoxContainer/CloseButton" to="." method="_on_close_button_button_up"] +[connection signal="button_up" from="VBoxContainer/HBoxContainer/SaveButton" to="." method="_on_save_button_button_up"] +[connection signal="gui_input" from="VBoxContainer/FormGrid/FurnitureImageDisplay" to="." method="_on_furniture_image_display_gui_input"] +[connection signal="sprite_selected_ok" from="Sprite_selector" to="." method="_on_sprite_selector_sprite_selected_ok"] diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd index 2157f3e3..655217a1 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd @@ -12,26 +12,29 @@ extends Control @export var CategoriesList: Control = null @export var furnitureSelector: Popup = null @export var imageNameStringLabel: Label = null +var control_elements: Array = [] # This signal will be emitted when the user presses the save button # This signal should alert Gamedata that the furniture data array should be saved to disk # The content editor has connected this signal to Gamedata already signal data_changed() +func _ready(): + control_elements = [furnitureImageDisplay,NameTextEdit,DescriptionTextEdit] + # The data that represents this furniture -# The data is selected from the Gamedata.data.furnitures.data array +# The data is selected from the Gamedata.data.furniture.data array # based on the ID that the user has selected in the content editor var contentData: Dictionary = {}: set(value): contentData = value load_furniture_data() - furnitureSelector.sprites_collection = Gamedata.data.furnitures.sprites + furnitureSelector.sprites_collection = Gamedata.data.furniture.sprites # This function updates the form based on the contentData that has been loaded func load_furniture_data(): if furnitureImageDisplay != null and contentData.has("sprite"): - var myTexture: Resource = Gamedata.data.furnitures.sprites[contentData["sprite"]] - furnitureImageDisplay.texture = myTexture.albedo_texture + furnitureImageDisplay.texture = Gamedata.data.furniture.sprites[contentData["sprite"]] imageNameStringLabel.text = contentData["sprite"] if IDTextLabel != null: IDTextLabel.text = str(contentData["id"]) @@ -60,6 +63,19 @@ func _on_save_button_button_up(): contentData["categories"] = CategoriesList.get_items() data_changed.emit() +func _input(event): + if event.is_action_pressed("ui_focus_next"): + for myControl in control_elements: + if myControl.has_focus(): + if Input.is_key_pressed(KEY_SHIFT): # Check if Shift key + if !myControl.focus_previous.is_empty(): + myControl.get_node(myControl.focus_previous).grab_focus() + else: + if !myControl.focus_next.is_empty(): + myControl.get_node(myControl.focus_next).grab_focus() + break + get_viewport().set_input_as_handled() + #When the furnitureImageDisplay is clicked, the user will be prompted to select an image from # "res://Mods/Core/Furnitures/". The texture of the furnitureImageDisplay will change to the selected image func _on_furniture_image_display_gui_input(event): diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index 6eec5973..1b83ff3c 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -3,6 +3,7 @@ extends Control @export var contentList: PackedScene = null @export var mapEditor: PackedScene = null @export var terrainTileEditor: PackedScene = null +@export var furnitureEditor: PackedScene = null @export var mobEditor: PackedScene = null @export var content: VBoxContainer = null @export var tabContainer: TabContainer = null @@ -43,6 +44,8 @@ func _on_content_item_activated(data: Dictionary, itemID: String): return if data == Gamedata.data.tiles: instantiate_editor(data, itemID, terrainTileEditor) + if data == Gamedata.data.furniture: + instantiate_editor(data, itemID, furnitureEditor) if data == Gamedata.data.mobs: instantiate_editor(data, itemID, mobEditor) if data == Gamedata.data.maps: diff --git a/Scenes/ContentManager/contenteditor.tscn b/Scenes/ContentManager/contenteditor.tscn index 6d8705ca..e06ab44d 100644 --- a/Scenes/ContentManager/contenteditor.tscn +++ b/Scenes/ContentManager/contenteditor.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=6 format=3 uid="uid://480xqusluqrk"] +[gd_scene load_steps=7 format=3 uid="uid://480xqusluqrk"] [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/contenteditor.gd" id="1_65sl4"] [ext_resource type="PackedScene" uid="uid://bhh0v7x4fjsgi" path="res://Scenes/ContentManager/content_list.tscn" id="2_4f21i"] [ext_resource type="PackedScene" uid="uid://d3001f5xxpup1" path="res://Scenes/ContentManager/Mapeditor/mapeditor.tscn" id="3_q062s"] [ext_resource type="PackedScene" uid="uid://vfj2if40vf10" path="res://Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn" id="4_5nnw0"] [ext_resource type="PackedScene" uid="uid://drby7yfu8t38e" path="res://Scenes/ContentManager/Custom_Editors/MobEditor.tscn" id="5_86se2"] +[ext_resource type="PackedScene" uid="uid://cng4m3os6smj8" path="res://Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn" id="5_r1dle"] [node name="contenteditor" type="Control" node_paths=PackedStringArray("content", "tabContainer")] layout_mode = 3 @@ -17,6 +18,7 @@ script = ExtResource("1_65sl4") contentList = ExtResource("2_4f21i") mapEditor = ExtResource("3_q062s") terrainTileEditor = ExtResource("4_5nnw0") +furnitureEditor = ExtResource("5_r1dle") mobEditor = ExtResource("5_86se2") content = NodePath("HSplitContainer/ContentLists/TabContainer2/Content") tabContainer = NodePath("HSplitContainer/TabContainer") diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index be7097eb..d3cac7f4 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -94,7 +94,7 @@ func duplicate_item_in_data(contentData: Dictionary, id: String, newID: String): print_debug("There should be code here for when a file in the gets duplicated") # This function appends a new object to an existing array -# Pass the array to this function and the value of the ID +# Pass the contentData dictionary to this function and the value of the ID # If the data directory ends in .json, it will append an object # The object that will be appended will be nothing more then {"id": id} # if the data directory does not end in .json, a new file will be added From ba5a6927d00fa2b0c99a93137bd99f661c7f0486 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:49:24 +0100 Subject: [PATCH 078/138] Paint furniture in map editur --- .../Mapeditor/Scripts/GridContainer.gd | 25 +++++++++-- .../Mapeditor/Scripts/TilebrushList.gd | 22 +++++++++- .../Mapeditor/Scripts/mapeditortile.gd | 43 +++++++++++++------ .../Mapeditor/mapeditortile.tscn | 6 +-- 4 files changed, 77 insertions(+), 19 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 583bbe8f..c04d88e4 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -127,7 +127,7 @@ func grid_tile_clicked(clicked_tile): if is_drawing: paint_single_tile(clicked_tile) -#We paint a single tile if draw rectangle is not selected +# We paint a single tile if draw rectangle is not selected # Either erase the tile or paint it if a brush is selected. func paint_single_tile(clicked_tile): if drawRectangle or !clicked_tile: @@ -136,6 +136,8 @@ func paint_single_tile(clicked_tile): if selected_brush: if selected_brush.entityType == "mob": clicked_tile.set_mob_id("") + elif selected_brush.entityType == "furniture": + clicked_tile.set_furniture_id("") else: clicked_tile.set_tile_id("") clicked_tile.set_rotation_amount(0) @@ -144,6 +146,8 @@ func paint_single_tile(clicked_tile): elif selected_brush: if selected_brush.entityType == "mob": clicked_tile.set_mob_id(selected_brush.tileID) + elif selected_brush.entityType == "furniture": + clicked_tile.set_furniture_id(selected_brush.tileID) else: clicked_tile.set_tile_id(selected_brush.tileID) clicked_tile.set_rotation_amount(rotationAmount) @@ -229,10 +233,25 @@ func paint_in_rectangle(): var tiles: Array = get_tiles_in_rectangle(start_point, end_point) if erase: for tile in tiles: - tile.set_default() + if selected_brush: + if selected_brush.entityType == "mob": + tile.set_mob_id("") + elif selected_brush.entityType == "furniture": + tile.set_furniture_id("") + else: + tile.set_tile_id("") + tile.set_rotation_amount(0) + else: + tile.set_default() elif selected_brush: for tile in tiles: - tile.set_tile_id(selected_brush.tileID) + if selected_brush.entityType == "mob": + tile.set_mob_id(selected_brush.tileID) + elif selected_brush.entityType == "furniture": + tile.set_furniture_id(selected_brush.tileID) + else: + tile.set_tile_id(selected_brush.tileID) + tile.set_rotation_amount(rotationAmount) update_rectangle() #The user has pressed the erase toggle button in the editor diff --git a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd index d297e2a7..71d43cd2 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/TilebrushList.gd @@ -14,11 +14,11 @@ var selected_brush: Control: func _ready(): loadMobs() loadTiles() + loadFurniture() # this function will read all files in Gamedata.data.tiles.data and creates tilebrushes for each tile in the list. It will make separate lists for each category that the tiles belong to. func loadMobs(): var mobList: Array = Gamedata.data.mobs.data - var newMobsList: Control = scrolling_Flow_Container.instantiate() newMobsList.header = "Mobs" add_child(newMobsList) @@ -41,6 +41,26 @@ func loadMobs(): newMobsList.add_content_item(brushInstance) instanced_brushes.append(brushInstance) +func loadFurniture(): + var furnitureList: Array = Gamedata.data.furniture.data + var newFurnitureList: Control = scrolling_Flow_Container.instantiate() + newFurnitureList.header = "Furniture" + add_child(newFurnitureList) + + for item in furnitureList: + if item.has("sprite"): + var imagefileName: String = item["sprite"] + imagefileName = imagefileName.get_file() + var texture: Resource = Gamedata.data.furniture.sprites[imagefileName] + var brushInstance = tileBrush.instantiate() + brushInstance.set_tile_texture(texture) + brushInstance.tileID = item.id + brushInstance.tilebrush_clicked.connect(tilebrush_clicked) + brushInstance.entityType = "furniture" + newFurnitureList.add_content_item(brushInstance) + instanced_brushes.append(brushInstance) + + # this function will read all files in Gamedata.data.tiles.data and creates tilebrushes for each tile in the list. It will make separate lists for each category that the tiles belong to. func loadTiles(): var tileList: Array = Gamedata.data.tiles.data diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index 6d15d02b..1be30c4b 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -13,14 +13,18 @@ var tileData: Dictionary = defaultTileData.duplicate(): tileData.id).albedo_texture if tileData.has("rotation"): set_rotation_amount(tileData.rotation) - if tileData.has("mob"): - $MobSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.mobs,\ + if tileData.has("furniture"): + $MobFurnitureSprite.texture = Gamedata.get_sprite_by_id(\ + Gamedata.data.furniture, tileData.furniture) + $MobFurnitureSprite.show() + elif tileData.has("mob"): + $MobFurnitureSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.mobs,\ tileData.mob) - $MobSprite.show() + $MobFurnitureSprite.show() else: $TileSprite.texture = load(defaultTexture) - $MobSprite.texture = null - $MobSprite.hide() + $MobFurnitureSprite.texture = null + $MobFurnitureSprite.hide() signal tile_clicked(clicked_tile: Control) func _on_texture_rect_gui_input(event: InputEvent) -> void: @@ -52,11 +56,26 @@ func set_tile_id(id: String) -> void: func set_mob_id(id: String) -> void: if id == "": tileData.erase("mob") - $MobSprite.hide() + if !tileData.has("furniture"): + $MobFurnitureSprite.hide() else: + # A tile can either have a mob or furniture. If we add a mob, remove furniture + tileData.erase("furniture") tileData.mob = id - $MobSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.mobs, id) - $MobSprite.show() + $MobFurnitureSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.mobs, id) + $MobFurnitureSprite.show() + +func set_furniture_id(id: String) -> void: + if id == "": + tileData.erase("furniture") + if !tileData.has("mob"): + $MobFurnitureSprite.hide() + else: + # A tile can either have a mob or furniture. If we add furniture, remove the mob + tileData.erase("mob") + tileData.furniture = id + $MobFurnitureSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.furniture, id) + $MobFurnitureSprite.show() func _on_texture_rect_mouse_entered() -> void: if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): @@ -75,13 +94,13 @@ func set_clickable(clickable: bool): if !clickable: mouse_filter = MOUSE_FILTER_IGNORE $TileSprite.mouse_filter = MOUSE_FILTER_IGNORE - $MobSprite.mouse_filter = MOUSE_FILTER_IGNORE + $MobFurnitureSprite.mouse_filter = MOUSE_FILTER_IGNORE #This function sets the texture to some static resource that helps the user visualize that something is above #If this tile has a texture in its data, set it to the above texture instead func set_above(): - $MobSprite.texture = null - $MobSprite.hide() + $MobFurnitureSprite.texture = null + $MobFurnitureSprite.hide() if tileData.id != "": $TileSprite.texture = load(aboveTexture) else: @@ -90,4 +109,4 @@ func set_above(): func _on_texture_rect_resized(): $TileSprite.pivot_offset = size / 2 - $MobSprite.pivot_offset = size / 2 + $MobFurnitureSprite.pivot_offset = size / 2 diff --git a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn index 08f234b4..37d22fca 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn @@ -23,7 +23,7 @@ grow_vertical = 2 texture = ExtResource("2_rued1") expand_mode = 3 -[node name="MobSprite" type="TextureRect" parent="."] +[node name="MobFurnitureSprite" type="TextureRect" parent="."] visible = false layout_mode = 1 anchors_preset = -1 @@ -37,5 +37,5 @@ expand_mode = 3 [connection signal="gui_input" from="TileSprite" to="." method="_on_texture_rect_gui_input"] [connection signal="mouse_entered" from="TileSprite" to="." method="_on_texture_rect_mouse_entered"] [connection signal="resized" from="TileSprite" to="." method="_on_texture_rect_resized"] -[connection signal="gui_input" from="MobSprite" to="." method="_on_texture_rect_gui_input"] -[connection signal="mouse_entered" from="MobSprite" to="." method="_on_texture_rect_mouse_entered"] +[connection signal="gui_input" from="MobFurnitureSprite" to="." method="_on_texture_rect_gui_input"] +[connection signal="mouse_entered" from="MobFurnitureSprite" to="." method="_on_texture_rect_mouse_entered"] From 9b3c2ce6c24ad769152a7e5c5e94580154b63365 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 14 Jan 2024 13:28:28 +0100 Subject: [PATCH 079/138] add furniture to game --- Defaults/Furniture/FurniturePhysics.tscn | 20 +++++++++++ LevelGenerator.gd | 12 +++++++ Mods/Core/Furniture/table_64.png.import | 13 +++---- Mods/Core/Maps/Generichouse.json | 7 ++-- Scripts/FurniturePhysics.gd | 44 ++++++++++++++++++++++++ level_generation.tscn | 4 ++- 6 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 Defaults/Furniture/FurniturePhysics.tscn create mode 100644 Scripts/FurniturePhysics.gd diff --git a/Defaults/Furniture/FurniturePhysics.tscn b/Defaults/Furniture/FurniturePhysics.tscn new file mode 100644 index 00000000..3d0ace93 --- /dev/null +++ b/Defaults/Furniture/FurniturePhysics.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=5 format=3 uid="uid://cpmwu7v1r8cg8"] + +[ext_resource type="Script" path="res://Scripts/FurniturePhysics.gd" id="1_klkkl"] +[ext_resource type="Texture2D" uid="uid://cqfqxgp12asw1" path="res://Mods/Core/Furniture/table_64.png" id="1_q67ig"] +[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/mob_corpse.tscn" id="2_jy8nl"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_wo3ev"] +radius = 0.2 + +[node name="FurniturePhysics" type="RigidBody3D"] +mass = 0.1 +script = ExtResource("1_klkkl") +corpse_scene = ExtResource("2_jy8nl") + +[node name="Sprite3D" type="Sprite3D" parent="."] +billboard = 1 +texture = ExtResource("1_q67ig") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_wo3ev") diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 69b78de4..39eb3810 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -13,6 +13,7 @@ var level_height : int = 32 @onready var defaultSlope: PackedScene = preload("res://Defaults/Blocks/default_slope.tscn") @export var defaultMob: PackedScene @export var defaultItem: PackedScene +@export var defaultFurniturePhysics: PackedScene @export var level_manager : Node3D @export_file var default_level_json @@ -115,6 +116,7 @@ func generate_level() -> void: block.id = tileJSON.id apply_block_rotation(tileJSON, block) add_block_mob(tileJSON, block) + add_furniture_to_block(tileJSON, block) current_block += 1 level_number += 1 @@ -133,6 +135,16 @@ func get_custom_level_json(level_path): var json_as_dict = JSON.parse_string(level_json_as_text) level_levels = json_as_dict["levels"] +func add_furniture_to_block(tileJSON: Dictionary, block: StaticBody3D): + if tileJSON.has("furniture"): + var newFurniture: Node3D = defaultFurniturePhysics.instantiate() + newFurniture.add_to_group("furniture") + newFurniture.set_sprite(Gamedata.get_sprite_by_id(\ + Gamedata.data.furniture, tileJSON.furniture)) + get_tree().get_root().add_child(newFurniture) + newFurniture.global_position.x = block.global_position.x + newFurniture.global_position.y = block.global_position.y+0.5 + newFurniture.global_position.z = block.global_position.z func apply_block_rotation(tileJSON: Dictionary, block: StaticBody3D): if tileJSON.has("rotation"): diff --git a/Mods/Core/Furniture/table_64.png.import b/Mods/Core/Furniture/table_64.png.import index 1a2379e3..c3595c22 100644 --- a/Mods/Core/Furniture/table_64.png.import +++ b/Mods/Core/Furniture/table_64.png.import @@ -3,25 +3,26 @@ importer="texture" type="CompressedTexture2D" uid="uid://cqfqxgp12asw1" -path="res://.godot/imported/table_64.png-2a25967c15d24af83aad9c2836306f55.ctex" +path.s3tc="res://.godot/imported/table_64.png-2a25967c15d24af83aad9c2836306f55.s3tc.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc"], +"vram_texture": true } [deps] source_file="res://Mods/Core/Furniture/table_64.png" -dest_files=["res://.godot/imported/table_64.png-2a25967c15d24af83aad9c2836306f55.ctex"] +dest_files=["res://.godot/imported/table_64.png-2a25967c15d24af83aad9c2836306f55.s3tc.ctex"] [params] -compress/mode=0 +compress/mode=2 compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 compress/normal_map=0 compress/channel_pack=0 -mipmaps/generate=false +mipmaps/generate=true mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -31,4 +32,4 @@ 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 +detect_3d/compress_to=0 diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index 97934407..ae70bafe 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -4934,7 +4934,6 @@ }, { "id": "grass_plain_01", - "mob": "scrapwalker", "rotation": 0 }, { @@ -5079,7 +5078,6 @@ }, { "id": "grass_plain_01", - "mob": "scrapwalker", "rotation": 0 }, { @@ -5340,7 +5338,6 @@ }, { "id": "grass_plain_01", - "mob": "scrapwalker", "rotation": 0 }, { @@ -6137,6 +6134,7 @@ }, { "id": "grass_plain_01", + "mob": "scrapwalker", "rotation": 0 }, { @@ -6265,6 +6263,7 @@ }, { "id": "grass_plain_01", + "mob": "scrapwalker", "rotation": 0 }, { @@ -6308,6 +6307,7 @@ "rotation": 0 }, { + "furniture": "table_round_wood", "id": "grass_plain_01", "rotation": 0 }, @@ -6436,6 +6436,7 @@ "rotation": 0 }, { + "furniture": "chair_wood", "id": "grass_plain_01", "rotation": 0 }, diff --git a/Scripts/FurniturePhysics.gd b/Scripts/FurniturePhysics.gd new file mode 100644 index 00000000..6b47a65b --- /dev/null +++ b/Scripts/FurniturePhysics.gd @@ -0,0 +1,44 @@ +extends RigidBody3D + +var tween: Tween +var original_scale +# id for the mob json. this will be used to load the data when creating a mob +# when saving a mob in between levels, we will use some static json defined by this id +# and some dynamic json like the mob health and buffs and debuffs +var id: String + +@export var corpse_scene: PackedScene +var current_health: float = 10.0 + +func _ready(): + pass + #3d +# original_scale = get_node(sprite).scale + +func _get_hit(damage): + + #3d +# tween = create_tween() +# tween.tween_property(get_node(sprite), "scale", get_node(sprite).scale * 1.35, 0.1) +# tween.tween_property(get_node(sprite), "scale", original_scale, 0.1) + + current_health -= damage + if current_health <= 0: + _die() + +func _die(): + add_corpse.call_deferred(global_position) + queue_free() + +func add_corpse(pos: Vector3): + var corpse = corpse_scene.instantiate() + get_tree().get_root().add_child(corpse) + corpse.global_position = pos + corpse.add_to_group("mapitems") + +func set_sprite(newSprite: Resource): + $Sprite3D.texture = newSprite + #var material := StandardMaterial3D.new() + #material.albedo_texture = newSprite # Set the texture of the material + #material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + #$MeshInstance3D.mesh.surface_set_material(0, material) diff --git a/level_generation.tscn b/level_generation.tscn index 050cda02..c81696ab 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=26 format=3 uid="uid://drl78uuphij1l"] +[gd_scene load_steps=27 format=3 uid="uid://drl78uuphij1l"] [ext_resource type="Script" path="res://LevelGenerator.gd" id="1_i8qa4"] [ext_resource type="Script" path="res://LevelManager.gd" id="2_gm6x7"] [ext_resource type="PackedScene" uid="uid://b2r6nh12wv41k" path="res://Defaults/Mobs/mob.tscn" id="2_jhj6h"] [ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/mob_corpse.tscn" id="3_l8ooc"] +[ext_resource type="PackedScene" uid="uid://cpmwu7v1r8cg8" path="res://Defaults/Furniture/FurniturePhysics.tscn" id="4_30bqp"] [ext_resource type="Script" path="res://Scripts/BuildManager.gd" id="6_y7rk5"] [ext_resource type="Script" path="res://Scripts/player.gd" id="8_gposs"] [ext_resource type="Script" path="res://Scripts/Camera.gd" id="9_gi6l6"] @@ -66,6 +67,7 @@ radius = 1.5 script = ExtResource("1_i8qa4") defaultMob = ExtResource("2_jhj6h") defaultItem = ExtResource("3_l8ooc") +defaultFurniturePhysics = ExtResource("4_30bqp") level_manager = NodePath("../NavigationRegion3D/LevelManager") default_level_json = "res://Mods/Core/Maps/Generichouse.json" From 48f21e9877018b71989020851bc42d464a49e9f3 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 14 Jan 2024 23:56:52 +0100 Subject: [PATCH 080/138] Basic physics for furniture --- Defaults/Blocks/default_slope.tscn | 1 + Defaults/Furniture/FurniturePhysics.tscn | 8 +++++--- Defaults/Mobs/mob.tscn | 2 +- level_generation.tscn | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Defaults/Blocks/default_slope.tscn b/Defaults/Blocks/default_slope.tscn index d469c2ac..596d4fa2 100644 --- a/Defaults/Blocks/default_slope.tscn +++ b/Defaults/Blocks/default_slope.tscn @@ -13,6 +13,7 @@ points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, 0.5, [node name="StairsToN001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0) disable_mode = 1 +collision_layer = 33 script = ExtResource("1_x2ar8") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] diff --git a/Defaults/Furniture/FurniturePhysics.tscn b/Defaults/Furniture/FurniturePhysics.tscn index 3d0ace93..7aedcb62 100644 --- a/Defaults/Furniture/FurniturePhysics.tscn +++ b/Defaults/Furniture/FurniturePhysics.tscn @@ -4,11 +4,13 @@ [ext_resource type="Texture2D" uid="uid://cqfqxgp12asw1" path="res://Mods/Core/Furniture/table_64.png" id="1_q67ig"] [ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/mob_corpse.tscn" id="2_jy8nl"] -[sub_resource type="SphereShape3D" id="SphereShape3D_wo3ev"] +[sub_resource type="SphereShape3D" id="SphereShape3D_vweei"] radius = 0.2 [node name="FurniturePhysics" type="RigidBody3D"] -mass = 0.1 +collision_layer = 32 +collision_mask = 32 +linear_damp = 59.0 script = ExtResource("1_klkkl") corpse_scene = ExtResource("2_jy8nl") @@ -17,4 +19,4 @@ billboard = 1 texture = ExtResource("1_q67ig") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("SphereShape3D_wo3ev") +shape = SubResource("SphereShape3D_vweei") diff --git a/Defaults/Mobs/mob.tscn b/Defaults/Mobs/mob.tscn index e07fefa9..338ee2bb 100644 --- a/Defaults/Mobs/mob.tscn +++ b/Defaults/Mobs/mob.tscn @@ -31,7 +31,7 @@ size = Vector2(0.5, 0.5) orientation = 1 [node name="Mob" type="CharacterBody3D" groups=["Enemies"]] -collision_layer = 2 +collision_layer = 34 collision_mask = 15 wall_min_slide_angle = 0.0 floor_constant_speed = true diff --git a/level_generation.tscn b/level_generation.tscn index c81696ab..1cd46fba 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -148,6 +148,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.4043, 0, -8.78679) [node name="Player" type="CharacterBody3D" parent="TacticalMap/Entities" node_paths=PackedStringArray("sprite") groups=["Players"]] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 15) +collision_layer = 33 floor_constant_speed = true floor_max_angle = 0.872665 script = ExtResource("8_gposs") From 5a4326d7276e808ee3b2f43ff5bfc320429d47bb Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 15 Jan 2024 13:11:44 +0100 Subject: [PATCH 081/138] Adjust layers --- Defaults/Blocks/default_slope.tscn | 1 - Defaults/Furniture/FurniturePhysics.tscn | 4 ++-- Defaults/Mobs/mob.tscn | 4 ++-- Mods/Core/Maps/Generichouse.json | 6 ++++-- level_generation.tscn | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Defaults/Blocks/default_slope.tscn b/Defaults/Blocks/default_slope.tscn index 596d4fa2..d469c2ac 100644 --- a/Defaults/Blocks/default_slope.tscn +++ b/Defaults/Blocks/default_slope.tscn @@ -13,7 +13,6 @@ points = PackedVector3Array(0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, 0.5, [node name="StairsToN001" type="StaticBody3D" groups=["navigation_mesh_source_group"]] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0) disable_mode = 1 -collision_layer = 33 script = ExtResource("1_x2ar8") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] diff --git a/Defaults/Furniture/FurniturePhysics.tscn b/Defaults/Furniture/FurniturePhysics.tscn index 7aedcb62..33d87a00 100644 --- a/Defaults/Furniture/FurniturePhysics.tscn +++ b/Defaults/Furniture/FurniturePhysics.tscn @@ -8,8 +8,8 @@ radius = 0.2 [node name="FurniturePhysics" type="RigidBody3D"] -collision_layer = 32 -collision_mask = 32 +collision_layer = 4 +collision_mask = 7 linear_damp = 59.0 script = ExtResource("1_klkkl") corpse_scene = ExtResource("2_jy8nl") diff --git a/Defaults/Mobs/mob.tscn b/Defaults/Mobs/mob.tscn index 338ee2bb..4a454268 100644 --- a/Defaults/Mobs/mob.tscn +++ b/Defaults/Mobs/mob.tscn @@ -31,8 +31,8 @@ size = Vector2(0.5, 0.5) orientation = 1 [node name="Mob" type="CharacterBody3D" groups=["Enemies"]] -collision_layer = 34 -collision_mask = 15 +collision_layer = 2 +collision_mask = 3 wall_min_slide_angle = 0.0 floor_constant_speed = true script = ExtResource("1_ajqy0") diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index ae70bafe..79dfd557 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -5169,6 +5169,7 @@ "rotation": 0 }, { + "furniture": "table_round_wood", "id": "grass_plain_01", "rotation": 0 }, @@ -5297,6 +5298,7 @@ "rotation": 0 }, { + "furniture": "chair_wood", "id": "grass_plain_01", "rotation": 0 }, @@ -6202,6 +6204,7 @@ "rotation": 0 }, { + "furniture": "table_round_wood", "id": "orange_carpet_00", "rotation": 0 }, @@ -6307,7 +6310,6 @@ "rotation": 0 }, { - "furniture": "table_round_wood", "id": "grass_plain_01", "rotation": 0 }, @@ -6332,6 +6334,7 @@ "rotation": 0 }, { + "furniture": "chair_wood", "id": "orange_carpet_00", "rotation": 0 }, @@ -6436,7 +6439,6 @@ "rotation": 0 }, { - "furniture": "chair_wood", "id": "grass_plain_01", "rotation": 0 }, diff --git a/level_generation.tscn b/level_generation.tscn index 1cd46fba..661e1fd6 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -148,7 +148,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.4043, 0, -8.78679) [node name="Player" type="CharacterBody3D" parent="TacticalMap/Entities" node_paths=PackedStringArray("sprite") groups=["Players"]] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 15) -collision_layer = 33 +collision_mask = 3 floor_constant_speed = true floor_max_angle = 0.872665 script = ExtResource("8_gposs") From d45d8129bd9ba086ae0bd083ccf38846de83cdce Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 15 Jan 2024 13:40:09 +0100 Subject: [PATCH 082/138] Save and load furniture --- LevelGenerator.gd | 21 ++++++++++++++++++++- Scripts/Helper/save_helper.gd | 24 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 39eb3810..14a6fb2c 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -27,9 +27,10 @@ func _ready(): func generate_map(): map_save_folder = Helper.save_helper.get_saved_map_folder(Helper.current_level_pos) generate_level() - # These two functions apply only to maps thet were previously saved in a save game + # These tree functions apply only to maps thet were previously saved in a save game generate_mobs() generate_items() + generate_furniture() func generate_mobs() -> void: @@ -65,6 +66,23 @@ func add_item_to_map(item: Dictionary): newItem.global_position.z = item.global_position_z newItem.get_node(newItem.inventory).deserialize(item.inventory) +func generate_furniture() -> void: + if map_save_folder == "": + return + var furnitureArray = Helper.json_helper.load_json_array_file(map_save_folder + "/furniture.json") + for furnitureData: Dictionary in furnitureArray: + add_furniture_to_map.call_deferred(furnitureData) + +func add_furniture_to_map(furnitureData: Dictionary) -> void: + var newFurniture: Node3D = defaultFurniturePhysics.instantiate() + newFurniture.add_to_group("furniture") + newFurniture.set_sprite(Gamedata.get_sprite_by_id(Gamedata.data.furniture, furnitureData.id)) + get_tree().get_root().add_child(newFurniture) + newFurniture.global_position.x = furnitureData.global_position_x + newFurniture.global_position.y = furnitureData.global_position_y + newFurniture.global_position.z = furnitureData.global_position_z + newFurniture.id = furnitureData.id + # Generate the map layer by layer # For each layer, add all the blocks with proper rotation # If a block has an mob, add it too @@ -145,6 +163,7 @@ func add_furniture_to_block(tileJSON: Dictionary, block: StaticBody3D): newFurniture.global_position.x = block.global_position.x newFurniture.global_position.y = block.global_position.y+0.5 newFurniture.global_position.z = block.global_position.z + newFurniture.id = tileJSON.furniture func apply_block_rotation(tileJSON: Dictionary, block: StaticBody3D): if tileJSON.has("rotation"): diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 5b08740d..99273e21 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -21,6 +21,7 @@ func save_current_level(global_pos: Vector2) -> void: save_map_data(target_folder) save_mob_data(target_folder) save_item_data(target_folder) + save_furniture_data(target_folder) #Creates a new save folder. The name of this folder will be the current date and time #This is to make sure it is unique. The folder name is stored in order to perform @@ -73,6 +74,29 @@ func save_item_data(target_folder: String) -> void: item.queue_free() Helper.json_helper.write_json_file(target_folder + "/items.json",\ JSON.stringify(itemData)) + +# Save the type and position of all furniture on the map +func save_furniture_data(target_folder: String) -> void: + var furnitureData: Array = [] + var defaultFurniture: Dictionary = { + "id": "table_round_wood", + "global_position_x": 0, + "global_position_y": 0, + "global_position_z": 0 + } + var mapFurniture = get_tree().get_nodes_in_group("furniture") + var newFurnitureData: Dictionary + for furniture in mapFurniture: + furniture.remove_from_group("furniture") + newFurnitureData = defaultFurniture.duplicate() + newFurnitureData["global_position_x"] = furniture.global_position.x + newFurnitureData["global_position_y"] = furniture.global_position.y + newFurnitureData["global_position_z"] = furniture.global_position.z + newFurnitureData["id"] = furniture.id + furnitureData.append(newFurnitureData.duplicate()) + furniture.queue_free() + Helper.json_helper.write_json_file(target_folder + "/furniture.json", JSON.stringify(furnitureData)) + #The current state of the map is saved to disk #Starting from the bottom level (-10), loop over every level From 6222bbf01768de4397f1942fa94a942cb842ae90 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 15 Jan 2024 16:28:10 +0100 Subject: [PATCH 083/138] Create map icons --- Images/Icons/IconCameraUnchecked.png | Bin 0 -> 272 bytes Images/Icons/IconCameraUnchecked.png.import | 34 +++++++++++++++ Mods/Core/Maps/Generichouse.png | Bin 0 -> 898 bytes Mods/Core/Maps/Generichouse.png.import | 34 +++++++++++++++ .../Mapeditor/Scripts/GridContainer.gd | 39 ++++++++++++++++++ .../Mapeditor/Scripts/mapeditortile.gd | 3 ++ .../ContentManager/Mapeditor/mapeditor.tscn | 10 ++++- Scenes/ContentManager/Scripts/content_list.gd | 18 ++++++-- Scripts/gamedata.gd | 4 +- 9 files changed, 136 insertions(+), 6 deletions(-) create mode 100644 Images/Icons/IconCameraUnchecked.png create mode 100644 Images/Icons/IconCameraUnchecked.png.import create mode 100644 Mods/Core/Maps/Generichouse.png create mode 100644 Mods/Core/Maps/Generichouse.png.import diff --git a/Images/Icons/IconCameraUnchecked.png b/Images/Icons/IconCameraUnchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..d06808dafcfd7d92aaf2bbe068326d5cf7b0d9a0 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`iaH*$@V~B_M)oG4gM-&8D{{G)y6H(^iQFW`x zn7#F`b7SyJxr4z`@Bdnzd>?Zm$~&N~BS%k;;i+H1yA+uxXN7*vJEEok?x(`1GSL<4 z#;3L{Xev*2n|VrfOZJ&bVj&A+59+LpX)I&iyrhWrmgt#Dr$jTt4fy0fe3HIpdhDR{ zz6ZSTPxXNHepU{Dn7`)JqoM~48s$wz^1tS3Z;%MM_VfGxuDV(VRk53n=cmeY03FQW M>FVdQ&MBb@0F9k!Y5)KL literal 0 HcmV?d00001 diff --git a/Images/Icons/IconCameraUnchecked.png.import b/Images/Icons/IconCameraUnchecked.png.import new file mode 100644 index 00000000..a4253305 --- /dev/null +++ b/Images/Icons/IconCameraUnchecked.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dd700uhgg8oly" +path="res://.godot/imported/IconCameraUnchecked.png-37aa470dd8dfc2340ab5b83a51e9bcda.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Images/Icons/IconCameraUnchecked.png" +dest_files=["res://.godot/imported/IconCameraUnchecked.png-37aa470dd8dfc2340ab5b83a51e9bcda.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Mods/Core/Maps/Generichouse.png b/Mods/Core/Maps/Generichouse.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce015b61af6afb2db4d8a37a636bce6cdab26c8 GIT binary patch literal 898 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>V7BpeaSW-L z^Y*TNws4`$@sICScdGFEMt4725TU`5SNf5&<444uBfc^&TwGd@9w>kKX<_kND??W6 z@8l|9z4E+EX&X+@o&NfF?d|GJ`z_9KJL7k#tS`Gi#dFe;8oT~Q8jG&KZaw?bZ<5Ny zWtlv`nl%=2NMCz@zfME__+$?&&mOnM9UU7i=kBTdxvr-pB3AaeXPJy^T-(`~F3cOE znJ+|x$OB+Rb+%4rzVG)(1)Id%_xB~|Zjp00FE?RW`MXl=ug;@y-{wZh_iO+Ex%Xkg zkME|5wR`H`nI6j9xB2h-z%%KElTt5AKMVZ&-8WTDBKH%P)KU&dkY)>D)7;^=^)SoPGUy zrTCY}x4*Z4bn98z)BXM+4_~;wnW3y&p5dMp5H$eNT_9ttbizlQ>fFy+t9QSu{^(o& z{ovnr{YxgjdCR3Q*GTQn(_i)G_43~n{rw&vTl@Bfs^^!}d#=`Q*%bNm{_>COe(L}= zTU*cAx=a7|P0zRKjNRWi-M;5LUv$emodxgCZ`u0SxYD=$?RUmkcIV6fPpX##30}RM zdw+ikTgETb{%!Hh2fk-B{HWt)xWAt9!EaNBn*D4I@2@j__$$S*k7|sUaV!j0cKE#{g>TQ*`uZ- TD5nLOsTe$6{an^LB{Ts5_#Cr* literal 0 HcmV?d00001 diff --git a/Mods/Core/Maps/Generichouse.png.import b/Mods/Core/Maps/Generichouse.png.import new file mode 100644 index 00000000..a219a4bc --- /dev/null +++ b/Mods/Core/Maps/Generichouse.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bq1oiga41ewua" +path="res://.godot/imported/Generichouse.png-86ae7b36df394286470e1b8919df1575.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Maps/Generichouse.png" +dest_files=["res://.godot/imported/Generichouse.png-86ae7b36df394286470e1b8919df1575.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index c04d88e4..98570ddd 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -318,3 +318,42 @@ func _on_rotate_right_button_up(): buttonRotateRight.text = str(rotationAmount) brushPreviewTexture.rotation_degrees = rotationAmount brushPreviewTexture.pivot_offset = brushPreviewTexture.size / 2 + + +# Function to create a 128x128 miniature map of the current level +func create_miniature_map_image() -> Image: + var map_width = mapEditor.mapWidth + var map_height = mapEditor.mapHeight + var tile_width = int(128 / map_width) # Calculate tile width for the miniature map + var tile_height = int(128 / map_height) # Calculate tile height for the miniature map + + # Create a new Image with a size of 128x128 pixels + var image = Image.create(128, 128, false, Image.FORMAT_RGBA8) + + # Iterate through each tile in the current level and draw it into the image + for x in range(map_width): + for y in range(map_height): + var tile = get_child(y * map_width + x) + var tile_texture = tile.get_tile_texture() + var tile_image = tile_texture.get_image() + # Resize the tile image to fit the miniature map + tile_image.resize(tile_width, tile_height) + # Convert the tile image to the same format as the main image + tile_image.convert(Image.FORMAT_RGBA8) + # Draw the resized tile image onto the main image + image.blit_rect(tile_image, Rect2(Vector2(), \ + tile_image.get_size()), Vector2(x * tile_width, y * tile_height)) + return image + +# Function to create and save a 128x128 miniature map of the current level +func save_miniature_map_image(): + # Call the function to create the image texture + var image_texture = create_miniature_map_image() + var image = image_texture + # Save the image to a file + var file_name = mapEditor.contentSource.get_file().replace("json", "png") + var file_path = Gamedata.data.maps.spritePath + file_name + image.save_png(file_path) + +func _on_create_preview_image_button_button_up(): + save_miniature_map_image() diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index 1be30c4b..c35bd63d 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -110,3 +110,6 @@ func set_above(): func _on_texture_rect_resized(): $TileSprite.pivot_offset = size / 2 $MobFurnitureSprite.pivot_offset = size / 2 + +func get_tile_texture(): + return $TileSprite.texture diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index ffa37d9f..570bfe1f 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=22 format=3 uid="uid://d3001f5xxpup1"] +[gd_scene load_steps=23 format=3 uid="uid://d3001f5xxpup1"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd" id="1_0c7s4"] [ext_resource type="PackedScene" uid="uid://bswccbbg6ijep" path="res://Scenes/ContentManager/Mapeditor/Toolbar/mapeditorzoomscroller.tscn" id="1_0ytmu"] +[ext_resource type="Texture2D" uid="uid://dd700uhgg8oly" path="res://Images/Icons/IconCameraUnchecked.png" id="2_bib5l"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd" id="2_sf17m"] [ext_resource type="Texture2D" uid="uid://b6m2bbbpmsyik" path="res://Images/Icons/IconRotateRightDark.png" id="3_8q2iq"] [ext_resource type="Texture2D" uid="uid://cxhp6hye2ufp2" path="res://Images/Icons/IconRectangleUnchecked.png" id="3_70koh"] @@ -77,6 +78,12 @@ size_flags_horizontal = 3 size_flags_stretch_ratio = 0.15 text = "Save" +[node name="CreatePreviewImageButton" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +tooltip_text = "Creates a miniature image of the map in the /mods/core/maps folder. The file name will be the ID of the map + png. " +theme_override_icons/checked = ExtResource("2_bib5l") +theme_override_icons/unchecked = ExtResource("2_bib5l") + [node name="ZoomScroller" parent="HSplitContainer/MapeditorContainer/Toolbar" instance=ExtResource("1_0ytmu")] layout_mode = 2 size_flags_horizontal = 3 @@ -254,6 +261,7 @@ offset_bottom = 40.0 [connection signal="zoom_level_changed" from="." to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_zoom_level_changed"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/CloseButton" to="." method="_on_close_button_button_up"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/SaveButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="save_map_json_file"] +[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/CreatePreviewImageButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_create_preview_image_button_button_up"] [connection signal="zoom_level_changed" from="HSplitContainer/MapeditorContainer/Toolbar/ZoomScroller" to="." method="_on_zoom_scroller_zoom_level_changed"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/RotateRight" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_rotate_right_button_up"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_draw_rectangle_toggled"] diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 48d9a163..9801d363 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -60,13 +60,23 @@ func make_item_list(): contentItems.set_item_icon(item_index,mySprite) # Loops over the files in contentData.data (which are filenames) -# For each file a new item will be added to the list +# For each file, a new item will be added to the list func make_file_list() -> void: for file_name in contentData.data: + # Extract the base name without the extension + var base_name = file_name.get_basename() + # Add all the filenames to the ContentItems list as child nodes - var item_index: int = contentItems.add_item(file_name.replace(".json", "")) - #Add the ID as metadata which can be used to load the item data - contentItems.set_item_metadata(item_index, file_name.replace(".json", "")) + var item_index: int = contentItems.add_item(base_name) + # Add the ID as metadata which can be used to load the item data + contentItems.set_item_metadata(item_index, base_name) + + # If the file has an image to represent it's content, load it + if contentData.sprites.has(base_name + ".png"): + var mySprite: Resource = contentData.sprites[base_name + ".png"] + if mySprite: + contentItems.set_item_icon(item_index, mySprite) + # Executed when an item in ContentItems is double-clicked or # when the user selects an item in ContentItems and presses enter diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index d3cac7f4..37d69a14 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -23,6 +23,8 @@ func _ready(): data.furniture.dataPath = "./Mods/Core/Furniture/Furniture.json" data.overmaptiles.spritePath = "./Mods/Core/OvermapTiles/" data.maps.dataPath = "./Mods/Core/Maps/" + # Map preview images are stored in the same folder + data.maps.spritePath = "./Mods/Core/Maps/" load_sprites() load_tile_sprites() load_data() @@ -40,7 +42,7 @@ func load_data() -> void: data[dict].data = [] #This loads all the sprites and assigns them to the proper dictionary -func load_sprites(): +func load_sprites() -> void: for dict in data.keys(): if data[dict].has("spritePath"): var loaded_sprites: Dictionary = {} # Materials used to represent mobs From e1848e76128741fcd70f6938c029e6ce2202e481 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 15 Jan 2024 17:05:03 +0100 Subject: [PATCH 084/138] fix mapeditor bugs --- Mods/Core/Maps/Generichouse.png | Bin 898 -> 921 bytes .../Mapeditor/Scripts/mapeditortile.gd | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Mods/Core/Maps/Generichouse.png b/Mods/Core/Maps/Generichouse.png index 1ce015b61af6afb2db4d8a37a636bce6cdab26c8..ee85ef2bd4552b574b57cc41950af92415cc88a4 100644 GIT binary patch literal 921 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>U=H?laSW-L z^Y-rEyvqSHZ6CkO++L}D%gyP)nIkUS^X{-Ey`8F1`ua#|foaYf51t&4wJ!UE)VJMi zU|Ts=^tSrB-+#8Jdp+TKu72B6z2-;Boo%bbzHXY@G-Z0=7XRZq{94}@f1Ce2Yueh3 z^?j9+qDC+OtqS|7)AjAuhkt)^rMnkw%M{(bU{{vw?-IH6hv#Pnw0}D&<@mlXnc?#> zhG)HuXQY{Dn6nw=^CaApIIzdCp^_pAm3NbWg(QlGT;DotS>U|q{ok(tOy}9)E$b8z zC~|A|+m(TzQ<58GUvJXcx+8i;RM;%}bMxQqv$wDQ{O)MvZI4MJn-{#=C1@MBf0upO zv{WmrS+DDMUdW2HzjZ%<|Ce7sB@_y;m#!6P($m-fx9(?u$(--Ms}mV`HpFHxibiwx z`zvf5Z$#hRh4|^ST|;HDJd*cpcQEeS_j%jfyWg!VS5_A=m+Za1_wC%Ov+s6)-qVv6 zcDC7c(RsblSI>UADYBjAe?H0NrQENo-n-5A+%KxuSKr?KzWO6b+Zy}#^Zr^~KfO5Y zmuBo=u1Q<2-re)h;>G75S8R7NE;HMm*KqJXP|^8$w|M^A*j3(-T_e)HKwybP^RIVV zfh%W-T3J|JdHcxf>-(FPt6n|)E)TNfv9!Wh{ac0C_S>@^V2Iw@mfXZmB|Y|~B{xhYUGWCb?f1|9`~Cm#6gK9Z8^Q8C8xs9%4Gy%~ ze!W@B%u^S4z_WIhz_o98XBYh6?f<~+&G-G8oBb1x`|VBpe)o;=jg9U5;*!mOv&?!g qd}5~Kv$K_q2n^&?JBfi(>-+m+HUh@$wtRfd00f?{elF{r5}E+P1gaeX literal 898 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>V7BpeaSW-L z^Y*TNws4`$@sICScdGFEMt4725TU`5SNf5&<444uBfc^&TwGd@9w>kKX<_kND??W6 z@8l|9z4E+EX&X+@o&NfF?d|GJ`z_9KJL7k#tS`Gi#dFe;8oT~Q8jG&KZaw?bZ<5Ny zWtlv`nl%=2NMCz@zfME__+$?&&mOnM9UU7i=kBTdxvr-pB3AaeXPJy^T-(`~F3cOE znJ+|x$OB+Rb+%4rzVG)(1)Id%_xB~|Zjp00FE?RW`MXl=ug;@y-{wZh_iO+Ex%Xkg zkME|5wR`H`nI6j9xB2h-z%%KElTt5AKMVZ&-8WTDBKH%P)KU&dkY)>D)7;^=^)SoPGUy zrTCY}x4*Z4bn98z)BXM+4_~;wnW3y&p5dMp5H$eNT_9ttbizlQ>fFy+t9QSu{^(o& z{ovnr{YxgjdCR3Q*GTQn(_i)G_43~n{rw&vTl@Bfs^^!}d#=`Q*%bNm{_>COe(L}= zTU*cAx=a7|P0zRKjNRWi-M;5LUv$emodxgCZ`u0SxYD=$?RUmkcIV6fPpX##30}RM zdw+ikTgETb{%!Hh2fk-B{HWt)xWAt9!EaNBn*D4I@2@j__$$S*k7|sUaV!j0cKE#{g>TQ*`uZ- TD5nLOsTe$6{an^LB{Ts5_#Cr* diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index c35bd63d..836f3480 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -8,11 +8,12 @@ const aboveTexture: String = "res://Scenes/ContentManager/Mapeditor/Images/tileA var tileData: Dictionary = defaultTileData.duplicate(): set(data): tileData = data - if tileData.has("id"): + if tileData.has("id") and tileData.id != "": $TileSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles,\ tileData.id).albedo_texture if tileData.has("rotation"): set_rotation_amount(tileData.rotation) + $MobFurnitureSprite.hide() if tileData.has("furniture"): $MobFurnitureSprite.texture = Gamedata.get_sprite_by_id(\ Gamedata.data.furniture, tileData.furniture) @@ -101,7 +102,7 @@ func set_clickable(clickable: bool): func set_above(): $MobFurnitureSprite.texture = null $MobFurnitureSprite.hide() - if tileData.id != "": + if tileData.has("id") and tileData.id != "": $TileSprite.texture = load(aboveTexture) else: $TileSprite.texture = null From ed880953e53b8986ac17344935184408fb4bd207 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 15 Jan 2024 19:21:37 +0100 Subject: [PATCH 085/138] Initial tactical map editor --- .../Scripts/TacticalMapEditor.gd | 22 +++ .../TacticalMapEditor/Scripts/TileGrid.gd | 27 ++++ .../TacticalMapEditor/TacticalMapEditor.tscn | 137 ++++++++++++++++++ .../TacticalMapEditorTile.tscn | 9 ++ .../TacticalMapEditorTileBrush.tscn | 9 ++ project.godot | 1 + 6 files changed, 205 insertions(+) create mode 100644 Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd create mode 100644 Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd create mode 100644 Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn create mode 100644 Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn create mode 100644 Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTileBrush.tscn diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd new file mode 100644 index 00000000..36a190df --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd @@ -0,0 +1,22 @@ +extends Control + + +@export var tileGrid: GridContainer = null +@export var mapwidthTextEdit: TextEdit = null +@export var mapheightTextEdit: TextEdit = null + +var tileSize: int = 128 +var mapHeight: int = 3 +var mapWidth: int = 3 +var contentSource: String = "": + set(newSource): + contentSource = newSource + tileGrid.load_map_json_file() + + +func _on_map_height_text_changed(): + mapHeight = int(mapheightTextEdit.text) + +func _on_map_width_text_changed(): + mapWidth = int(mapwidthTextEdit.text) + diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd new file mode 100644 index 00000000..86a94c8c --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd @@ -0,0 +1,27 @@ +extends GridContainer + +@export var tileScene: PackedScene +#This is the index of the level we are on. 0 is ground level. can be -10 to +10 +var currentLevel: int = 10 +#Contains the data of every tile in the current level, the ground level or level 0 by default +var currentLevelData: Array[Dictionary] = [] +@export var mapEditor: Control +@export var buttonRotateRight: Button +var selected_brush: Control + +var drawRectangle: bool = false +var erase: bool = false +var snapAmount: float +# Initialize new mapdata with a 3x3 empty map grid +var defaultMapData: Dictionary = {"mapwidth": 3, "mapheight": 3, "maps": [[[],[],[]],[[],[],[]],[[],[],[]]]} +var rotationAmount: int = 0 +#Contains map metadata like size as well as the data on all levels +var mapData: Dictionary = defaultMapData.duplicate(): + set(data): + if data.is_empty(): + mapData = defaultMapData.duplicate() + else: + mapData = data.duplicate() + #loadLevelData(currentLevel) + + diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn new file mode 100644 index 00000000..c102832a --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn @@ -0,0 +1,137 @@ +[gd_scene load_steps=13 format=3 uid="uid://0r8ni3u0dosg"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd" id="1_bfw3n"] +[ext_resource type="Texture2D" uid="uid://b6m2bbbpmsyik" path="res://Images/Icons/IconRotateRightDark.png" id="2_qcvqe"] +[ext_resource type="Texture2D" uid="uid://5fsf8rh6w0pb" path="res://Images/Icons/IconRectangleChecked.png" id="3_u7g7j"] +[ext_resource type="Texture2D" uid="uid://cxhp6hye2ufp2" path="res://Images/Icons/IconRectangleUnchecked.png" id="4_no6mb"] +[ext_resource type="Texture2D" uid="uid://7pbgyyv6lna1" path="res://Images/Icons/IconEraserChecked.png" id="5_142rt"] +[ext_resource type="Texture2D" uid="uid://hik7bkdfc51t" path="res://Images/Icons/IconEraserUnchecked.png" id="6_w0gff"] +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd" id="7_ji7x2"] +[ext_resource type="PackedScene" uid="uid://f6kl6bo0wsmk" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn" id="8_pt28t"] + +[sub_resource type="Gradient" id="Gradient_x1sdl"] + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_rxahe"] +gradient = SubResource("Gradient_x1sdl") +width = 24 + +[sub_resource type="InputEventKey" id="InputEventKey_nrfa0"] +device = -1 +keycode = 82 +unicode = 114 + +[sub_resource type="Shortcut" id="Shortcut_hehp2"] +events = [SubResource("InputEventKey_nrfa0")] + +[node name="TacticalMapEditor" type="Control" node_paths=PackedStringArray("tileGrid")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_bfw3n") +tileGrid = NodePath("HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid") + +[node name="HSplitContainer" type="HSplitContainer" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_icons/grabber = SubResource("GradientTexture2D_rxahe") + +[node name="MapeditorContainer" type="VBoxContainer" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.5 + +[node name="Toolbar" type="HBoxContainer" parent="HSplitContainer/MapeditorContainer"] +clip_contents = true +custom_minimum_size = Vector2(0, 24) +layout_mode = 2 +size_flags_stretch_ratio = 0.05 + +[node name="CloseButton" type="Button" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.15 +text = "Close" + +[node name="SaveButton" type="Button" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.15 +text = "Save" + +[node name="mapsizelabel" type="Label" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +text = "Size: W:" + +[node name="MapWidth" type="TextEdit" parent="HSplitContainer/MapeditorContainer/Toolbar"] +clip_contents = true +custom_minimum_size = Vector2(40, 22) +layout_mode = 2 +theme_override_constants/line_spacing = 0 +theme_override_font_sizes/font_size = 16 +text = "3" + +[node name="MapHeightLabel" type="Label" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +text = "H:" + +[node name="MapHeight" type="TextEdit" parent="HSplitContainer/MapeditorContainer/Toolbar"] +clip_contents = true +custom_minimum_size = Vector2(40, 22) +layout_mode = 2 +theme_override_constants/line_spacing = 0 +theme_override_font_sizes/font_size = 16 +text = "3" + +[node name="RotateRight" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +tooltip_text = "Rotate the brush to paint with rotation" +theme_override_icons/checked = ExtResource("2_qcvqe") +theme_override_icons/unchecked = ExtResource("2_qcvqe") +shortcut = SubResource("Shortcut_hehp2") +text = "0" + +[node name="DrawRectangle" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +tooltip_text = "Paint in a rectangle" +theme_override_icons/checked = ExtResource("3_u7g7j") +theme_override_icons/unchecked = ExtResource("4_no6mb") + +[node name="Erase" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +tooltip_text = "Erase tiles on the map" +theme_override_icons/checked = ExtResource("5_142rt") +theme_override_icons/unchecked = ExtResource("6_w0gff") + +[node name="HBoxContainer" type="HBoxContainer" parent="HSplitContainer/MapeditorContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="TileGrid" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer" node_paths=PackedStringArray("mapEditor", "buttonRotateRight")] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/h_separation = 0 +theme_override_constants/v_separation = 0 +columns = 32 +script = ExtResource("7_ji7x2") +tileScene = ExtResource("8_pt28t") +mapEditor = NodePath("../../../..") +buttonRotateRight = NodePath("../../Toolbar/RotateRight") + +[node name="EntitiesContainer" type="VBoxContainer" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.2 + +[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/SaveButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="save_map_json_file"] +[connection signal="text_changed" from="HSplitContainer/MapeditorContainer/Toolbar/MapWidth" to="." method="_on_map_width_text_changed"] +[connection signal="text_changed" from="HSplitContainer/MapeditorContainer/Toolbar/MapHeight" to="." method="_on_map_height_text_changed"] +[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/RotateRight" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_rotate_right_button_up"] +[connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_draw_rectangle_toggled"] +[connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/Erase" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_erase_toggled"] diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn new file mode 100644 index 00000000..94188be7 --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn @@ -0,0 +1,9 @@ +[gd_scene format=3 uid="uid://f6kl6bo0wsmk"] + +[node name="TacticalMapEditorTile" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTileBrush.tscn b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTileBrush.tscn new file mode 100644 index 00000000..1f5011db --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTileBrush.tscn @@ -0,0 +1,9 @@ +[gd_scene format=3 uid="uid://c28vw5hmwvmlf"] + +[node name="TacticalMapEditorTileBrush" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 diff --git a/project.godot b/project.godot index 3941df41..227f60df 100644 --- a/project.godot +++ b/project.godot @@ -49,6 +49,7 @@ folder_colors={ "res://Scenes/ContentManager/": "yellow", "res://Scenes/ContentManager/Custom_Editors/": "red", "res://Scenes/ContentManager/Custom_Editors/Scripts/": "green", +"res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/": "green", "res://Scenes/ContentManager/Custom_Widgets/": "purple", "res://Scenes/ContentManager/Custom_Widgets/Scripts/": "green", "res://Scenes/ContentManager/Mapeditor/": "blue", From a2233d9332bb266452fa918c1ed7aa9e9da53cae Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 15 Jan 2024 20:52:08 +0100 Subject: [PATCH 086/138] Adding tacticalmap infrastructure --- Defaults/Maps/Generichouse.png | Bin 0 -> 921 bytes Defaults/Maps/Generichouse.png.import | 34 ++++++++ .../Scripts/EntitiesContainer.gd | 56 +++++++++++++ .../Scripts/TacticalMapEditor.gd | 8 +- .../Scripts/TacticalMapEditorTile.gd | 61 +++++++++++++++ .../Scripts/TacticalMapEditorTileBrush.gd | 25 ++++++ .../TacticalMapEditor/Scripts/TileGrid.gd | 74 +++++++++++++++++- .../TacticalMapEditor/TacticalMapEditor.tscn | 9 ++- .../TacticalMapEditorTile.tscn | 10 ++- .../ContentManager/Scripts/contenteditor.gd | 4 + Scripts/gamedata.gd | 4 + 11 files changed, 279 insertions(+), 6 deletions(-) create mode 100644 Defaults/Maps/Generichouse.png create mode 100644 Defaults/Maps/Generichouse.png.import create mode 100644 Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/EntitiesContainer.gd create mode 100644 Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd create mode 100644 Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTileBrush.gd diff --git a/Defaults/Maps/Generichouse.png b/Defaults/Maps/Generichouse.png new file mode 100644 index 0000000000000000000000000000000000000000..ee85ef2bd4552b574b57cc41950af92415cc88a4 GIT binary patch literal 921 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>U=H?laSW-L z^Y-rEyvqSHZ6CkO++L}D%gyP)nIkUS^X{-Ey`8F1`ua#|foaYf51t&4wJ!UE)VJMi zU|Ts=^tSrB-+#8Jdp+TKu72B6z2-;Boo%bbzHXY@G-Z0=7XRZq{94}@f1Ce2Yueh3 z^?j9+qDC+OtqS|7)AjAuhkt)^rMnkw%M{(bU{{vw?-IH6hv#Pnw0}D&<@mlXnc?#> zhG)HuXQY{Dn6nw=^CaApIIzdCp^_pAm3NbWg(QlGT;DotS>U|q{ok(tOy}9)E$b8z zC~|A|+m(TzQ<58GUvJXcx+8i;RM;%}bMxQqv$wDQ{O)MvZI4MJn-{#=C1@MBf0upO zv{WmrS+DDMUdW2HzjZ%<|Ce7sB@_y;m#!6P($m-fx9(?u$(--Ms}mV`HpFHxibiwx z`zvf5Z$#hRh4|^ST|;HDJd*cpcQEeS_j%jfyWg!VS5_A=m+Za1_wC%Ov+s6)-qVv6 zcDC7c(RsblSI>UADYBjAe?H0NrQENo-n-5A+%KxuSKr?KzWO6b+Zy}#^Zr^~KfO5Y zmuBo=u1Q<2-re)h;>G75S8R7NE;HMm*KqJXP|^8$w|M^A*j3(-T_e)HKwybP^RIVV zfh%W-T3J|JdHcxf>-(FPt6n|)E)TNfv9!Wh{ac0C_S>@^V2Iw@mfXZmB|Y|~B{xhYUGWCb?f1|9`~Cm#6gK9Z8^Q8C8xs9%4Gy%~ ze!W@B%u^S4z_WIhz_o98XBYh6?f<~+&G-G8oBb1x`|VBpe)o;=jg9U5;*!mOv&?!g qd}5~Kv$K_q2n^&?JBfi(>-+m+HUh@$wtRfd00f?{elF{r5}E+P1gaeX literal 0 HcmV?d00001 diff --git a/Defaults/Maps/Generichouse.png.import b/Defaults/Maps/Generichouse.png.import new file mode 100644 index 00000000..450e820c --- /dev/null +++ b/Defaults/Maps/Generichouse.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://sqi8fd2vi8jr" +path="res://.godot/imported/Generichouse.png-54cdc2d9e4775bcd5290036badaeb324.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Defaults/Maps/Generichouse.png" +dest_files=["res://.godot/imported/Generichouse.png-54cdc2d9e4775bcd5290036badaeb324.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/EntitiesContainer.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/EntitiesContainer.gd new file mode 100644 index 00000000..c544305b --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/EntitiesContainer.gd @@ -0,0 +1,56 @@ +extends VBoxContainer + +@export var scrolling_Flow_Container: PackedScene = null +@export var tileBrush: PackedScene = null + +var instanced_brushes: Array[Node] = [] + +signal tile_brush_selection_change(tilebrush: Control) +var selected_brush: Control: + set(newBrush): + selected_brush = newBrush + tile_brush_selection_change.emit(selected_brush) + +func _ready(): + loadMaps() + + +# this function will read all files in Gamedata.data.tiles.data and creates tilebrushes for each tile in the list. It will make separate lists for each category that the tiles belong to. +func loadMaps(): + var mapsList: Array = Gamedata.data.maps.data + + for map in mapsList: + # Extract the base name without the extension + var base_name = map.get_basename() + # If the file has an image to represent it's content, load it + if Gamedata.maps.sprites.has(base_name + ".png"): + var mySprite: Resource = Gamedata.maps.sprites[base_name + ".png"] + if mySprite: + var newTilesList: Control = scrolling_Flow_Container.instantiate() + newTilesList.header = "maps" + add_child(newTilesList) + # Create a TextureRect node + var brushInstance = tileBrush.instantiate() + # Assign the texture to the TextureRect + brushInstance.set_tile_texture(mySprite) + # Since the map editor needs to knw what tile ID is used, + # We store the tile id in a variable in the brush + brushInstance.mapID = map + brushInstance.tilebrush_clicked.connect(tilebrush_clicked) + # Add the TextureRect as a child to the TilesList + newTilesList.add_content_item(brushInstance) + instanced_brushes.append(brushInstance) + +#Mark the clicked tilebrush as selected, but only after deselecting all other brushes +func tilebrush_clicked(tilebrush: Control) -> void: + deselect_all_brushes() + # If the clicked brush was not select it, we select it. Otherwise we deselect it + if selected_brush != tilebrush: + selected_brush = tilebrush + selected_brush.set_selected(true) + else: + selected_brush = null + +func deselect_all_brushes(): + for child in instanced_brushes: + child.set_selected(false) diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd index 36a190df..a91ae378 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd @@ -11,12 +11,18 @@ var mapWidth: int = 3 var contentSource: String = "": set(newSource): contentSource = newSource - tileGrid.load_map_json_file() + tileGrid.load_tacticalmap_json_file() func _on_map_height_text_changed(): mapHeight = int(mapheightTextEdit.text) + tileGrid.resetGrid() func _on_map_width_text_changed(): mapWidth = int(mapwidthTextEdit.text) + tileGrid.resetGrid() +#The editor is closed, destroy the instance +#TODO: Check for unsaved changes +func _on_close_button_button_up(): + queue_free() diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd new file mode 100644 index 00000000..07ab0bd4 --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd @@ -0,0 +1,61 @@ +extends Control + +#If a tile has no data, we save an empty object. Tiledata can have: +# id, rotation, mob +const defaultTileData: Dictionary = {} +const defaultTexture: String = "res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" +const aboveTexture: String = "res://Scenes/ContentManager/Mapeditor/Images/tileAbove.png" +var tileData: Dictionary = defaultTileData.duplicate(): + set(data): + tileData = data + if tileData.has("id") and tileData.id != "": + $TileSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.maps,\ + tileData.id) + if tileData.has("rotation"): + set_rotation_amount(tileData.rotation) + else: + $TileSprite.texture = load(defaultTexture) +signal tile_clicked(clicked_tile: Control) + +func _on_texture_rect_gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton: + match event.button_index: + MOUSE_BUTTON_LEFT: + if event.pressed: + tile_clicked.emit(self) + +func set_rotation_amount(amount: int) -> void: + $TileSprite.rotation_degrees = amount + tileData.rotation = amount + +func get_rotation_amount() -> int: + return $TileSprite.rotation_degrees + +func set_tile_id(id: String) -> void: + if id == "": + tileData.erase("id") + $TileSprite.texture = load(defaultTexture) + else: + tileData.id = id + $TileSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles, id).albedo_texture + +func _on_texture_rect_mouse_entered() -> void: + if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): + tile_clicked.emit(self) + +func set_default() -> void: + tileData = defaultTileData.duplicate() + +func highlight() -> void: + $TileSprite.modulate = Color(0.227, 0.635, 0.757) + +func unhighlight() -> void: + $TileSprite.modulate = Color(1,1,1) + +func set_clickable(clickable: bool): + if !clickable: + mouse_filter = MOUSE_FILTER_IGNORE + $TileSprite.mouse_filter = MOUSE_FILTER_IGNORE + +func get_tile_texture(): + return $TileSprite.texture diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTileBrush.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTileBrush.gd new file mode 100644 index 00000000..0d22874c --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTileBrush.gd @@ -0,0 +1,25 @@ +extends Control + +signal tilebrush_clicked(clicked_tile: Control) +var mapID: String = "" +var selected: bool = false +var entityType: String = "tile" + +#When the event was a left mouse button press, adjust the modulate property of the $TileSprite to be 3aa2c1 +func _on_texture_rect_gui_input(event): + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + tilebrush_clicked.emit(self) + +func set_tile_texture(res: Resource) -> void: + $TileSprite.texture = res + +func get_texture() -> Resource: + return $TileSprite.texture + +#Mark the clicked tilebrush as selected +func set_selected(is_selected: bool) -> void: + selected = is_selected + if selected: + modulate = Color(0.227, 0.635, 0.757) + else: + modulate = Color(1,1,1) diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd index 86a94c8c..dd9aa6e5 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd @@ -4,7 +4,7 @@ extends GridContainer #This is the index of the level we are on. 0 is ground level. can be -10 to +10 var currentLevel: int = 10 #Contains the data of every tile in the current level, the ground level or level 0 by default -var currentLevelData: Array[Dictionary] = [] +var currentLevelData: Array = [] @export var mapEditor: Control @export var buttonRotateRight: Button var selected_brush: Control @@ -22,6 +22,74 @@ var mapData: Dictionary = defaultMapData.duplicate(): mapData = defaultMapData.duplicate() else: mapData = data.duplicate() - #loadLevelData(currentLevel) - + loadLevel() + + +# This function will fill fill this GridContainer with a grid of 3x3 instances of "res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn" +func createTiles(): + for x in range(mapEditor.mapWidth): + for y in range(mapEditor.mapHeight): + var tileInstance: Control = tileScene.instantiate() + add_child(tileInstance) + tileInstance.connect("tile_clicked",grid_tile_clicked) + +func resetGrid(): + for child in get_children(): + child.queue_free() + createTiles() + +#When one of the grid tiles is clicked, we paint the tile accordingly +func grid_tile_clicked(clicked_tile): + paint_single_tile(clicked_tile) + + +# We paint a single tile if draw rectangle is not selected +# Either erase the tile or paint it if a brush is selected. +func paint_single_tile(clicked_tile): + if drawRectangle or !clicked_tile: + return + if erase: + if selected_brush: + clicked_tile.set_tile_id("") + clicked_tile.set_rotation_amount(0) + else: + clicked_tile.set_default() + elif selected_brush: + clicked_tile.set_tile_id(selected_brush.tileID) + clicked_tile.set_rotation_amount(rotationAmount) + +#This function takes the mapData property and saves all of it as a json file. +func save_map_json_file(): + # Convert the TileGrid.mapData to a JSON string + storeLevelData() + var map_data_json = JSON.stringify(mapData.duplicate(), "\t") + Helper.json_helper.write_json_file(mapEditor.contentSource, map_data_json) + +#When this function is called, loop over all the TileGrid's children and get the tileData property. Store this data in the currentLevelData array +func storeLevelData(): + currentLevelData.clear() + for child in get_children(): + currentLevelData.append(child.tileData) + mapData.maps = currentLevelData.duplicate() + +func load_tacticalmap_json_file(): + var fileToLoad: String = mapEditor.contentSource + mapData = Helper.json_helper.load_json_dictionary_file(fileToLoad) + + +func loadLevel(): + if mapData.is_empty(): + print_debug("Tried to load data from an empty mapData dictionary") + return; + var newLevelData: Array = mapData.maps + var i: int = 0 + # If any data exists on this level, we load it + if newLevelData != []: + for tile in get_children(): + tile.tileData = newLevelData[i] + i += 1 + else: + #No data is present on this level. apply the default value for each tile + for tile in get_children(): + tile.set_default() diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn index c102832a..01ba71ec 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=3 uid="uid://0r8ni3u0dosg"] +[gd_scene load_steps=16 format=3 uid="uid://0r8ni3u0dosg"] [ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd" id="1_bfw3n"] [ext_resource type="Texture2D" uid="uid://b6m2bbbpmsyik" path="res://Images/Icons/IconRotateRightDark.png" id="2_qcvqe"] @@ -8,6 +8,9 @@ [ext_resource type="Texture2D" uid="uid://hik7bkdfc51t" path="res://Images/Icons/IconEraserUnchecked.png" id="6_w0gff"] [ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd" id="7_ji7x2"] [ext_resource type="PackedScene" uid="uid://f6kl6bo0wsmk" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn" id="8_pt28t"] +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/EntitiesContainer.gd" id="9_u8o0i"] +[ext_resource type="PackedScene" uid="uid://be62h2ytgw2kb" path="res://Scenes/ContentManager/Custom_Widgets/Scrolling_Flow_Container.tscn" id="10_lnsqy"] +[ext_resource type="PackedScene" uid="uid://c28vw5hmwvmlf" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTileBrush.tscn" id="11_bh5ke"] [sub_resource type="Gradient" id="Gradient_x1sdl"] @@ -128,6 +131,9 @@ buttonRotateRight = NodePath("../../Toolbar/RotateRight") layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.2 +script = ExtResource("9_u8o0i") +scrolling_Flow_Container = ExtResource("10_lnsqy") +tileBrush = ExtResource("11_bh5ke") [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/SaveButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="save_map_json_file"] [connection signal="text_changed" from="HSplitContainer/MapeditorContainer/Toolbar/MapWidth" to="." method="_on_map_width_text_changed"] @@ -135,3 +141,4 @@ size_flags_stretch_ratio = 0.2 [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/RotateRight" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_rotate_right_button_up"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_draw_rectangle_toggled"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/Erase" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_erase_toggled"] +[connection signal="tile_brush_selection_change" from="HSplitContainer/EntitiesContainer" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_tilebrush_list_tile_brush_selection_change"] diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn index 94188be7..983418b1 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn @@ -1,4 +1,6 @@ -[gd_scene format=3 uid="uid://f6kl6bo0wsmk"] +[gd_scene load_steps=2 format=3 uid="uid://f6kl6bo0wsmk"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd" id="1_jobrn"] [node name="TacticalMapEditorTile" type="Control"] layout_mode = 3 @@ -7,3 +9,9 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +script = ExtResource("1_jobrn") + +[node name="TileSprite" type="TextureRect" parent="."] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index 1b83ff3c..fef77b72 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -2,6 +2,7 @@ extends Control @export var contentList: PackedScene = null @export var mapEditor: PackedScene = null +@export var tacticalmapEditor: PackedScene = null @export var terrainTileEditor: PackedScene = null @export var furnitureEditor: PackedScene = null @export var mobEditor: PackedScene = null @@ -12,6 +13,7 @@ var selectedMod: String = "Core" # Called when the node enters the scene tree for the first time. #This function will instatiate a tileScene, set the source property and add it as a child to the content VBoxContainer. The source property should be set to "./Mods/Core/Maps/" func _ready(): + load_content_list(Gamedata.data.tacticalmaps, "Tactical Maps") load_content_list(Gamedata.data.maps, "Maps") load_content_list(Gamedata.data.tiles, "Terrain Tiles") load_content_list(Gamedata.data.mobs, "Mobs") @@ -50,6 +52,8 @@ func _on_content_item_activated(data: Dictionary, itemID: String): instantiate_editor(data, itemID, mobEditor) if data == Gamedata.data.maps: instantiate_editor(data, itemID, mapEditor) + if data == Gamedata.data.tacticalmaps: + instantiate_editor(data, itemID, tacticalmapEditor) #This will add an editor to the content editor tab view. #The editor that should be instantiated is passed trough in the newEditor parameter diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index 37d69a14..74e3a418 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -14,6 +14,7 @@ func _ready(): data.mobs = {} data.overmaptiles = {} data.maps = {} + data.tacticalmaps = {} data.furniture = {} data.tiles.dataPath = "./Mods/Core/Tiles/Tiles.json" data.tiles.spritePath = "./Mods/Core/Tiles/" @@ -22,6 +23,7 @@ func _ready(): data.furniture.spritePath = "./Mods/Core/Furniture/" data.furniture.dataPath = "./Mods/Core/Furniture/Furniture.json" data.overmaptiles.spritePath = "./Mods/Core/OvermapTiles/" + data.tacticalmaps.dataPath = "./Mods/Core/TacticalMaps/" data.maps.dataPath = "./Mods/Core/Maps/" # Map preview images are stored in the same folder data.maps.spritePath = "./Mods/Core/Maps/" @@ -29,6 +31,8 @@ func _ready(): load_tile_sprites() load_data() data.maps.data = Helper.json_helper.file_names_in_dir(data.maps.dataPath, ["json"]) + data.tacticalmaps.data = Helper.json_helper.file_names_in_dir(\ + data.tacticalmaps.dataPath, ["json"]) #Loads json data. If no json file exists, it will create an empty array in a new file func load_data() -> void: From 4cee329131de0f7537a2d84de33db343741366a0 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 16 Jan 2024 12:05:46 +0100 Subject: [PATCH 087/138] Tactical map editor can write file --- Mods/Core/Maps/urbanroad.png | Bin 0 -> 598 bytes Mods/Core/Maps/urbanroad.png.import | 34 ++++++++++++++ .../Core/TacticalMaps/DefaultTacticalMap.json | 42 ++++++++++++++++++ .../Scripts/EntitiesContainer.gd | 10 ++--- .../Scripts/TacticalMapEditorTile.gd | 2 +- .../TacticalMapEditor/Scripts/TileGrid.gd | 10 ++++- .../TacticalMapEditor/TacticalMapEditor.tscn | 9 ++-- .../TacticalMapEditorTile.tscn | 23 +++++++--- .../TacticalMapEditorTileBrush.tscn | 17 ++++++- Scenes/ContentManager/Scripts/content_list.gd | 4 +- Scenes/ContentManager/contenteditor.tscn | 4 +- Scripts/gamedata.gd | 20 +++++---- 12 files changed, 145 insertions(+), 30 deletions(-) create mode 100644 Mods/Core/Maps/urbanroad.png create mode 100644 Mods/Core/Maps/urbanroad.png.import create mode 100644 Mods/Core/TacticalMaps/DefaultTacticalMap.json diff --git a/Mods/Core/Maps/urbanroad.png b/Mods/Core/Maps/urbanroad.png new file mode 100644 index 0000000000000000000000000000000000000000..c153cdf9a88a154c91679fc5a7ecdacf88b2fb98 GIT binary patch literal 598 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>U=r|jaSW-L z^Y+fhKxRV$w}&N}@+Do=k4J$#`*Rs~3@mzGVpTe+$8eL5_bRPfk3V+5+qdHi&-wq;Lzg(|>lh8=hL8Mgmsd{E{taL0^c5Fz`T XgdpOehSVu6{1-oD!M<7>M;n literal 0 HcmV?d00001 diff --git a/Mods/Core/Maps/urbanroad.png.import b/Mods/Core/Maps/urbanroad.png.import new file mode 100644 index 00000000..d9e86f63 --- /dev/null +++ b/Mods/Core/Maps/urbanroad.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://xx1jwwitqnyp" +path="res://.godot/imported/urbanroad.png-a627bc58d6f387047cc2b061013183f3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Maps/urbanroad.png" +dest_files=["res://.godot/imported/urbanroad.png-a627bc58d6f387047cc2b061013183f3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Mods/Core/TacticalMaps/DefaultTacticalMap.json b/Mods/Core/TacticalMaps/DefaultTacticalMap.json new file mode 100644 index 00000000..c3e3c4f4 --- /dev/null +++ b/Mods/Core/TacticalMaps/DefaultTacticalMap.json @@ -0,0 +1,42 @@ +{ + "mapheight": 3, + "maps": [ + { + "id": "Generichouse.json", + "rotation": 0 + }, + { + "id": "Generichouse.json", + "rotation": 0 + }, + { + "id": "Generichouse.json", + "rotation": 0 + }, + { + "id": "urbanroad.json", + "rotation": 0 + }, + { + "id": "urbanroad.json", + "rotation": 0 + }, + { + "id": "urbanroad.json", + "rotation": 0 + }, + { + "id": "Generichouse.json", + "rotation": 0 + }, + { + "id": "Generichouse.json", + "rotation": 0 + }, + { + "id": "Generichouse.json", + "rotation": 0 + } + ], + "mapwidth": 3 +} \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/EntitiesContainer.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/EntitiesContainer.gd index c544305b..71bcacd5 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/EntitiesContainer.gd +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/EntitiesContainer.gd @@ -18,17 +18,17 @@ func _ready(): # this function will read all files in Gamedata.data.tiles.data and creates tilebrushes for each tile in the list. It will make separate lists for each category that the tiles belong to. func loadMaps(): var mapsList: Array = Gamedata.data.maps.data + var newTilesList: Control = scrolling_Flow_Container.instantiate() + newTilesList.header = "maps" + add_child(newTilesList) for map in mapsList: # Extract the base name without the extension var base_name = map.get_basename() # If the file has an image to represent it's content, load it - if Gamedata.maps.sprites.has(base_name + ".png"): - var mySprite: Resource = Gamedata.maps.sprites[base_name + ".png"] + if Gamedata.data.maps.sprites.has(base_name + ".png"): + var mySprite: Resource = Gamedata.data.maps.sprites[base_name + ".png"] if mySprite: - var newTilesList: Control = scrolling_Flow_Container.instantiate() - newTilesList.header = "maps" - add_child(newTilesList) # Create a TextureRect node var brushInstance = tileBrush.instantiate() # Assign the texture to the TextureRect diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd index 07ab0bd4..9da0a4b5 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd @@ -37,7 +37,7 @@ func set_tile_id(id: String) -> void: $TileSprite.texture = load(defaultTexture) else: tileData.id = id - $TileSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles, id).albedo_texture + $TileSprite.texture = Gamedata.data.maps.sprites[id.replace("json", "png")] func _on_texture_rect_mouse_entered() -> void: if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd index dd9aa6e5..324403bf 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd @@ -13,7 +13,7 @@ var drawRectangle: bool = false var erase: bool = false var snapAmount: float # Initialize new mapdata with a 3x3 empty map grid -var defaultMapData: Dictionary = {"mapwidth": 3, "mapheight": 3, "maps": [[[],[],[]],[[],[],[]],[[],[],[]]]} +var defaultMapData: Dictionary = {"mapwidth": 3, "mapheight": 3, "maps": [{},{},{},{},{},{},{},{},{}]} var rotationAmount: int = 0 #Contains map metadata like size as well as the data on all levels var mapData: Dictionary = defaultMapData.duplicate(): @@ -24,9 +24,12 @@ var mapData: Dictionary = defaultMapData.duplicate(): mapData = data.duplicate() loadLevel() +func _ready(): + createTiles() # This function will fill fill this GridContainer with a grid of 3x3 instances of "res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn" func createTiles(): + columns = mapEditor.mapWidth for x in range(mapEditor.mapWidth): for y in range(mapEditor.mapHeight): var tileInstance: Control = tileScene.instantiate() @@ -55,7 +58,7 @@ func paint_single_tile(clicked_tile): else: clicked_tile.set_default() elif selected_brush: - clicked_tile.set_tile_id(selected_brush.tileID) + clicked_tile.set_tile_id(selected_brush.mapID) clicked_tile.set_rotation_amount(rotationAmount) #This function takes the mapData property and saves all of it as a json file. @@ -93,3 +96,6 @@ func loadLevel(): for tile in get_children(): tile.set_default() + +func _on_entities_container_tile_brush_selection_change(tilebrush): + selected_brush = tilebrush diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn index 01ba71ec..14ca8aa2 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn @@ -26,7 +26,7 @@ unicode = 114 [sub_resource type="Shortcut" id="Shortcut_hehp2"] events = [SubResource("InputEventKey_nrfa0")] -[node name="TacticalMapEditor" type="Control" node_paths=PackedStringArray("tileGrid")] +[node name="TacticalMapEditor" type="Control" node_paths=PackedStringArray("tileGrid", "mapwidthTextEdit", "mapheightTextEdit")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -35,6 +35,8 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_bfw3n") tileGrid = NodePath("HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid") +mapwidthTextEdit = NodePath("HSplitContainer/MapeditorContainer/Toolbar/MapWidth") +mapheightTextEdit = NodePath("HSplitContainer/MapeditorContainer/Toolbar/MapHeight") [node name="HSplitContainer" type="HSplitContainer" parent="."] layout_mode = 1 @@ -121,7 +123,7 @@ layout_mode = 2 size_flags_horizontal = 3 theme_override_constants/h_separation = 0 theme_override_constants/v_separation = 0 -columns = 32 +columns = 3 script = ExtResource("7_ji7x2") tileScene = ExtResource("8_pt28t") mapEditor = NodePath("../../../..") @@ -135,10 +137,11 @@ script = ExtResource("9_u8o0i") scrolling_Flow_Container = ExtResource("10_lnsqy") tileBrush = ExtResource("11_bh5ke") +[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/CloseButton" to="." method="_on_close_button_button_up"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/SaveButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="save_map_json_file"] [connection signal="text_changed" from="HSplitContainer/MapeditorContainer/Toolbar/MapWidth" to="." method="_on_map_width_text_changed"] [connection signal="text_changed" from="HSplitContainer/MapeditorContainer/Toolbar/MapHeight" to="." method="_on_map_height_text_changed"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/RotateRight" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_rotate_right_button_up"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_draw_rectangle_toggled"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/Erase" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_erase_toggled"] -[connection signal="tile_brush_selection_change" from="HSplitContainer/EntitiesContainer" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_tilebrush_list_tile_brush_selection_change"] +[connection signal="tile_brush_selection_change" from="HSplitContainer/EntitiesContainer" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_entities_container_tile_brush_selection_change"] diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn index 983418b1..42711f48 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTile.tscn @@ -1,17 +1,26 @@ -[gd_scene load_steps=2 format=3 uid="uid://f6kl6bo0wsmk"] +[gd_scene load_steps=3 format=3 uid="uid://f6kl6bo0wsmk"] [ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd" id="1_jobrn"] +[ext_resource type="Texture2D" uid="uid://c31w0wuk8qabw" path="res://Defaults/Sprites/2.png" id="2_gashh"] [node name="TacticalMapEditorTile" type="Control"] +custom_minimum_size = Vector2(16, 16) layout_mode = 3 -anchors_preset = 15 +anchors_preset = 0 +offset_right = 128.0 +offset_bottom = 128.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource("1_jobrn") + +[node name="TileSprite" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = -1 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -script = ExtResource("1_jobrn") +texture = ExtResource("2_gashh") +expand_mode = 3 -[node name="TileSprite" type="TextureRect" parent="."] -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 +[connection signal="gui_input" from="TileSprite" to="." method="_on_texture_rect_gui_input"] diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTileBrush.tscn b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTileBrush.tscn index 1f5011db..d57e586f 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTileBrush.tscn +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditorTileBrush.tscn @@ -1,9 +1,24 @@ -[gd_scene format=3 uid="uid://c28vw5hmwvmlf"] +[gd_scene load_steps=3 format=3 uid="uid://c28vw5hmwvmlf"] + +[ext_resource type="Script" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTileBrush.gd" id="1_6xcxx"] +[ext_resource type="Texture2D" uid="uid://c31w0wuk8qabw" path="res://Defaults/Sprites/2.png" id="2_82c4q"] [node name="TacticalMapEditorTileBrush" type="Control"] +custom_minimum_size = Vector2(64, 64) layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +script = ExtResource("1_6xcxx") + +[node name="TileSprite" type="TextureRect" parent="."] +custom_minimum_size = Vector2(64, 64) +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 +texture = ExtResource("2_82c4q") +expand_mode = 3 + +[connection signal="gui_input" from="TileSprite" to="." method="_on_texture_rect_gui_input"] diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 9801d363..51042c7d 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -70,9 +70,9 @@ func make_file_list() -> void: var item_index: int = contentItems.add_item(base_name) # Add the ID as metadata which can be used to load the item data contentItems.set_item_metadata(item_index, base_name) - + # If the file has an image to represent it's content, load it - if contentData.sprites.has(base_name + ".png"): + if contentData.has("sprites") and contentData.sprites.has(base_name + ".png"): var mySprite: Resource = contentData.sprites[base_name + ".png"] if mySprite: contentItems.set_item_icon(item_index, mySprite) diff --git a/Scenes/ContentManager/contenteditor.tscn b/Scenes/ContentManager/contenteditor.tscn index e06ab44d..f01e7445 100644 --- a/Scenes/ContentManager/contenteditor.tscn +++ b/Scenes/ContentManager/contenteditor.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=7 format=3 uid="uid://480xqusluqrk"] +[gd_scene load_steps=8 format=3 uid="uid://480xqusluqrk"] [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/contenteditor.gd" id="1_65sl4"] [ext_resource type="PackedScene" uid="uid://bhh0v7x4fjsgi" path="res://Scenes/ContentManager/content_list.tscn" id="2_4f21i"] [ext_resource type="PackedScene" uid="uid://d3001f5xxpup1" path="res://Scenes/ContentManager/Mapeditor/mapeditor.tscn" id="3_q062s"] +[ext_resource type="PackedScene" uid="uid://0r8ni3u0dosg" path="res://Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn" id="4_5du0w"] [ext_resource type="PackedScene" uid="uid://vfj2if40vf10" path="res://Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn" id="4_5nnw0"] [ext_resource type="PackedScene" uid="uid://drby7yfu8t38e" path="res://Scenes/ContentManager/Custom_Editors/MobEditor.tscn" id="5_86se2"] [ext_resource type="PackedScene" uid="uid://cng4m3os6smj8" path="res://Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn" id="5_r1dle"] @@ -17,6 +18,7 @@ grow_vertical = 2 script = ExtResource("1_65sl4") contentList = ExtResource("2_4f21i") mapEditor = ExtResource("3_q062s") +tacticalmapEditor = ExtResource("4_5du0w") terrainTileEditor = ExtResource("4_5nnw0") furnitureEditor = ExtResource("5_r1dle") mobEditor = ExtResource("5_86se2") diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index 74e3a418..2df13cd5 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -140,14 +140,18 @@ func remove_item_from_data(contentData: Dictionary, id: String): neither Dictionary nor String") func get_array_index_by_id(contentData: Dictionary, id: String) -> int: - var myIndex: int = -1 - var i: int = 0 - for item in contentData.data: - if item.get("id", "") == id: - myIndex = i - break - i += 1 - return myIndex + # Iterate through the array + for i in range(len(contentData.data)): + # Check if the current item is a dictionary + if typeof(contentData.data[i]) == TYPE_DICTIONARY: + # Check if it has the 'id' key and matches the given ID + if contentData.data[i].has("id") and contentData.data[i]["id"] == id: + return i + # Check if the current item is a string and matches the given ID + elif typeof(contentData.data[i]) == TYPE_STRING and contentData.data[i] == id: + return i + # Return -1 if the ID is not found + return -1 func save_data_to_file(contentData: Dictionary): var datapath: String = contentData.dataPath From 7f8e3d9c9c8f3e946af759e42ddf1b7ef68b88f7 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:24:17 +0100 Subject: [PATCH 088/138] Tacticalmap loads ingame --- LevelGenerator.gd | 114 +++++++++++------- .../Mapeditor/Scripts/mapeditortile.gd | 5 +- Scenes/Overmap/Scripts/Overmap.gd | 6 +- Scripts/Helper/save_helper.gd | 24 ++-- Scripts/scene_selector.gd | 4 +- 5 files changed, 94 insertions(+), 59 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 14a6fb2c..2a59c4fc 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -26,12 +26,69 @@ func _ready(): func generate_map(): map_save_folder = Helper.save_helper.get_saved_map_folder(Helper.current_level_pos) - generate_level() + generate_tactical_map() # These tree functions apply only to maps thet were previously saved in a save game generate_mobs() generate_items() generate_furniture() - + +# We generate a tactical map, which is made up of x by y maps of 32x32 blocks +# If we can find a saved map on the current coordinate, we load that +# Otherwise, we load the mapdata from the game data and make a brand new one +func generate_tactical_map(): + var tacticalMapJSON: Dictionary = {} + var level_name: String = Helper.current_level_name + map_save_folder = Helper.save_helper.get_saved_map_folder(Helper.current_level_pos) + # Load the default map from json + # Unless the map_save_folder is set + # In which case we load tha map instead + if map_save_folder == "": + tacticalMapJSON = Helper.json_helper.load_json_dictionary_file(\ + Gamedata.data.tacticalmaps.dataPath + level_name) + var i: int = 0 + for z in range(tacticalMapJSON.mapheight): + for x in range(tacticalMapJSON.mapwidth): + generate_tactical_map_level_segment(x, z,tacticalMapJSON.maps[i]) + i+=1 + else: + tacticalMapJSON = Helper.json_helper.load_json_dictionary_file(\ + map_save_folder + "/map.json") + generate_saved_level(tacticalMapJSON) + +func generate_tactical_map_level_segment(segment_x: int, segment_z: int, mapsegment: Dictionary): + var offset_x = segment_x * level_width + var offset_z = segment_z * level_height + #This contains the data of one segment, loaded from maps.data, for example generichouse.json + var mapsegmentData: Dictionary = Helper.json_helper.load_json_dictionary_file(\ + Gamedata.data.maps.dataPath + mapsegment.id) + var tileJSON: Dictionary = {} + + var level_number = 0 + for level in mapsegmentData.levels: + if level != []: + var level_node = Node3D.new() + level_node.add_to_group("maplevels") + level_manager.add_child(level_node) + level_node.global_position.y = level_number - 10 + level_node.global_position.x = offset_x + level_node.global_position.z = offset_z + + var current_block = 0 + for h in range(level_height): + for w in range(level_width): + if level[current_block]: + tileJSON = level[current_block] + if tileJSON.has("id") and tileJSON.id != "": + var block = create_block_with_id(tileJSON.id) + level_node.add_child(block) + block.position.x = w + block.position.z = h + apply_block_rotation(tileJSON, block) + add_block_mob(tileJSON, block) + add_furniture_to_block(tileJSON, block) + current_block += 1 + level_number += 1 + func generate_mobs() -> void: if map_save_folder == "": @@ -86,50 +143,40 @@ func add_furniture_to_map(furnitureData: Dictionary) -> void: # Generate the map layer by layer # For each layer, add all the blocks with proper rotation # If a block has an mob, add it too -func generate_level() -> void: - var level_name: String = Helper.current_level_name +func generate_saved_level(tacticalMapJSON: Dictionary) -> void: var tileJSON: Dictionary = {} - if level_name == "": - get_level_json() - else: - # Load the default map from json - # Unless the map_save_folder is set - # In which case we load tha map instead - if map_save_folder == "": - get_custom_level_json("./Mods/Core/Maps/" + level_name) - else: - get_custom_level_json(map_save_folder + "/map.json") - - + var currentBlocks: Array = [] var level_number = 0 #we need to generate level layer by layer starting from the bottom - for level in level_levels: - if level != []: + for level: Dictionary in tacticalMapJSON.maplevels: + if level != {}: var level_node = Node3D.new() level_node.add_to_group("maplevels") level_manager.add_child(level_node) - #The lowest level starts at -10 which would be rock bottom - level_node.global_position.y = level_number-10 - + level_node.global_position.y = level.map_y + level_node.global_position.x = level.map_x + level_node.global_position.z = level.map_z + currentBlocks = level.blocks var current_block = 0 # we will generate number equal to "layer_height" of horizontal rows of blocks for h in level_height: # this loop will generate blocks from West to East based on the tile number # in json file - for w in level_width: # checking if we have tile from json in our block array containing packedscenes # of blocks that we need to instantiate. # If yes, then instantiate - if level[current_block]: - tileJSON = level[current_block] + if currentBlocks[current_block]: + tileJSON = currentBlocks[current_block] if tileJSON.has("id"): if tileJSON.id != "": var block: StaticBody3D = create_block_with_id(tileJSON.id) level_node.add_child(block) - block.global_position.x = w - block.global_position.z = h + # Because the level node already has a x and y position, + # We only set the local position relative to the parent + block.position.x = w + block.position.z = h # Remmeber the id for save and load purposes block.id = tileJSON.id apply_block_rotation(tileJSON, block) @@ -138,21 +185,6 @@ func generate_level() -> void: current_block += 1 level_number += 1 - # YEAH I KNOW THAT SHOULD BE ONE FUNCTION, BUT IT'S 2:30 AM and... I'm TIRED LOL -func get_level_json(): - var file = default_level_json - level_json_as_text = FileAccess.get_file_as_string(file) - var json_as_dict: Dictionary = JSON.parse_string(level_json_as_text) - level_levels = json_as_dict["levels"] - level_width = json_as_dict["mapwidth"] - level_width = json_as_dict["mapheight"] - -func get_custom_level_json(level_path): - var file = level_path - level_json_as_text = FileAccess.get_file_as_string(file) - var json_as_dict = JSON.parse_string(level_json_as_text) - level_levels = json_as_dict["levels"] - func add_furniture_to_block(tileJSON: Dictionary, block: StaticBody3D): if tileJSON.has("furniture"): var newFurniture: Node3D = defaultFurniturePhysics.instantiate() diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index 836f3480..7ca79973 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -38,10 +38,10 @@ func _on_texture_rect_gui_input(event: InputEvent) -> void: func set_rotation_amount(amount: int) -> void: $TileSprite.rotation_degrees = amount tileData.rotation = amount - + func get_rotation_amount() -> int: return $TileSprite.rotation_degrees - + func set_scale_amount(scaleAmount: int) -> void: custom_minimum_size.x = scaleAmount custom_minimum_size.y = scaleAmount @@ -107,7 +107,6 @@ func set_above(): else: $TileSprite.texture = null - func _on_texture_rect_resized(): $TileSprite.pivot_offset = size / 2 $MobFurnitureSprite.pivot_offset = size / 2 diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index 5a3d1846..758654b4 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -87,7 +87,7 @@ func generate_chunk(grid_position: Vector2) -> void: var tile_index = int((noise_value + 1) / 2 * tiles.size()) % tiles.size() if global_x == 0 and global_y == 0: chunk.append({"tile": tiles[tile_index], "global_x": global_x, \ - "global_y": global_y, "tacticalmap": Gamedata.data.maps.data[0]}) + "global_y": global_y, "tacticalmap": Gamedata.data.tacticalmaps.data[0]}) else: chunk.append({"tile": tiles[tile_index], "global_x": global_x, \ "global_y": global_y, "tacticalmap": get_random_mapname_1_in_100()}) @@ -98,8 +98,8 @@ func get_random_mapname_1_in_100() -> String: var random_file: String = "" var chance = randi_range(0, 100) if chance < 1: - var random_index = randi() % Gamedata.data.maps.data.size() - random_file = Gamedata.data.maps.data[random_index] + var random_index = randi() % Gamedata.data.tacticalmaps.data.size() + random_file = Gamedata.data.tacticalmaps.data[random_index] return random_file diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 99273e21..fd06136d 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -113,30 +113,32 @@ func save_furniture_data(target_folder: String) -> void: func save_map_data(target_folder: String) -> void: var level_width : int = 32 var level_height : int = 32 - var mapData: Dictionary = {"mapwidth": 32, "mapheight": 32, "levels": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]} + #var mapData: Dictionary = {"mapwidth": 32, "mapheight": 32, "levels": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]} + var levelData: Dictionary = {"map_x": 0, "map_y": 0, "map_z": 0, "blocks": [], "rotation": 0} + var tacticalmapData: Dictionary = {"maplevels": []} #During map generation, the levels were added to the maplevels group var tree: SceneTree = get_tree() var mapLevels = tree.get_nodes_in_group("maplevels") var block: StaticBody3D var current_block: int = 0 - var level_y: int = 0 var level_block_count: int = 0 + var currentLevelData: Dictionary for level: Node3D in mapLevels: #The level will be destroyed after saving so we remove them from the group level.remove_from_group("maplevels") - #The bottom level will have y set at -10. The first item in the mapData - #array will be 0 so in this way we add the levels fom -10 to 10 - level_y = int(level.global_position.y+10) + currentLevelData.map_x = level.global_position.x + currentLevelData.map_y = level.global_position.y + currentLevelData.map_z = level.global_position.z level_block_count = level.get_child_count() if level_block_count > 0: + currentLevelData = levelData.duplicate() current_block = 0 # Loop over every row one by one for h in level_height: # this loop will process blocks from West to East for w in level_width: block = level.get_child(current_block) - if block.global_position.z == h and block.global_position.x == w: - + if block.position.z == h and block.position.x == w: # if the rotation is 90 it is facing north # In that case we subtract 90 so it is saved as 0 # If the rotation is 0 it is facing east @@ -147,14 +149,16 @@ func save_map_data(target_folder: String) -> void: myRotation = blockRotation-90 else: myRotation = blockRotation+90 - mapData.levels[level_y].append({ "id": block.id,\ + currentLevelData.blocks.append({ "id": block.id,\ "rotation": myRotation }) if current_block < level_block_count-1: current_block += 1 else: - mapData.levels[level_y].append({}) + currentLevelData.blocks.append({}) + tacticalmapData.maplevels.append(currentLevelData) #Overwrite the file if it exists and otherwise create it - Helper.json_helper.write_json_file(target_folder + "/map.json", JSON.stringify(mapData)) + Helper.json_helper.write_json_file(target_folder + "/map.json", \ + JSON.stringify(tacticalmapData)) # This function determines the saved map folder path for the current level. diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index bf13ad7a..265aa5cd 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -19,7 +19,7 @@ func _on_load_game_button_pressed(): # We pass the name of the default map and coordinates # If there is a saved game, it will not load the provided map # but rather the one that was saved in the game that was loaded - Helper.switch_level("Generichouse.json", Vector2(0, 0)) + Helper.switch_level("DefaultTacticalMap.json", Vector2(0, 0)) # When the play demo button is pressed # Create a new folder in the user directory @@ -27,7 +27,7 @@ func _on_load_game_button_pressed(): # This unique folder will contain save data for this game and can be loaded later func _on_play_demo_pressed(): Helper.save_helper.create_new_save() - Helper.switch_level("Generichouse.json", Vector2(0, 0)) + Helper.switch_level("DefaultTacticalMap.json", Vector2(0, 0)) func _on_help_button_pressed(): get_tree().change_scene_to_file("res://documentation.tscn") From b72e4b0cc0d6cc2b248f14cf38fbbfca71f7e23a Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 16 Jan 2024 16:55:14 +0100 Subject: [PATCH 089/138] Tactical maps are saved and loaded --- LevelGenerator.gd | 10 +- .../Scripts/TacticalMapEditorTile.gd | 3 +- Scripts/Helper/save_helper.gd | 96 ++++++++----------- Scripts/scene_selector.gd | 10 +- level_generation.tscn | 54 +---------- 5 files changed, 56 insertions(+), 117 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 2a59c4fc..2f3a7965 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -67,8 +67,8 @@ func generate_tactical_map_level_segment(segment_x: int, segment_z: int, mapsegm for level in mapsegmentData.levels: if level != []: var level_node = Node3D.new() - level_node.add_to_group("maplevels") level_manager.add_child(level_node) + level_node.add_to_group("maplevels") level_node.global_position.y = level_number - 10 level_node.global_position.x = offset_x level_node.global_position.z = offset_z @@ -87,6 +87,10 @@ func generate_tactical_map_level_segment(segment_x: int, segment_z: int, mapsegm add_block_mob(tileJSON, block) add_furniture_to_block(tileJSON, block) current_block += 1 + if !len(level_node.get_children()) > 0: + level_node.remove_from_group("maplevels") + level_node.queue_free() + level_number += 1 @@ -177,8 +181,6 @@ func generate_saved_level(tacticalMapJSON: Dictionary) -> void: # We only set the local position relative to the parent block.position.x = w block.position.z = h - # Remmeber the id for save and load purposes - block.id = tileJSON.id apply_block_rotation(tileJSON, block) add_block_mob(tileJSON, block) add_furniture_to_block(tileJSON, block) @@ -240,6 +242,8 @@ func create_block_with_id(id: String) -> StaticBody3D: block = defaultBlock.instantiate() else: block = defaultBlock.instantiate() + # Remmeber the id for save and load purposes + block.id = id #tileJSON.sprite is the 'sprite' key in the json that was found for this tile diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd index 9da0a4b5..2376adda 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditorTile.gd @@ -9,8 +9,7 @@ var tileData: Dictionary = defaultTileData.duplicate(): set(data): tileData = data if tileData.has("id") and tileData.id != "": - $TileSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.maps,\ - tileData.id) + $TileSprite.texture = Gamedata.data.maps.sprites[tileData.id.replace("json", "png")] if tileData.has("rotation"): set_rotation_amount(tileData.rotation) else: diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index fd06136d..e3af9d1a 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -97,69 +97,57 @@ func save_furniture_data(target_folder: String) -> void: furniture.queue_free() Helper.json_helper.write_json_file(target_folder + "/furniture.json", JSON.stringify(furnitureData)) - -#The current state of the map is saved to disk -#Starting from the bottom level (-10), loop over every level -#Not every level is fully populated with blocks, so we need -#to use the position of the block to store the map information -#If the level is fully populated by blocks, it will save all -#the blocks with a value in the "texture" field -#If the level is not fully populated (for example, the level only contains -#the walls of a house), we check every possible position where a block -#could be and check if the position matches the position of the first -#child in the level. If it matches, we move on to the next child. -#If it does not match, we save information about the empty block instead. -#If a level has no children, it will remain an empty array [] +# Saves all of the maplevels to disk +# A maplevel is one 32x32 layer at a certain x,y and z position +# This layer will contain 1024 blocks func save_map_data(target_folder: String) -> void: - var level_width : int = 32 - var level_height : int = 32 - #var mapData: Dictionary = {"mapwidth": 32, "mapheight": 32, "levels": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]} - var levelData: Dictionary = {"map_x": 0, "map_y": 0, "map_z": 0, "blocks": [], "rotation": 0} + var level_width: int = 32 + var level_height: int = 32 var tacticalmapData: Dictionary = {"maplevels": []} - #During map generation, the levels were added to the maplevels group var tree: SceneTree = get_tree() var mapLevels = tree.get_nodes_in_group("maplevels") - var block: StaticBody3D - var current_block: int = 0 - var level_block_count: int = 0 - var currentLevelData: Dictionary + for level: Node3D in mapLevels: - #The level will be destroyed after saving so we remove them from the group level.remove_from_group("maplevels") - currentLevelData.map_x = level.global_position.x - currentLevelData.map_y = level.global_position.y - currentLevelData.map_z = level.global_position.z - level_block_count = level.get_child_count() - if level_block_count > 0: - currentLevelData = levelData.duplicate() - current_block = 0 - # Loop over every row one by one - for h in level_height: - # this loop will process blocks from West to East - for w in level_width: - block = level.get_child(current_block) - if block.position.z == h and block.position.x == w: - # if the rotation is 90 it is facing north - # In that case we subtract 90 so it is saved as 0 - # If the rotation is 0 it is facing east - # In that case we add 90, the same for 90 and 180 degrees - var blockRotation: int = block.rotation_degrees.y - var myRotation: int - if blockRotation == 90: - myRotation = blockRotation-90 - else: - myRotation = blockRotation+90 - currentLevelData.blocks.append({ "id": block.id,\ - "rotation": myRotation }) - if current_block < level_block_count-1: - current_block += 1 - else: - currentLevelData.blocks.append({}) - tacticalmapData.maplevels.append(currentLevelData) - #Overwrite the file if it exists and otherwise create it + var level_node_data: Array = [] + var level_node_dict: Dictionary = { + "map_x": level.global_position.x, + "map_y": level.global_position.y, + "map_z": level.global_position.z, + "blocks": level_node_data + } + + # Iterate over each possible block position in the level + for h in range(level_height): + for w in range(level_width): + var block_data: Dictionary = get_block_data_at_position(level, Vector3(w, 0, h)) + level_node_data.append(block_data) + + tacticalmapData.maplevels.append(level_node_dict) + Helper.json_helper.write_json_file(target_folder + "/map.json", \ JSON.stringify(tacticalmapData)) +# Helper function to get block data at a specific position +func get_block_data_at_position(level: Node3D, position: Vector3) -> Dictionary: + var block: StaticBody3D = find_block_at_position(level, position) + if block: + var blockRotation: int = block.rotation_degrees.y + var myRotation: int + if blockRotation == 90: + myRotation = blockRotation-90 + else: + myRotation = blockRotation+90 + return {"id": block.id, "rotation": myRotation} + return {} + +# Helper function to find a block at a specific position +func find_block_at_position(level: Node3D, position: Vector3) -> StaticBody3D: + for child in level.get_children(): + if child is StaticBody3D and child.position == position: + return child + return null + # This function determines the saved map folder path for the current level. # It constructs this path using the current level's position and the current diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index 265aa5cd..84828419 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -2,13 +2,13 @@ extends Control var saved_game_folders : Array @export var load_game_list : OptionButton - -# Called when the node enters the scene tree for the first time. func _ready(): saved_game_folders = Helper.json_helper.folder_names_in_dir("user://save/") - # Iterate over the saved_game_folders array in reverse order - for i in range(saved_game_folders.size() - 1, -1, -1): - var saved_game = saved_game_folders[i] + # Reverse the order of the saved_game_folders array + saved_game_folders.reverse() + + # Populate the load_game_list with the saved game folders + for saved_game in saved_game_folders: load_game_list.add_item(saved_game) func _on_load_game_button_pressed(): diff --git a/level_generation.tscn b/level_generation.tscn index 661e1fd6..49624323 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=27 format=3 uid="uid://drl78uuphij1l"] +[gd_scene load_steps=25 format=3 uid="uid://drl78uuphij1l"] [ext_resource type="Script" path="res://LevelGenerator.gd" id="1_i8qa4"] [ext_resource type="Script" path="res://LevelManager.gd" id="2_gm6x7"] @@ -33,12 +33,6 @@ agent_height = 0.5 agent_radius = 0.3 agent_max_slope = 46.0 -[sub_resource type="BoxMesh" id="BoxMesh_yaev1"] -size = Vector3(64, 32, 1) - -[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_uf01n"] -points = PackedVector3Array(32, 16, 0.5, 32, 16, -0.5, -32, 16, 0.5, 32, -16, 0.5, 32, -16, -0.5, -32, 16, -0.5, -32, -16, 0.5, -32, -16, -0.5) - [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_7gsdb"] albedo_color = Color(0, 1, 0, 1) @@ -86,52 +80,6 @@ navigation_mesh = SubResource("NavigationMesh_3licq") [node name="Props" type="Node3D" parent="TacticalMap/NavigationRegion3D"] -[node name="TestWalls" type="Node3D" parent="TacticalMap/NavigationRegion3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 17, 0, 14) - -[node name="TestWall" type="StaticBody3D" parent="TacticalMap/NavigationRegion3D/TestWalls"] - -[node name="MeshInstance3D" type="MeshInstance3D" parent="TacticalMap/NavigationRegion3D/TestWalls/TestWall"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 0, 19) -mesh = SubResource("BoxMesh_yaev1") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="TacticalMap/NavigationRegion3D/TestWalls/TestWall"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 0, 19) -shape = SubResource("ConvexPolygonShape3D_uf01n") - -[node name="TestWall2" type="StaticBody3D" parent="TacticalMap/NavigationRegion3D/TestWalls"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -65) - -[node name="MeshInstance3D" type="MeshInstance3D" parent="TacticalMap/NavigationRegion3D/TestWalls/TestWall2"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 0, 19) -mesh = SubResource("BoxMesh_yaev1") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="TacticalMap/NavigationRegion3D/TestWalls/TestWall2"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 0, 19) -shape = SubResource("ConvexPolygonShape3D_uf01n") - -[node name="TestWall3" type="StaticBody3D" parent="TacticalMap/NavigationRegion3D/TestWalls"] -transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -1, 0, -28) - -[node name="MeshInstance3D" type="MeshInstance3D" parent="TacticalMap/NavigationRegion3D/TestWalls/TestWall3"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 0, 19) -mesh = SubResource("BoxMesh_yaev1") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="TacticalMap/NavigationRegion3D/TestWalls/TestWall3"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 0, 19) -shape = SubResource("ConvexPolygonShape3D_uf01n") - -[node name="TestWall4" type="StaticBody3D" parent="TacticalMap/NavigationRegion3D/TestWalls"] -transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -66, 0, -28) - -[node name="MeshInstance3D" type="MeshInstance3D" parent="TacticalMap/NavigationRegion3D/TestWalls/TestWall4"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 0, 19) -mesh = SubResource("BoxMesh_yaev1") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="TacticalMap/NavigationRegion3D/TestWalls/TestWall4"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.5, 0, 19) -shape = SubResource("ConvexPolygonShape3D_uf01n") - [node name="LevelManager" type="Node3D" parent="TacticalMap/NavigationRegion3D"] script = ExtResource("2_gm6x7") From 3381a2f98327608b8bcc016c5172046853965094 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:34:13 +0100 Subject: [PATCH 090/138] fix tileeditor bugs --- Mods/Core/Tiles/Tiles.json | 55 +++++++++++++++++++ .../Custom_Editors/TerrainTileEditor.tscn | 6 ++ .../Scripts/Selectable_Sprite_Widget.gd | 18 +++++- .../Scripts/Sprite_Selector_Popup.gd | 17 ++++-- .../ContentManager/Scripts/contenteditor.gd | 8 +++ Scripts/gamedata.gd | 4 +- 6 files changed, 100 insertions(+), 8 deletions(-) diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index 60f9335a..bf812e4e 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -184,5 +184,60 @@ "name": "Beehive stones", "shape": "cube", "sprite": "beehive1.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "Simple wooden floor boards that may be laid in a decorative fasion", + "id": "floor_wood_boards_00", + "name": "Wooden floor boards", + "shape": "cube", + "sprite": "woodboards10.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "Simple wooden floor boards that may be laid in a decorative fasion", + "id": "floor_wood_boards_01", + "name": "Wooden floor boards", + "shape": "cube", + "sprite": "woodboards11.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "Simple wooden floor boards that may be laid in a decorative fasion", + "id": "floor_wood_boards_02", + "name": "Wooden floor boards", + "shape": "cube", + "sprite": "woodboards12.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "Simple wooden floor boards that may be laid in a decorative fasion", + "id": "floor_wood_boards_03", + "name": "Wooden floor boards", + "shape": "cube", + "sprite": "woodboards13.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "Simple wooden floor boards that may be laid in a decorative fasion", + "id": "floor_wood_boards_04", + "name": "Wooden floor boards", + "shape": "cube", + "sprite": "woodboards14.png" } ] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn index b7e267a2..9e99e61c 100644 --- a/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn @@ -56,6 +56,7 @@ custom_minimum_size = Vector2(128, 128) layout_mode = 2 size_flags_horizontal = 0 size_flags_stretch_ratio = 0.4 +tooltip_text = "Select a sprite that will be used to visualize this terrain. You can add sprites by putting the image in /mods/core/Tiles." texture = ExtResource("2_x7b0a") expand_mode = 3 @@ -85,6 +86,7 @@ custom_minimum_size = Vector2(0, 30) layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.1 +tooltip_text = "Give a descriptive name that best describes this terrain" focus_next = NodePath("../DescriptionTextEdit") focus_previous = NodePath("../TileImageDisplay") @@ -97,6 +99,7 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 size_flags_stretch_ratio = 0.9 +tooltip_text = "This description helps users understand how this terrain is used" focus_next = NodePath("../Editable_Item_List") focus_previous = NodePath("../NameTextEdit") @@ -108,6 +111,7 @@ text = "Categories:" layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +tooltip_text = "Categories used in the map editor to separate this terrain from terrain in other categories. For example Floor and Urban" header = "Categories" [node name="ShapeLabel" type="Label" parent="VBoxContainer/FormGrid"] @@ -119,11 +123,13 @@ layout_mode = 2 [node name="CubeShapeCheckBox" type="CheckBox" parent="VBoxContainer/FormGrid/ShapeButtonContainer"] layout_mode = 2 +tooltip_text = "Select this if this terrain is represented by a cube. This allows for it to be either a wall or a floor. This is the default value" button_pressed = true text = "Cube" [node name="SlopeShapeCheckBox" type="CheckBox" parent="VBoxContainer/FormGrid/ShapeButtonContainer"] layout_mode = 2 +tooltip_text = "Select this if this terrain should be represented by a slope. Tipically ised for stairs or ramps. The player can go one level up if approached from the right angle." text = "Slope" [node name="Sprite_selector" parent="." instance=ExtResource("5_5ngda")] diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd index 4ed91823..78fbf742 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd @@ -1,12 +1,26 @@ extends Control signal selectableSprite_clicked(clicked_sprite: Control) +signal selectableSprite_double_clicked(clicked_sprite: Control) var selected: bool = false +# Store the time of the last mouse click +var last_click_time = 0.0 + #When the event was a left mouse button press, adjust emit a signal that it was clicked func _on_texture_rect_gui_input(event): - if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: - selectableSprite_clicked.emit(self) + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT: + if event.pressed: + var current_time = Time.get_ticks_msec() / 1000.0 + if current_time - last_click_time < 0.3: # Check for double-click (300 ms threshold) + selectableSprite_double_clicked.emit(self) + else: + selectableSprite_clicked.emit(self) + last_click_time = current_time + +#func _on_texture_rect_gui_input(event): + #if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + #selectableSprite_clicked.emit(self) func set_sprite_texture(res: Resource) -> void: if res is BaseMaterial3D: diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd index bd95716a..fbd312c3 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Sprite_Selector_Popup.gd @@ -36,15 +36,15 @@ func populate_sprite_list(): # Assign the texture to the TextureRect selectableSpriteInstance.set_sprite_texture(material) selectableSpriteInstance.selectableSprite_clicked.connect(sprite_clicked) + selectableSpriteInstance.selectableSprite_double_clicked.connect(\ + _on_sprite_double_clicked) spriteList.add_content_item(selectableSpriteInstance) instanced_sprites.append(selectableSpriteInstance) # Called after the user selects a tile in the popup textbox and presses OK func _on_ok_button_up(): - hide() - if selectedSprite: - sprite_selected_ok.emit(selectedSprite) - + _emit_sprite_selected_and_close() + # Called after the users presses cancel on the popup asking for a tile func _on_cancel_button_up(): hide() @@ -59,3 +59,12 @@ func sprite_clicked(spite_selected: Control) -> void: selectedSprite = spite_selected # If the clicked brush was not select it, we select it. Otherwise we deselect it spite_selected.set_selected(true) + +func _on_sprite_double_clicked(sprite_selected: Control): + selectedSprite = sprite_selected + _emit_sprite_selected_and_close() + +func _emit_sprite_selected_and_close(): + if selectedSprite: + sprite_selected_ok.emit(selectedSprite) + hide() diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index fef77b72..48d17c88 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -69,7 +69,15 @@ func instantiate_editor(data: Dictionary, itemID: String, newEditor: PackedScene #Connect the data_changed signal to the Gamedata.on_data_changed function #We pass trough the data collection that the changed data belongs to newContentEditor.data_changed.connect(Gamedata.on_data_changed.bind(data)) + newContentEditor.data_changed.connect(_on_editor_data_changed.bind(data)) + else: #If the data source does not end with json, it's a directory #So now we pass in the file we want the editor to edit newContentEditor.contentSource = data.dataPath + itemID + ".json" + +# function to handle data changes +func _on_editor_data_changed(data: Dictionary): + for element in content.get_children(): + if element.contentData == data: + element.load_data() diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index 2df13cd5..b0dda3d8 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -79,9 +79,9 @@ func duplicate_item_in_data(contentData: Dictionary, id: String, newID: String): if contentData.data.is_empty(): return - if data.dataPath.ends_with((".json")): + if contentData.dataPath.ends_with((".json")): # Check if an item with the given ID exists in the file. - var item_index: int = get_array_index_by_id(contentData.data,id) + var item_index: int = get_array_index_by_id(contentData,id) if item_index == -1: return From ce4c6b5400431d67bf985b8f2cf6ffb52c8bb2a8 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:44:50 +0100 Subject: [PATCH 091/138] Add tiles, enable tab navigation --- Mods/Core/Tiles/Tiles.json | 104 ++++++++++++++++++ .../Scripts/TerrainTileEditor.gd | 27 ++++- 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index bf812e4e..0572eb5f 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -239,5 +239,109 @@ "name": "Wooden floor boards", "shape": "cube", "sprite": "woodboards14.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "Simple wooden floor boards that may be laid in a decorative fasion", + "id": "floor_wood_boards_05", + "name": "Wooden floor boards", + "shape": "cube", + "sprite": "woodboards6.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "Simple wooden floor boards that may be laid in a decorative fasion", + "id": "floor_wood_boards_06", + "name": "Wooden floor boards", + "shape": "cube", + "sprite": "woodboards7.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "Simple wooden floor boards that may be laid in a decorative fasion", + "id": "floor_wood_boards_07", + "name": "Wooden floor boards", + "shape": "cube", + "sprite": "woodboards8.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "Simple wooden floor boards that may be laid in a decorative fasion", + "id": "floor_wood_boards_08", + "name": "Wooden floor boards", + "shape": "cube", + "sprite": "woodboards9.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A place devoid of life. All that remains is dust and cracks in the ground", + "id": "wasteland_00", + "name": "Wasteland\t", + "shape": "cube", + "sprite": "wasteland.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A place devoid of life. All that remains is dust and cracks in the ground", + "id": "wasteland_01", + "name": "Wasteland\t", + "shape": "cube", + "sprite": "wasteland11.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A place devoid of life. All that remains is dust and cracks in the ground", + "id": "wasteland_02", + "name": "Wasteland\t", + "shape": "cube", + "sprite": "wasteland2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A place devoid of life. All that remains is dust and cracks in the ground. By some miracle one or two plants have managed to survive.", + "id": "wasteland_03", + "name": "Wasteland\t", + "shape": "cube", + "sprite": "wastelandveg.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A place devoid of life. All that remains is dust and cracks in the ground. By some miracle one or two plants have managed to survive.", + "id": "wasteland_04", + "name": "Wasteland\t", + "shape": "cube", + "sprite": "wastelandveg1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A place devoid of life. All that remains is dust and cracks in the ground. By some miracle one or two plants have managed to survive.", + "id": "wasteland_05", + "name": "Wasteland\t", + "shape": "cube", + "sprite": "wastelandveg2.png" } ] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd index d3b06159..8fcb871d 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/TerrainTileEditor.gd @@ -19,6 +19,7 @@ extends Control # The content editor has connected this signal to Gamedata already signal data_changed() +var control_elements: Array = [] # The data that represents this tile # The data is selected from the Gamedata.data.tiles.data array # based on the ID that the user has selected in the content editor @@ -28,6 +29,30 @@ var contentData: Dictionary = {}: load_tile_data() tileSelector.sprites_collection = Gamedata.data.tiles.sprites + +func _ready(): + control_elements = [ + tileImageDisplay, + NameTextEdit, + DescriptionTextEdit, + CategoriesList, + cubeShapeCheckbox, + slopeShapeCheckbox + ] + +func _input(event): + if event.is_action_pressed("ui_focus_next"): + for myControl in control_elements: + if myControl.has_focus(): + if Input.is_key_pressed(KEY_SHIFT): # Check if Shift key + if !myControl.focus_previous.is_empty(): + myControl.get_node(myControl.focus_previous).grab_focus() + else: + if !myControl.focus_next.is_empty(): + myControl.get_node(myControl.focus_next).grab_focus() + break + get_viewport().set_input_as_handled() + # This function updates the form based on the contentData that has been loaded func load_tile_data(): if tileImageDisplay != null and contentData.has("sprite"): @@ -54,7 +79,7 @@ func load_tile_data(): #TODO: Check for unsaved changes func _on_close_button_button_up(): queue_free() - + # This function takes all data fro the form elements stores them in the contentData # Since contentData is a reference to an item in Gamedata.data.tiles.data # the central array for tiledata is updated with the changes as well From ede35fa8d052af964725b3032ee3d6b70bd233d7 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:51:48 +0100 Subject: [PATCH 092/138] snow and toxic waste tiles --- Mods/Core/Tiles/Tiles.json | 54 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index 0572eb5f..71bf2259 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -343,5 +343,59 @@ "name": "Wasteland\t", "shape": "cube", "sprite": "wastelandveg2.png" + }, + { + "categories": [ + "Hazards" + ], + "description": "Very dangerous! Some toxic waste was spilled here", + "id": "toxic_waste_00", + "name": "Toxic waste", + "shape": "cube", + "sprite": "toxicwaste.png" + }, + { + "categories": [ + "Hazards" + ], + "description": "Very dangerous! Some toxic waste was spilled here", + "id": "toxic_waste_01", + "name": "Toxic waste", + "shape": "cube", + "sprite": "toxicwaste1.png" + }, + { + "categories": [ + "Hazards" + ], + "description": "Very dangerous! Some toxic waste was spilled here", + "id": "toxic_waste_02", + "name": "Toxic waste", + "shape": "cube", + "sprite": "toxicwaste2.png" + }, + { + "categories": [], + "description": "A blanket of snow covers the ground", + "id": "snow_00", + "name": "Snow", + "shape": "cube", + "sprite": "snow.png" + }, + { + "categories": [], + "description": "A blanket of snow covers the ground", + "id": "snow_01", + "name": "Snow", + "shape": "cube", + "sprite": "snow1.png" + }, + { + "categories": [], + "description": "A blanket of snow covers the ground", + "id": "snow_02", + "name": "Snow", + "shape": "cube", + "sprite": "snow2.png" } ] \ No newline at end of file From 73470e7bf8dd89c3c1772cee68f735fbac039b06 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 16 Jan 2024 20:15:09 +0100 Subject: [PATCH 093/138] More tiles, kitchen, rock --- Mods/Core/Tiles/Tiles.json | 338 ++++++++++++++++++++++++++++++++++++- 1 file changed, 335 insertions(+), 3 deletions(-) diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index 71bf2259..f3c763e3 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -375,7 +375,9 @@ "sprite": "toxicwaste2.png" }, { - "categories": [], + "categories": [ + "Ground" + ], "description": "A blanket of snow covers the ground", "id": "snow_00", "name": "Snow", @@ -383,7 +385,9 @@ "sprite": "snow.png" }, { - "categories": [], + "categories": [ + "Ground" + ], "description": "A blanket of snow covers the ground", "id": "snow_01", "name": "Snow", @@ -391,11 +395,339 @@ "sprite": "snow1.png" }, { - "categories": [], + "categories": [ + "Ground" + ], "description": "A blanket of snow covers the ground", "id": "snow_02", "name": "Snow", "shape": "cube", "sprite": "snow2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "There is only sand here", + "id": "sand_00", + "name": "Sand", + "shape": "cube", + "sprite": "sand.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The ground is covered in fine sand", + "id": "sand_fine_00", + "name": "Fine sand", + "shape": "cube", + "sprite": "fineand.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A hard suface with a dark color.", + "id": "rock_floor_00", + "name": "Rock floor", + "shape": "cube", + "sprite": "rockyfloor1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A hard suface with a dark color.", + "id": "rock_floor_01", + "name": "Rock floor", + "shape": "cube", + "sprite": "rockyfloor2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A hard suface with a dark color.", + "id": "rock_floor_02", + "name": "Rock floor", + "shape": "cube", + "sprite": "rockyfloor3.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A hard suface with a dark color.", + "id": "rock_floor_03", + "name": "Rock floor", + "shape": "cube", + "sprite": "rockfloor.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A hard suface with a dark color.", + "id": "rock_floor_04", + "name": "Rock floor", + "shape": "cube", + "sprite": "rockyfloor4.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A hard suface with a dark color.", + "id": "rock_floor_05", + "name": "Rock floor", + "shape": "cube", + "sprite": "rockyfloor5.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A hard suface with a dark color.", + "id": "rock_floor_06", + "name": "Rock floor", + "shape": "cube", + "sprite": "rockyfloor6.png" + }, + { + "categories": [ + "Slopes" + ], + "description": "A rocky surface allowing you to move up or down", + "id": "rock_slope_00", + "name": "Rock slope", + "shape": "slope", + "sprite": "rockyfloorrampnorth.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A rocky surface that doesn't leave any footprints", + "id": "rocky_earth_00", + "name": "Rock floor", + "shape": "cube", + "sprite": "rockyearth.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The terrain is made out of mud. Don't get stuck!", + "id": "mud_00", + "name": "Mud", + "shape": "cube", + "sprite": "mud.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The terrain is made out of mud. Don't get stuck!", + "id": "mud_01", + "name": "Mud", + "shape": "cube", + "sprite": "mud1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The terrain is made out of mud. Don't get stuck!", + "id": "mud_02", + "name": "Mud", + "shape": "cube", + "sprite": "mud2.png" + }, + { + "categories": [ + "Wall" + ], + "description": "A sturdy metal wall. The surface seems scratched and a bit worn.", + "id": "metal_wall_00", + "name": "Metal wall", + "shape": "cube", + "sprite": "metalwall1.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted yellow", + "id": "kitchen_tiles_yellow_00", + "name": "Kitchen tiles (yellow)", + "shape": "cube", + "sprite": "kitchentiles.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted yellow", + "id": "kitchen_tiles_yellow_01", + "name": "Kitchen tiles (yellow)", + "shape": "cube", + "sprite": "kitchentiles1.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted yellow", + "id": "kitchen_tiles_yellow_02", + "name": "Kitchen tiles (yellow)", + "shape": "cube", + "sprite": "Kitchentiles2.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted mint", + "id": "kitchen_tiles_mint_00", + "name": "Kitchen tiles (mint)", + "shape": "cube", + "sprite": "kitchentilesblue.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted mint", + "id": "kitchen_tiles_mint_01", + "name": "Kitchen tiles (mint)", + "shape": "cube", + "sprite": "kitchentilesblue1.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted mint", + "id": "kitchen_tiles_mint_02", + "name": "Kitchen tiles (mint)", + "shape": "cube", + "sprite": "kitchentilesblue2.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted mint", + "id": "kitchen_tiles_mint_03", + "name": "Kitchen tiles (mint)", + "shape": "cube", + "sprite": "kitchentilesblue3.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted green", + "id": "kitchen_tiles_green_00", + "name": "Kitchen tiles (green)", + "shape": "cube", + "sprite": "kitchentilesgreen.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted green", + "id": "kitchen_tiles_green_01", + "name": "Kitchen tiles (green)", + "shape": "cube", + "sprite": "kitchentilesgreen1.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted green", + "id": "kitchen_tiles_green_02", + "name": "Kitchen tiles (green)", + "shape": "cube", + "sprite": "kitchentilesgreen2.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted blue", + "id": "kitchen_tiles_blue_00", + "name": "Kitchen tiles (blue)", + "shape": "cube", + "sprite": "KitchentilesPurple.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted blue", + "id": "kitchen_tiles_blue_01", + "name": "Kitchen tiles (blue)", + "shape": "cube", + "sprite": "kitchentilespurple1.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted blue", + "id": "kitchen_tiles_blue_02", + "name": "Kitchen tiles (blue)", + "shape": "cube", + "sprite": "Kitchentilespurple2.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted purple", + "id": "kitchen_tiles_purple_00", + "name": "Kitchen tiles (purple)", + "shape": "cube", + "sprite": "kitchentilespurple3.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted purple", + "id": "kitchen_tiles_purple_01", + "name": "Kitchen tiles (purple)", + "shape": "cube", + "sprite": "kitchentilespurple4.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a kitchen. The tiles are painted purple", + "id": "kitchen_tiles_purple_02", + "name": "Kitchen tiles (purple)", + "shape": "cube", + "sprite": "kitchentilespurple5.png" } ] \ No newline at end of file From cb53e17da2e3b71699f312b2633c66f71172e06c Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 17 Jan 2024 10:17:03 +0100 Subject: [PATCH 094/138] Delete old tiles, add new ones --- Mods/Core/Tiles/Tiles.json | 220 +++++++++++++++++++ Mods/Core/Tiles/forestunderbrush.png | Bin 43308 -> 0 bytes Mods/Core/Tiles/forestunderbrush.png.import | 34 --- Mods/Core/Tiles/forestunderbrush1.png | Bin 38785 -> 0 bytes Mods/Core/Tiles/forestunderbrush1.png.import | 34 --- Mods/Core/Tiles/forestunderbrush2.png | Bin 38594 -> 0 bytes Mods/Core/Tiles/forestunderbrush2.png.import | 34 --- Mods/Core/Tiles/forestunderbrush3.png | Bin 41775 -> 0 bytes Mods/Core/Tiles/forestunderbrush3.png.import | 34 --- Mods/Core/Tiles/forestunderbrush4.png | Bin 44211 -> 0 bytes Mods/Core/Tiles/forestunderbrush4.png.import | 34 --- Mods/Core/Tiles/grasseastdirt.png | Bin 35159 -> 0 bytes Mods/Core/Tiles/grasseastdirt.png.import | 34 --- Mods/Core/Tiles/grasssouthdirt.png | Bin 34815 -> 0 bytes Mods/Core/Tiles/grasssouthdirt.png.import | 34 --- Mods/Core/Tiles/grasswestdirt.png | Bin 35414 -> 0 bytes Mods/Core/Tiles/grasswestdirt.png.import | 34 --- 17 files changed, 220 insertions(+), 272 deletions(-) delete mode 100644 Mods/Core/Tiles/forestunderbrush.png delete mode 100644 Mods/Core/Tiles/forestunderbrush.png.import delete mode 100644 Mods/Core/Tiles/forestunderbrush1.png delete mode 100644 Mods/Core/Tiles/forestunderbrush1.png.import delete mode 100644 Mods/Core/Tiles/forestunderbrush2.png delete mode 100644 Mods/Core/Tiles/forestunderbrush2.png.import delete mode 100644 Mods/Core/Tiles/forestunderbrush3.png delete mode 100644 Mods/Core/Tiles/forestunderbrush3.png.import delete mode 100644 Mods/Core/Tiles/forestunderbrush4.png delete mode 100644 Mods/Core/Tiles/forestunderbrush4.png.import delete mode 100644 Mods/Core/Tiles/grasseastdirt.png delete mode 100644 Mods/Core/Tiles/grasseastdirt.png.import delete mode 100644 Mods/Core/Tiles/grasssouthdirt.png delete mode 100644 Mods/Core/Tiles/grasssouthdirt.png.import delete mode 100644 Mods/Core/Tiles/grasswestdirt.png delete mode 100644 Mods/Core/Tiles/grasswestdirt.png.import diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index f3c763e3..94d3c647 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -729,5 +729,225 @@ "name": "Kitchen tiles (purple)", "shape": "cube", "sprite": "kitchentilespurple5.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The ground is covered with small pebbles", + "id": "gravel_00", + "name": "Gravel", + "shape": "cube", + "sprite": "gravel.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The ground is covered with small pebbles", + "id": "gravel_01", + "name": "Gravel", + "shape": "cube", + "sprite": "gravel1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The ground is covered with small pebbles", + "id": "gravel_02", + "name": "Gravel", + "shape": "cube", + "sprite": "gravel2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "Dirt is barely visible trough the carpet of grass", + "id": "grass_dirt_00", + "name": "Grass with dirt", + "shape": "cube", + "sprite": "grassdirt.png" + }, + { + "categories": [ + "Ground" + ], + "description": "Dirt is barely visible trough the carpet of grass", + "id": "grass_dirt_01", + "name": "Grass with dirt", + "shape": "cube", + "sprite": "grassdirt1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "Dirt is barely visible trough the carpet of grass", + "id": "grass_dirt_02", + "name": "Grass with dirt", + "shape": "cube", + "sprite": "grassdirt2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "Dirt is visible trough the grass", + "id": "grass_medium_dirt_00", + "name": "Grass with dirt", + "shape": "cube", + "sprite": "grasssmalldirt.png" + }, + { + "categories": [ + "Ground" + ], + "description": "Dirt is visible trough the grass", + "id": "grass_medium_dirt_01", + "name": "Grass with dirt", + "shape": "cube", + "sprite": "grasssmalldirt1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "Dirt is visible trough the grass", + "id": "grass_medium_dirt_02", + "name": "Grass with dirt", + "shape": "cube", + "sprite": "grasssmalldirt2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "One side of the terrain is just dirt and no grass", + "id": "grass_dirt_north_00", + "name": "Grass with a patch of dirt", + "shape": "cube", + "sprite": "grassnorthdirt.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The center of the terrain is just dirt and no grass", + "id": "grass_dirt_center_00", + "name": "Grass with a patch of dirt", + "shape": "cube", + "sprite": "grasscenterdirt.png" + }, + { + "categories": [ + "Ground" + ], + "description": "Some flowers are sprouting trough the grass", + "id": "grass_flowers_00", + "name": "Grass with flowers", + "shape": "cube", + "sprite": "grassflowers2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "Some flowers are sprouting trough the grass", + "id": "grass_flowers_01", + "name": "Grass with flowers", + "shape": "cube", + "sprite": "grassflowers3.png" + }, + { + "categories": [ + "Ground" + ], + "description": "Some flowers are sprouting trough the grass", + "id": "grass_flowers_02", + "name": "Grass with flowers", + "shape": "cube", + "sprite": "grassflowers4.png" + }, + { + "categories": [ + "Ground" + ], + "description": "Some flowers are sprouting trough the grass", + "id": "grass_flowers_03", + "name": "Grass with flowers", + "shape": "cube", + "sprite": "grasslowers.png" + }, + { + "categories": [ + "Slopes" + ], + "description": "This ramp is covered with grass. You can go up and down here", + "id": "grass_ramp_00", + "name": "Grass ramp", + "shape": "slope", + "sprite": "Grassrampnorth1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The ground is littered with twigs, leaves, sticks and all kinds of plant matter. Very tipical of a forest floor", + "id": "forest_underbrush_00", + "name": "Forest underbrush", + "shape": "cube", + "sprite": "forestunderbrushscale.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The ground is littered with twigs, leaves, sticks and all kinds of plant matter. Very tipical of a forest floor", + "id": "forest_underbrush_01", + "name": "Forest underbrush", + "shape": "cube", + "sprite": "forestunderbrushscale1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The ground is littered with twigs, leaves, sticks and all kinds of plant matter. Very tipical of a forest floor", + "id": "forest_underbrush_02", + "name": "Forest underbrush", + "shape": "cube", + "sprite": "forestunderbrushscale2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The ground is littered with twigs, leaves, sticks and all kinds of plant matter. Very tipical of a forest floor", + "id": "forest_underbrush_03", + "name": "Forest underbrush", + "shape": "cube", + "sprite": "forestunderbrushscale3.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The ground is littered with twigs, leaves, sticks and all kinds of plant matter. Very tipical of a forest floor", + "id": "forest_underbrush_04", + "name": "Forest underbrush", + "shape": "cube", + "sprite": "forestunderbrushscale4.png" + }, + { + "categories": [ + "Ground" + ], + "description": "The ground is littered with twigs, leaves, sticks and all kinds of plant matter. Very tipical of a forest floor", + "id": "forest_underbrush_05", + "name": "Forest underbrush", + "shape": "cube", + "sprite": "forestunderbrushscale5.png" } ] \ No newline at end of file diff --git a/Mods/Core/Tiles/forestunderbrush.png b/Mods/Core/Tiles/forestunderbrush.png deleted file mode 100644 index a518165a0903efd89d51dcf7744c5575af6e5fa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43308 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 diff --git a/Mods/Core/Tiles/forestunderbrush.png.import b/Mods/Core/Tiles/forestunderbrush.png.import deleted file mode 100644 index f6bdd836..00000000 --- a/Mods/Core/Tiles/forestunderbrush.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cnsf3hxfqi3re" -path="res://.godot/imported/forestunderbrush.png-85e3281d606808e065a046d769ef4714.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/forestunderbrush.png" -dest_files=["res://.godot/imported/forestunderbrush.png-85e3281d606808e065a046d769ef4714.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/forestunderbrush1.png b/Mods/Core/Tiles/forestunderbrush1.png deleted file mode 100644 index fd9f28ef62d7fab2751a64d2053ac485faebef4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38785 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�`^W5G1 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

)DmVe^pRok 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 diff --git a/Mods/Core/Tiles/forestunderbrush3.png.import b/Mods/Core/Tiles/forestunderbrush3.png.import deleted file mode 100644 index 5c7f4e0b..00000000 --- a/Mods/Core/Tiles/forestunderbrush3.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bxvtqdi0u3o6s" -path="res://.godot/imported/forestunderbrush3.png-2231030839b9f82151cdd73a008ab3b9.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/forestunderbrush3.png" -dest_files=["res://.godot/imported/forestunderbrush3.png-2231030839b9f82151cdd73a008ab3b9.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/forestunderbrush4.png b/Mods/Core/Tiles/forestunderbrush4.png deleted file mode 100644 index a3b7210e4161045d95bbc333d931f3df1b4e1b87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44211 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

>n+*Z$Z=Cpj2RFglqDl;W98ggdugGTHy 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
a9! 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

U+y4^7 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 literal 4974 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 diff --git a/Mods/Core/Maps/RockyHill_SE.json b/Mods/Core/Maps/RockyHill_SE.json index 213c7cb6..85d3092d 100644 --- a/Mods/Core/Maps/RockyHill_SE.json +++ b/Mods/Core/Maps/RockyHill_SE.json @@ -198,6 +198,9 @@ "id": "grass_flowers_00" }, { + "furniture": { + "id": "PineTree_00" + }, "id": "grass_flowers_00" }, { @@ -777,6 +780,9 @@ "id": "rock_floor_00" }, { + "furniture": { + "id": "WillowTree_00" + }, "id": "grass_flowers_01" }, { @@ -1350,6 +1356,9 @@ "id": "rock_floor_00" }, { + "furniture": { + "id": "Tree_00" + }, "id": "grass_medium_dirt_00" }, { @@ -2118,6 +2127,9 @@ "id": "grass_plain_01" }, { + "furniture": { + "id": "PineTree_00" + }, "id": "grass_medium_dirt_00" }, { @@ -2592,6 +2604,9 @@ "id": "grass_plain_01" }, { + "furniture": { + "id": "WillowTree_00" + }, "id": "grass_flowers_01" }, { @@ -2775,6 +2790,9 @@ "id": "grass_flowers_03" }, { + "furniture": { + "id": "Tree_00" + }, "id": "grass_medium_dirt_00" }, { @@ -2910,6 +2928,9 @@ "id": "grass_flowers_00" }, { + "furniture": { + "id": "Tree_00" + }, "id": "grass_medium_dirt_00" }, { @@ -2928,6 +2949,9 @@ "id": "grass_plain_01" }, { + "furniture": { + "id": "WillowTree_00" + }, "id": "grass_flowers_01" }, { @@ -3033,6 +3057,9 @@ "id": "grass_plain_01" }, { + "furniture": { + "id": "PineTree_00" + }, "id": "grass_medium_dirt_00" }, { diff --git a/Mods/Core/Maps/RockyHill_SW.json b/Mods/Core/Maps/RockyHill_SW.json index 10933fa7..b8fc4d16 100644 --- a/Mods/Core/Maps/RockyHill_SW.json +++ b/Mods/Core/Maps/RockyHill_SW.json @@ -399,6 +399,9 @@ "id": "grass_plain_01" }, { + "furniture": { + "id": "WillowTree_00" + }, "id": "grass_flowers_00" }, { @@ -594,6 +597,9 @@ "id": "grass_plain_01" }, { + "furniture": { + "id": "PineTree_00" + }, "id": "grass_medium_dirt_02" }, { @@ -1074,6 +1080,9 @@ "id": "grass_plain_01" }, { + "furniture": { + "id": "WillowTree_00" + }, "id": "grass_medium_dirt_02" }, { @@ -1372,6 +1381,9 @@ "id": "grass_plain_01" }, { + "furniture": { + "id": "PineTree_00" + }, "id": "grass_dirt_01", "rotation": 90 }, @@ -2039,16 +2051,21 @@ "id": "grass_plain_01" }, { - "id": "grass_medium_dirt_02" + "furniture": { + "id": "Tree_00" + }, + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "id": "rocky_earth_00", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "rocky_earth_00", + "rotation": 90 }, { "id": "grass_plain_01" @@ -2133,22 +2150,28 @@ "id": "grass_plain_01" }, { - "id": "grass_plain_01" + "id": "grass_dirt_north_00", + "rotation": 90 }, { - "id": "grass_plain_01" + "furniture": { + "id": "Tree_00" + }, + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "id": "rocky_earth_00", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "rocky_earth_00", + "rotation": 90 }, { "id": "grass_plain_01" @@ -2232,19 +2255,23 @@ "id": "grass_plain_01" }, { - "id": "grass_dirt_01" + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "furniture": { + "id": "PineTree_00" + }, + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "id": "forest_underbrush_03" }, { - "id": "grass_flowers_00" + "id": "rocky_earth_00", + "rotation": 90 }, { "id": "grass_dirt_00" @@ -2325,22 +2352,30 @@ "id": "grass_plain_01" }, { - "id": "grass_plain_01" + "id": "grass_dirt_north_00", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "furniture": { + "id": "PineTree_00" + }, + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "id": "forest_underbrush_03" }, { - "id": "grass_dirt_00" + "furniture": { + "id": "Tree_00" + }, + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "id": "rocky_earth_00", + "rotation": 90 }, { "id": "grass_plain_01" @@ -2427,13 +2462,15 @@ "id": "grass_dirt_00" }, { - "id": "grass_plain_01" + "id": "rocky_earth_00", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "forest_underbrush_03" }, { - "id": "grass_plain_01" + "id": "rocky_earth_00", + "rotation": 90 }, { "id": "grass_plain_01" @@ -2524,13 +2561,16 @@ "id": "grass_plain_01" }, { - "id": "grass_plain_01" + "id": "rocky_earth_00", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "rocky_earth_00", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "rocky_earth_00", + "rotation": 90 }, { "id": "grass_plain_01" @@ -2635,6 +2675,9 @@ "id": "grass_plain_01" }, { + "furniture": { + "id": "WillowTree_00" + }, "id": "grass_medium_dirt_02" }, { @@ -2860,6 +2903,9 @@ "rotation": 90 }, { + "furniture": { + "id": "PineTree_00" + }, "id": "grass_medium_dirt_01", "rotation": 90 }, @@ -2912,6 +2958,9 @@ "id": "grass_flowers_00" }, { + "furniture": { + "id": "Tree_00" + }, "id": "grass_medium_dirt_00" }, { @@ -2921,6 +2970,9 @@ "id": "grass_flowers_00" }, { + "furniture": { + "id": "PineTree_00" + }, "id": "grass_medium_dirt_00" }, { @@ -2987,6 +3039,9 @@ "id": "grass_dirt_01" }, { + "furniture": { + "id": "WillowTree_00" + }, "id": "grass_dirt_01" }, { diff --git a/Mods/Core/Maps/RockyHill_SW.png b/Mods/Core/Maps/RockyHill_SW.png index d4394bbe970f63c3539a87952cdcfd9e4e486518..69d1101ba87cf153d808f0afda64e02712212dbe 100644 GIT binary patch delta 4122 zcmY*bc{tQ<_n(ciWXM=+WJ=j%dSq8Kw4lXOB4rspl|)&_PQGKANYW;x!B~==qU;P_ z@z}-^V~eqlEHfmAnefx|d;fXw>;B`uKG(U=bdy{oy$AgvFIB0Pb-6x ziH`Be=)AM%^rgJ81Q4LuOPDAB4i&C;!Fk0Gd|nIux#^N0I?bDCo|{vYl9HmzGQbC)BXx3<1W_g)-4j`>Q}Pxm%a1URCeYX2Oo z{Q}D%Uh91kWw)^-G)hY|xgh`8n%Y;;k@s_lh1{%v&ZMOSf4jR2uLnQ+DwzDcYXZ1z zor*K(YZr(rc@Z_LtJ%nb!i+(VbiB;@{7!-B1o5~NOG`_PrQtFy3+j^l#0@U)N&f*2 z5=2X73d8a+HoP7=;?$(S!Sfn0uRA&dms2Y$D!hO69doGk0?UVO9!9mwE^zL2J(0ur-4DyK!qqvoZu2;+J3O|l zQx<^@dTqOQ@EO1A8zCJX9k0El@1-Obq@)_clgm?_3kGm1Ej8@=r*P3jRBy7wz*70! zE0N?uU+2T~7pz3^+#lGr;P6a#aLn-nB1!A%bq64n&$Hg|xL?@j%3&cABrz#zbv%SE zk{XGol7yxAycON7=y_P-z4JTBcRZ!NMHt} z={qaE^BD10w<>&e+V_=u^wR)1fvAe1|0=NANh)*8w^0;GAbX6dI3eO0cSqD2L5> z+Cqc;h;ALMXclNX5qgPh@CZnRp4Fq4-{F*@@a<*13`5Wz;zO-@DUx{G7}%gV`pSEL z$BNaB&z`^Z8^^~FX*k!%-TD}FQ1@Xc3g3r9w+r4yU?ve_voI}qvKKtYC*mzMdl_T^ z22)^+&#=KZSqVQ8e@d2k0wekRO9PyZhFJH)^c-Z8_q1ioW>)AW5CUnG^v#TPlQ{0{ z!vvY9;zzilFdh_jlusq|I*hyH+*g@7@Hq7vRJQdLmvi-1_#W zqlTN}zQ~9OD*5k~1S*B6n-4rbUxzS(U3jmm;Z&azlj;wB?80b&qgMHdr{h3x85={f z#_OJLZ3UqY9oi^etcJ3mS0CD`HD{W^l`kR-&!gidfbt_PF7D+#XeIk-{*OtXYnAag z2V9J0ZuGQ*bZhw2?HsM2`r#|5x3hWNJ)u}@Bzb#z5lJLcCui2Rs|qWR|58lTgSQ3S zuHe}}JRH-R!_-=PbOscBY&Dla z-hkY#5xp?H^T2i*<9$y2sbP<}pFd{t?4uTsMK}!i1FRhm-e^ zZoaz&h(b5m_9L;ZJno!z6L6(M%23HH1!}bU>vXJ6Gl_1yGQ#zlFwh|jcMfi=FhSNK zkSw1FYx?iK$|6H0JmgYZahD^gGggVQZ;-X^JIcM)0N`n8y9<0_S?a@MMvyXZkVd@T zs+WVm_d>q|_c|%sniHA${T%Y)#QH*hICfAMPjh==vc4>D#skRI+?}vwrEPLUh9NO7 zS<)!%TT6psgGt3d8L~&$QRwAIyY}?4TJPHkF>SSb60)^OuzP&Qs934{k2#RJE7-LP z*Mvgfx5ao_?q(*LiL5sXM#NvzhMO4(>viyn8-N6G+7M;R7HJ~Du}no-VMx+1@WD&& z4ly?j7&{dK{Og<*0^ZZlPbX?8IHy(`Lm-lu1yO#Qlw^|6w*Q8cI06R%q@U|Lg z_IF{KjY38_VF7_Dkp@8o4qH2XGY(tra_AD=(_|asg})|#s4T*s&M2(%v}BB>JegS2 zxYaOrmT@5=kFWo>vKKV!b^RJRb7Nmlof6Q);cFk@L&@oW^bgBocT#e|UVSOp2i-kP(4+^@xKQ+?RZf@Amb`Rh?L(I=7lkG-OFvQ=+ydFBA0wB~ zS-#WyrBA$jRSa~TWdiFZfLx02`9Ifci=2I#b_|tvka2}wb*O%~x7iY@-(0yi1k8fG zQ_;%~E`5PZKEz53FV=5K4{S(meE<3P2Aok|!%SsWQ}*i6A2a-&^>rHp$^7sCAD`Hw zNi^}U^}Z=BVIAMhj8TSI;@N08lr5^YwI$`-Ok|)6+?lI0tIalBUpWoYU0s*e)zyh7 z9%ltB^{(l9j+5`jFM|N@3AJQD4NQooOFKf0Qx{>+gjgfQ=G^uG4|ojEsj-j{t_)A! z;7EM+CyrD^ljiWU#>>E-y1qHWpK8S zY03gkIvFP*Z>I|H3(+}|cjopo`lB3rOieka(c*=lhS;?=;I)DA|5&SF;0DHnRn$_N zf`H+9hiEhI?>0HK%JUjzcB(>LDl{&n1nurB69SjvI2m72GBY%lG5q&E*o|37U>3%4 zgJjNl)83y&4r1=RpyD{#sa#jAf}hy}{#sOl@qxE-zc&X3M2xLN46sXpNr8PXn=dy} zHk-*=ajsoM7|6jvU}?x3pQ>oKQ)u#{1Nz5KxOYH|8T?+gqePL=eaTqoZ7$_GpJ)%O zQUD?k%YMF=CVcce7Q;g953)di|I+KGx4G1K_=}DmRlOj(BS)n9q_H4aT3n94IQjL) z;`?sNU)36Ob8|q*Lp*RLtd}65=~;g&feqNl8z_0tGhwHX{7ML(3E+)#d8q>ox3xX(YrtwZpWe^lErj_C~U1w>Zndk@#|d=)~ez<(+Qx+a2HqRGpx;u1W9^_`&SUwB0H#C_- zp^K45+g$%*rjX*ZEYx9dgcx1$=V?2P8@W=tXUE#;&s?O@8)W`*XzbkY)VW`rxmV4M zRT8r*4Nyxy8SfMIjX+f1Yq-$3(Vd9M$Wy*#olE^qS<&e(L3gz6EX3|^3|7#>sJ@W8 zHbw<3)Q(7a^6FY+MlZGB&`({X9+G1e`g8HjJ;htAHFoq~kI%*woM7{$n#gY!NA_Hz zs{HP&Oaonb$!JS=x3r#{&iQsD0ZKwsZ!g#uu%(wa)V%&dL$*As1AUW7`6T>di88R- z=+DoAWa^En#Vm*%ot1tR;5|}D(kwxmSSd?=tl^lRy5Ds$S_e!Blqi(5{YDB=XWQ$VZ z+1>njtI(Bbg`!>;rOHb0V|IT?n@qVcE@F(fawd~yJ2)Du<1D( z%GZUyZgc14=8uj%GEzQM`Kn(OYr5Uc-FHZEr0BJSK4d^$s0mbZj3TYl)LA3W-``UN z7f8m{1#tn*_xl_KItT9OvQg9hmH@(QdBJC5J(s4bK95eIDr>~JExLhSP>*FXKeW8m$88!BpM5Ae zrM;bwt$vp~7wsydIo#nDZ!rG}gfJ>6rGHZJh^sswor>4Aix&&gU|6OAH=(?3bKb5! zLC>@;M8vZFBNLLz{V#ISQ)hue{@c~{;9^PLc&okZwz+;ExCvFfYEAYRk=JSP5V2g? zSLH{pgf3|BXvn-Az@~z+ne; z0rM(>SYE|AsEmQ4AUEFLD(SWG9mkDvWaFGm4l@yAEIAp)WtXYmjKQVcvbc_R)cumf z?fY#fN~T>acA+rPFnu!2M|+}!Yt;m@jecXy;yAB0+mO>TqC-EUV0 z;D9F!E)e~1DRO>^tFu4bUxbK6$~D$*$mSO)LQIKoC6uuBdiIDH+6T|^%aV8An}u;F zri|prkz1EaLN~wQ3ooCpXq6huebch`|++RIz($ zzGb^>=Vrtw9gfCo(ZGFk4_{AvP85W1&jIPPm9&tHV1Hqyz$=0A3gfceov3di(iwY} z!(ZjeTR3wNNLgWJRD8OVUXrvD`A%eBhvahAH$JeCS(gX`#S}+4QLbyGhcmg16ryOn zg;Lu#8(d%g=owU)X%2UbnLm3e^~ggJ`3>6Z8Weg-%nb+|wAf$qSo9qs z2^uALWSK@AQJETCaUrmLh@}KQ-s<40wS(Trzx-k=wL^!nv|X?VQUR5ui%q70_Kx{E Li?hWh_=x`lA!Ys9 delta 3519 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 diff --git a/Mods/Core/Maps/urbanroad.json b/Mods/Core/Maps/urbanroad.json index 3f32e4d4..c8ffc442 100644 --- a/Mods/Core/Maps/urbanroad.json +++ b/Mods/Core/Maps/urbanroad.json @@ -12,4100 +12,3121 @@ [], [ { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "Tree_00" + }, + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "PineTree_00" + }, + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "PineTree_00" + }, + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "Tree_00" + }, + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "WillowTree_00" + }, + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "Tree_00" + }, + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "WillowTree_00" + }, + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "Tree_00" + }, + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "PineTree_00" + }, + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_horizontal" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "road_asphalt_basic", - "rotation": 0 + "id": "road_asphalt_basic" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_03" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "Tree_00" + }, + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_03" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "PineTree_00" + }, + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_03" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "WillowTree_00" + }, + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_03" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "WillowTree_00" + }, + "id": "grass_flowers_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "Tree_00" + }, + "id": "grass_flowers_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "PineTree_00" + }, + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_flowers_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_02" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_medium_dirt_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" } ], [], @@ -4121,4 +3142,4 @@ ], "mapheight": 32, "mapwidth": 32 -} +} \ No newline at end of file diff --git a/Mods/Core/Maps/urbanroad.png b/Mods/Core/Maps/urbanroad.png index c153cdf9a88a154c91679fc5a7ecdacf88b2fb98..4c8314c7844eddd6fb00df4bc5e260c30aa42533 100644 GIT binary patch literal 3546 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 SM-hG20JaydSdlHf?*A7s(H2tx literal 598 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>U=r|jaSW-L z^Y+fhKxRV$w}&N}@+Do=k4J$#`*Rs~3@mzGVpTe+$8eL5_bRPfk3V+5+qdHi&-wq;Lzg(|>lh8=hL8Mgmsd{E{taL0^c5Fz`T XgdpOehSVu6{1-oD!M<7>M;n From 8fb2e60a5f4cb77977f4bc6bde8d6a4704cc9f8a Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 26 Jan 2024 14:59:54 +0100 Subject: [PATCH 131/138] Scaling on the mapeditor --- Scenes/ContentManager/Mapeditor/mapeditortile.tscn | 4 ++-- Scenes/ContentManager/Mapeditor/tilebrush.tscn | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn index 7ea2c40a..0b431286 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn @@ -26,13 +26,13 @@ expand_mode = 3 [node name="MobFurnitureSprite" type="TextureRect" parent="."] visible = false layout_mode = 1 -anchors_preset = -1 +anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -texture = ExtResource("2_rued1") expand_mode = 2 +stretch_mode = 5 [connection signal="gui_input" from="TileSprite" to="." method="_on_texture_rect_gui_input"] [connection signal="mouse_entered" from="TileSprite" to="." method="_on_texture_rect_mouse_entered"] diff --git a/Scenes/ContentManager/Mapeditor/tilebrush.tscn b/Scenes/ContentManager/Mapeditor/tilebrush.tscn index be00e286..9a3e6e98 100644 --- a/Scenes/ContentManager/Mapeditor/tilebrush.tscn +++ b/Scenes/ContentManager/Mapeditor/tilebrush.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://cccnrdolr1bfo"] [ext_resource type="Script" path="res://Scenes/ContentManager/Mapeditor/Scripts/tilebrush.gd" id="1_x2ml4"] -[ext_resource type="Texture2D" uid="uid://ttmfel3ylg0w" path="res://Mods/Core/Tiles/arcstones1.png" id="2_7dvcp"] +[ext_resource type="Texture2D" uid="uid://d0ec7u2d3yqqp" path="res://Mods/Core/Tiles/asphalt_middle_horizontal.png" id="2_0qm6c"] [node name="TileBrush" type="Control"] custom_minimum_size = Vector2(64, 64) @@ -18,7 +18,8 @@ custom_minimum_size = Vector2(64, 64) layout_mode = 0 offset_right = 40.0 offset_bottom = 40.0 -texture = ExtResource("2_7dvcp") -expand_mode = 3 +texture = ExtResource("2_0qm6c") +expand_mode = 2 +stretch_mode = 4 [connection signal="gui_input" from="TileSprite" to="." method="_on_texture_rect_gui_input"] From 41804ebb49913c38cc00627b0157829f5757f624 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:33:49 +0100 Subject: [PATCH 132/138] Furniture edge snapping --- LevelGenerator.gd | 69 +++++++++++++++++-- Mods/Core/Furniture/Furniture.json | 2 + .../Custom_Editors/FurnitureEditor.tscn | 29 +++++++- .../Custom_Editors/Scripts/FurnitureEditor.gd | 16 +++++ 4 files changed, 110 insertions(+), 6 deletions(-) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 34b2ed16..f5206a75 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -219,23 +219,82 @@ func add_furniture_to_block(tileJSON: Dictionary, block: StaticBody3D): var newFurniture: Node3D var furnitureJSON: Dictionary = Gamedata.get_data_by_id(\ Gamedata.data.furniture, tileJSON.furniture.id) + var furnitureSprite: Texture = Gamedata.data.furniture.sprites[furnitureJSON.sprite] + + # Calculate the size of the furniture based on the sprite dimensions + var spriteWidth = furnitureSprite.get_width() / 100.0 # Convert pixels to meters (assuming 100 pixels per meter) + var spriteDepth = furnitureSprite.get_height() / 100.0 # Convert pixels to meters + + var edgeSnappingDirection = furnitureJSON.get("edgesnapping", "None") + var rotation = tileJSON.furniture.get("rotation", 0) + if furnitureJSON.has("moveable") and furnitureJSON.moveable: newFurniture = defaultFurniturePhysics.instantiate() else: newFurniture = defaultFurnitureStatic.instantiate() + newFurniture.add_to_group("furniture") - newFurniture.set_sprite(Gamedata.data.furniture.sprites[furnitureJSON.sprite]) + + # Set the sprite and adjust the collision shape + newFurniture.set_sprite(furnitureSprite) + get_tree().get_root().add_child(newFurniture) - newFurniture.global_position.x = block.global_position.x - newFurniture.global_position.y = block.global_position.y + 0.5 - newFurniture.global_position.z = block.global_position.z - + + # Position furniture at the center of the block by default + var furniturePosition = block.global_position + furniturePosition.y += 0.5 # Slightly above the block + + # Apply edge snapping if necessary + if edgeSnappingDirection != "None": + furniturePosition = apply_edge_snapping(furniturePosition, edgeSnappingDirection, spriteWidth, spriteDepth, rotation, block) + + newFurniture.global_position = furniturePosition + if tileJSON.furniture.has("rotation"): newFurniture.set_new_rotation(tileJSON.furniture.rotation) else: newFurniture.set_new_rotation(0) + newFurniture.id = furnitureJSON.id +func apply_edge_snapping(position, direction, width, depth, rotation, block): + # Block size, assuming a block is 1x1 meters + var blockSize = Vector3(1.0, 1.0, 1.0) + + # Adjust position based on edgesnapping direction and rotation + match direction: + "North": + position.z -= blockSize.z / 2 - depth / 2 + "South": + position.z += blockSize.z / 2 - depth / 2 + "East": + position.x += blockSize.x / 2 - width / 2 + "West": + position.x -= blockSize.x / 2 - width / 2 + # Add more cases if needed + + # Consider rotation if necessary + position = rotate_position_around_block_center(position, rotation, block.global_position) + + return position + +func rotate_position_around_block_center(position, rotation, block_center): + # Convert rotation to radians for trigonometric functions + var radians = deg_to_rad(rotation) + + # Calculate the offset from the block center + var offset = position - block_center + + # Apply rotation matrix transformation + var rotated_offset = Vector3( + offset.x * cos(radians) - offset.z * sin(radians), + offset.y, + offset.x * sin(radians) + offset.z * cos(radians) + ) + + # Return the new position + return block_center + rotated_offset + func apply_block_rotation(tileJSON: Dictionary, block: StaticBody3D): if tileJSON.has("rotation"): if tileJSON.rotation != 0: diff --git a/Mods/Core/Furniture/Furniture.json b/Mods/Core/Furniture/Furniture.json index b4f9464c..c2805987 100644 --- a/Mods/Core/Furniture/Furniture.json +++ b/Mods/Core/Furniture/Furniture.json @@ -16,6 +16,7 @@ "Livingroom" ], "description": "A simple wooden chair, its construction is basic yet sturdy, a testament to durability in the face of decay. \nWith a rough-hewn seat and a backrest that bears the marks of time, this chair offers a momentary respite from the unforgiving environment.", + "edgesnapping": "None", "id": "chair_wood", "moveable": true, "name": "Wooden chair", @@ -28,6 +29,7 @@ "Indoor" ], "description": "One of the central pieces of fruniture that make up a kitchen", + "edgesnapping": "North", "id": "countertop_wood", "moveable": false, "name": "Wooden countertop", diff --git a/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn b/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn index f2db0a55..e46b8703 100644 --- a/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn @@ -5,7 +5,7 @@ [ext_resource type="PackedScene" uid="uid://b8i6wfk3fngy4" path="res://Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn" id="2_ekwf5"] [ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="3_o3k3a"] -[node name="FurnitureEditor" type="Control" node_paths=PackedStringArray("furnitureImageDisplay", "IDTextLabel", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "furnitureSelector", "imageNameStringLabel", "moveableCheckboxButton")] +[node name="FurnitureEditor" type="Control" node_paths=PackedStringArray("furnitureImageDisplay", "IDTextLabel", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "furnitureSelector", "imageNameStringLabel", "moveableCheckboxButton", "edgeSnappingOptionButton")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -21,6 +21,7 @@ CategoriesList = NodePath("VBoxContainer/FormGrid/Editable_Item_List") furnitureSelector = NodePath("Sprite_selector") imageNameStringLabel = NodePath("VBoxContainer/FormGrid/ImageNameStringLabel") moveableCheckboxButton = NodePath("VBoxContainer/FormGrid/UnmoveableCheckBox") +edgeSnappingOptionButton = NodePath("VBoxContainer/FormGrid/SnappingOptionButton") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -125,6 +126,32 @@ layout_mode = 2 tooltip_text = "Check this if the furniture should be moveable, like a chair. Leave this unchecked if the furniture should not move, like a fence" text = "Moveable" +[node name="SnappingLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Edge snapping" + +[node name="SnappingOptionButton" type="OptionButton" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "Snapping direction for the furniture. This +determines in what direction the furniture will +snap to the edge of a block. The 'back' of the +furniture determines the direction. +For example, if a fridge sprite has the back on the +north side, select north and the furniture will +snap to the north edge. Selecting none will center the sprite" +item_count = 5 +selected = 0 +popup/item_0/text = "None" +popup/item_0/id = 0 +popup/item_1/text = "North" +popup/item_1/id = 1 +popup/item_2/text = "East" +popup/item_2/id = 2 +popup/item_3/text = "South" +popup/item_3/id = 3 +popup/item_4/text = "West" +popup/item_4/id = 4 + [node name="Sprite_selector" parent="." instance=ExtResource("3_o3k3a")] visible = false diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd index 8dd76da4..72b95ef4 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd @@ -13,6 +13,7 @@ extends Control @export var furnitureSelector: Popup = null @export var imageNameStringLabel: Label = null @export var moveableCheckboxButton: CheckBox = null +@export var edgeSnappingOptionButton: OptionButton = null var control_elements: Array = [] # This signal will be emitted when the user presses the save button @@ -49,12 +50,25 @@ func load_furniture_data(): CategoriesList.add_item_to_list(category) if moveableCheckboxButton != null and contentData.has("moveable"): moveableCheckboxButton.button_pressed = contentData["moveable"] + if edgeSnappingOptionButton != null and contentData.has("edgesnapping"): + self.select_option_by_string(contentData["edgesnapping"]) #The editor is closed, destroy the instance #TODO: Check for unsaved changes func _on_close_button_button_up(): queue_free() + +# This function will select the option in the edgeSnappingOptionButton that matches the given string. +# If no match is found, it does nothing. +func select_option_by_string(option_string: String) -> void: + for i in range(edgeSnappingOptionButton.get_item_count()): + if edgeSnappingOptionButton.get_item_text(i) == option_string: + edgeSnappingOptionButton.selected = i + return + print_debug("No matching option found for the string: " + option_string) + + # This function takes all data from the form elements stores them in the contentData # Since contentData is a reference to an item in Gamedata.data.furniture.data # the central array for furnituredata is updated with the changes as well @@ -65,6 +79,7 @@ func _on_save_button_button_up(): contentData["description"] = DescriptionTextEdit.text contentData["categories"] = CategoriesList.get_items() contentData["moveable"] = moveableCheckboxButton.button_pressed + contentData["edgesnapping"] = edgeSnappingOptionButton.get_item_text(edgeSnappingOptionButton.selected) data_changed.emit() func _input(event): @@ -90,3 +105,4 @@ func _on_sprite_selector_sprite_selected_ok(clicked_sprite) -> void: var furnitureTexture: Resource = clicked_sprite.get_texture() furnitureImageDisplay.texture = furnitureTexture imageNameStringLabel.text = furnitureTexture.resource_path.get_file() + From 1468bc1bdd95df63b605729cee021a66a2f1f021 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 26 Jan 2024 23:16:16 +0100 Subject: [PATCH 133/138] Scale furniture on map editor --- Scenes/ContentManager/Mapeditor/mapeditortile.tscn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn index 0b431286..9d521390 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn @@ -32,7 +32,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 expand_mode = 2 -stretch_mode = 5 +stretch_mode = 4 [connection signal="gui_input" from="TileSprite" to="." method="_on_texture_rect_gui_input"] [connection signal="mouse_entered" from="TileSprite" to="." method="_on_texture_rect_mouse_entered"] From dfeeba84c634885aabc395e7ced777bf168c09e6 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 27 Jan 2024 00:18:34 +0100 Subject: [PATCH 134/138] Save player equipment between saves --- Scenes/InventoryWindow.tscn | 34 +++++++++++++++++----------------- Scripts/Helper.gd | 1 + Scripts/Helper/save_helper.gd | 20 ++++++++++++++++++++ Scripts/InventoryWindow.gd | 17 ++++++++++++++--- Scripts/general.gd | 2 ++ Scripts/hud.gd | 1 + Scripts/scene_selector.gd | 1 + hud.tscn | 2 +- 8 files changed, 57 insertions(+), 21 deletions(-) diff --git a/Scenes/InventoryWindow.tscn b/Scenes/InventoryWindow.tscn index 580c085f..7397c471 100644 --- a/Scenes/InventoryWindow.tscn +++ b/Scenes/InventoryWindow.tscn @@ -3,14 +3,14 @@ [ext_resource type="Script" path="res://Scripts/InventoryWindow.gd" id="1_7kqbx"] [ext_resource type="PackedScene" uid="uid://crck2fhgayxhn" path="res://Scenes/InventoryContainerListItem.tscn" id="2_xfgb3"] [ext_resource type="Script" path="res://addons/gloot/core/inventory_stacked.gd" id="3_l8xgt"] -[ext_resource type="Resource" uid="uid://b1tngttyk4w2s" path="res://ItemProtosets.tres" id="3_sqsc0"] +[ext_resource type="Resource" uid="uid://clehtt4tyqvdy" path="res://ItemProtosets.tres" id="3_sqsc0"] [ext_resource type="Script" path="res://addons/gloot/core/inventory_item.gd" id="5_qidb6"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="6_xpf2l"] [ext_resource type="Script" path="res://addons/gloot/ui/ctrl_item_slot_ex.gd" id="7_kcmi5"] [ext_resource type="Texture2D" uid="uid://dfmrlie57qrbo" path="res://Mods/Core/Items/9mm.png" id="8_0yr0i"] [ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_stacked.gd" id="9_8a8sx"] -[ext_resource type="Script" path="res://addons/gloot/core/item_slot.gd" id="9_qoep6"] [ext_resource type="Texture2D" uid="uid://df2n5aculnj82" path="res://addons/gloot/images/icon_inventory.svg" id="10_6ygdg"] +[ext_resource type="Script" path="res://addons/gloot/core/item_ref_slot.gd" id="11_nqptt"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hyt2o"] bg_color = Color(0.584314, 0.588235, 0.737255, 1) @@ -35,8 +35,8 @@ inventory_control = NodePath("HBoxContainer/CtrlInventoryStacked") inventory = NodePath("InventoryStacked") containerList = NodePath("HBoxContainer/ContainersList") containerListItem = ExtResource("2_xfgb3") -LeftHandEquipmentSlot = NodePath("HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentSlot") -RightHandEquipmentSlot = NodePath("HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentSlot") +LeftHandEquipmentSlot = NodePath("HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentRefSlot") +RightHandEquipmentSlot = NodePath("HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentRefSlot2") tooltip = NodePath("Tooltip") tooltip_item_name = NodePath("Tooltip/Panel/ItemName") tooltip_item_description = NodePath("Tooltip/Panel2/Description") @@ -144,16 +144,16 @@ layout_mode = 2 layout_mode = 2 text = "->" -[node name="LeftHandEquipmentSlot" type="Node" parent="HBoxContainer/EquipmentSlotList/LeftHandEquipment"] -script = ExtResource("9_qoep6") -item_protoset = ExtResource("3_sqsc0") +[node name="LeftHandEquipmentRefSlot" type="Node" parent="HBoxContainer/EquipmentSlotList/LeftHandEquipment"] +script = ExtResource("11_nqptt") +inventory_path = NodePath("../../../../InventoryStacked") [node name="LeftHandEquipmentSlotControl" type="Control" parent="HBoxContainer/EquipmentSlotList/LeftHandEquipment"] custom_minimum_size = Vector2(32, 32) layout_mode = 2 script = ExtResource("7_kcmi5") slot_style = SubResource("StyleBoxFlat_hyt2o") -item_slot_path = NodePath("../LeftHandEquipmentSlot") +item_slot_path = NodePath("../LeftHandEquipmentRefSlot") default_item_icon = ExtResource("8_0yr0i") label_visible = false @@ -164,20 +164,20 @@ text = "Left hand" [node name="RightHandEquipment" type="HBoxContainer" parent="HBoxContainer/EquipmentSlotList"] layout_mode = 2 +[node name="RightHandEquipmentRefSlot2" type="Node" parent="HBoxContainer/EquipmentSlotList/RightHandEquipment"] +script = ExtResource("11_nqptt") +inventory_path = NodePath("../../../../InventoryStacked") + [node name="EquipRightButton" type="Button" parent="HBoxContainer/EquipmentSlotList/RightHandEquipment"] layout_mode = 2 text = "->" -[node name="RightHandEquipmentSlot" type="Node" parent="HBoxContainer/EquipmentSlotList/RightHandEquipment"] -script = ExtResource("9_qoep6") -item_protoset = ExtResource("3_sqsc0") - [node name="RightHandEquipmentSlotControl" type="Control" parent="HBoxContainer/EquipmentSlotList/RightHandEquipment"] custom_minimum_size = Vector2(32, 32) layout_mode = 2 script = ExtResource("7_kcmi5") slot_style = SubResource("StyleBoxFlat_hyt2o") -item_slot_path = NodePath("../RightHandEquipmentSlot") +item_slot_path = NodePath("../RightHandEquipmentRefSlot2") default_item_icon = ExtResource("8_0yr0i") label_visible = false @@ -240,8 +240,8 @@ autowrap_mode = 3 [connection signal="button_up" from="HBoxContainer/HBoxContainer/TransferRightButton" to="." method="_on_transfer_right_button_button_up"] [connection signal="button_up" from="HBoxContainer/HBoxContainer/TransferLeftButton" to="." method="_on_transfer_left_button_button_up"] [connection signal="button_up" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/EquipLeftButton" to="." method="_on_equip_left_button_button_up"] -[connection signal="cleared" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentSlot" to="." method="_on_left_hand_equipment_slot_cleared"] -[connection signal="item_equipped" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentSlot" to="." method="_on_left_hand_equipment_slot_item_equipped"] +[connection signal="cleared" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentRefSlot" to="." method="_on_left_hand_equipment_slot_cleared"] +[connection signal="item_equipped" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentRefSlot" to="." method="_on_left_hand_equipment_slot_item_equipped"] +[connection signal="cleared" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentRefSlot2" to="." method="_on_right_hand_equipment_slot_cleared"] +[connection signal="item_equipped" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentRefSlot2" to="." method="_on_right_hand_equipment_slot_item_equipped"] [connection signal="button_up" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/EquipRightButton" to="." method="_on_equip_right_button_button_up"] -[connection signal="cleared" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentSlot" to="." method="_on_right_hand_equipment_slot_cleared"] -[connection signal="item_equipped" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentSlot" to="." method="_on_right_hand_equipment_slot_item_equipped"] diff --git a/Scripts/Helper.gd b/Scripts/Helper.gd index 02d38781..c6b2c147 100644 --- a/Scripts/Helper.gd +++ b/Scripts/Helper.gd @@ -46,6 +46,7 @@ func switch_level(level_name: String, global_pos: Vector2) -> void: save_helper.save_current_level(current_level_pos) save_helper.save_overmap_state() save_helper.save_player_inventory() + save_helper.save_player_equipment() save_helper.save_player_state(get_tree().get_first_node_in_group("Players")) current_level_pos = global_pos get_tree().change_scene_to_file("res://level_generation.tscn") diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 078b840e..47b0aa7d 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -226,6 +226,12 @@ func save_player_inventory() -> void: var save_path = current_save_folder + "/player_inventory.json" var inventory_data = JSON.stringify(General.player_inventory_dict) Helper.json_helper.write_json_file(save_path, inventory_data) + +# Function to save the player's equipment to a JSON file. +func save_player_equipment() -> void: + var save_path = current_save_folder + "/player_equipment.json" + var equipment_data = JSON.stringify(General.player_equipment_dict) + Helper.json_helper.write_json_file(save_path, equipment_data) # Function to load the player's inventory data @@ -242,6 +248,20 @@ func load_player_inventory() -> void: else: print_debug("Failed to load player inventory from: " + load_path) + # Function to load the player's inventory data +func load_player_equipment() -> void: + var load_path = current_save_folder + "/player_equipment.json" + + # Load the equipment data from the file + var loaded_equipment_data = Helper.json_helper.load_json_dictionary_file(load_path) + + if loaded_equipment_data: + # Update the General.player_inventory_dict with the loaded data + General.player_equipment_dict = loaded_equipment_data + print_debug("Player equipment loaded from: " + load_path) + else: + print_debug("Failed to load player equipment from: " + load_path) + # Function to save the player's state to a JSON file. func save_player_state(player: CharacterBody3D) -> void: if !player: diff --git a/Scripts/InventoryWindow.gd b/Scripts/InventoryWindow.gd index 3cf549a5..c3d5da1b 100644 --- a/Scripts/InventoryWindow.gd +++ b/Scripts/InventoryWindow.gd @@ -14,8 +14,8 @@ extends Control @export var containerListItem : PackedScene # Equipment -@export var LeftHandEquipmentSlot : ItemSlot -@export var RightHandEquipmentSlot : ItemSlot +@export var LeftHandEquipmentSlot : ItemRefSlot +@export var RightHandEquipmentSlot : ItemRefSlot # The tooltip will show when the player hovers over an item @export var tooltip: Control @@ -31,6 +31,10 @@ func _ready(): # The items that were in the player inventory when they exited # the previous level are loaded back into the inventory inventory.deserialize(General.player_inventory_dict) + if General.player_equipment_dict.has("LeftHandEquipmentSlot"): + LeftHandEquipmentSlot.deserialize(General.player_equipment_dict.LeftHandEquipmentSlot) + if General.player_equipment_dict.has("RightHandEquipmentSlot"): + RightHandEquipmentSlot.deserialize(General.player_equipment_dict.RightHandEquipmentSlot) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): @@ -121,10 +125,17 @@ func _on_inventory_grid_stacked_item_added(item): var original_item = item.get_meta("original_item") if original_parent and original_parent.has_method("remove_item"): original_parent.remove_item(original_item) # Remove from original parent - + func get_inventory() -> InventoryStacked: return inventory +func get_equipment_dict() -> Dictionary: + var player_equipment: Dictionary = { + "LeftHandEquipmentSlot": LeftHandEquipmentSlot.serialize(), + "RightHandEquipmentSlot": RightHandEquipmentSlot.serialize() + } + return player_equipment + # Signal handler for adding a container to the proximity func _on_item_detector_add_to_proximity_inventory(container: Node3D): add_container_to_list(container) diff --git a/Scripts/general.gd b/Scripts/general.gd index 985e5eeb..d30b1640 100644 --- a/Scripts/general.gd +++ b/Scripts/general.gd @@ -5,3 +5,5 @@ var is_allowed_to_shoot = true #This holds the inventory data of the player inventory between maps var player_inventory_dict: Dictionary +# Equipment +var player_equipment_dict : Dictionary diff --git a/Scripts/hud.gd b/Scripts/hud.gd index ff647185..04d96a60 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -199,6 +199,7 @@ func _on_shooting_ammo_changed(current_ammo: int, max_ammo: int, leftHand:bool): # We save the player inventory to a autoload singleton so we can load it on the next map func _on_overmap_change_level_pressed(): General.player_inventory_dict = inventoryWindow.get_inventory().serialize() + General.player_equipment_dict = inventoryWindow.get_equipment_dict() # The parameter container the inventory that has entered proximity func _on_item_detector_add_to_proximity_inventory(container): diff --git a/Scripts/scene_selector.gd b/Scripts/scene_selector.gd index 84828419..7015adef 100644 --- a/Scripts/scene_selector.gd +++ b/Scripts/scene_selector.gd @@ -16,6 +16,7 @@ func _on_load_game_button_pressed(): Helper.save_helper.load_game_from_folder(selected_game_folder) Helper.save_helper.load_overmap_state() Helper.save_helper.load_player_inventory() + Helper.save_helper.load_player_equipment() # We pass the name of the default map and coordinates # If there is a saved game, it will not load the provided map # but rather the one that was saved in the game that was loaded diff --git a/hud.tscn b/hud.tscn index 0504c13a..7bdde054 100644 --- a/hud.tscn +++ b/hud.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" path="res://Scripts/hud.gd" id="1_s3xoj"] [ext_resource type="Script" path="res://Scripts/NonHUDclick.gd" id="2_kpbhl"] [ext_resource type="Texture2D" uid="uid://7hppy1l45loq" path="res://Textures/bar_progress.png" id="3_83uwt"] -[ext_resource type="Resource" uid="uid://b1tngttyk4w2s" path="res://ItemProtosets.tres" id="3_jmlkb"] +[ext_resource type="Resource" uid="uid://clehtt4tyqvdy" path="res://ItemProtosets.tres" id="3_jmlkb"] [ext_resource type="Texture2D" uid="uid://dcgwgmsmi7mjn" path="res://Textures/bar_border.png" id="3_y43f5"] [ext_resource type="Texture2D" uid="uid://tdebfxkpwiva" path="res://Textures/leftarm.png" id="4_wt5t7"] [ext_resource type="Texture2D" uid="uid://8pdm2gvd1v3n" path="res://Textures/leftleg.png" id="5_si2ot"] From 44b3b72c210237d8805879d1f243b6d6b971f74f Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 27 Jan 2024 10:22:27 +0100 Subject: [PATCH 135/138] Rectangle select in all directions --- .../Mapeditor/Scripts/GridContainer.gd | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 8243aa01..2579c594 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -225,14 +225,45 @@ func _on_level_scrollbar_value_changed(value): change_level(10+0-value) #This function takes two coordinates representing a rectangle. It will check which of the TileGrid's children's position falls inside this rectangle. It returns all the child tiles that fall inside this rectangle +#func get_tiles_in_rectangle(rect_start: Vector2, rect_end: Vector2) -> Array: + #var tiles_in_rectangle: Array = [] + # + ## Normalize the rectangle coordinates + #var normalized_start = Vector2(min(rect_start.x, rect_end.x), min(rect_start.y, rect_end.y)) + #var normalized_end = Vector2(max(rect_start.x, rect_end.x), max(rect_start.y, rect_end.y)) + # + #for tile in get_children(): + #var tile_pos = tile.global_position + mapScrollWindow.global_position + #if tile_pos.x >= normalized_start.x and tile_pos.x <= normalized_end.x: + #if tile_pos.y >= normalized_start.y and tile_pos.y <= normalized_end.y: + #tiles_in_rectangle.append(tile) + #return tiles_in_rectangle + + +# This function takes two coordinates representing a rectangle and the current zoom level. +# It will check which of the TileGrid's children's positions fall inside this rectangle. +# It returns all the child tiles that fall inside this rectangle. func get_tiles_in_rectangle(rect_start: Vector2, rect_end: Vector2) -> Array: var tiles_in_rectangle: Array = [] + + # Normalize the rectangle coordinates + var normalized_start = Vector2(min(rect_start.x, rect_end.x), min(rect_start.y, rect_end.y)) + var normalized_end = Vector2(max(rect_start.x, rect_end.x), max(rect_start.y, rect_end.y)) + + # Adjust the rectangle coordinates based on the zoom level + normalized_start /= mapEditor.zoom_level + normalized_end /= mapEditor.zoom_level + for tile in get_children(): - if tile.global_position.x >= rect_start.x-(1*mapEditor.zoom_level) and tile.global_position.x <= rect_end.x: - if tile.global_position.y >= rect_start.y-(1*mapEditor.zoom_level) and tile.global_position.y <= rect_end.y: + # Calculate the position of the tile accounting for the zoom level + var tile_pos = tile.get_global_position() / mapEditor.zoom_level + # Check if the tile's position is within the normalized rectangle + if tile_pos.x >= normalized_start.x and tile_pos.x <= normalized_end.x: + if tile_pos.y >= normalized_start.y and tile_pos.y <= normalized_end.y: tiles_in_rectangle.append(tile) return tiles_in_rectangle + func unhighlight_tiles(): for tile in get_children(): tile.unhighlight() From af928c7b2788d336a684daacd669a11be92dd1dc Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 27 Jan 2024 10:23:26 +0100 Subject: [PATCH 136/138] Remove size controls from map editor --- .../ContentManager/Mapeditor/mapeditor.tscn | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 570bfe1f..833837e3 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -88,30 +88,6 @@ theme_override_icons/unchecked = ExtResource("2_bib5l") layout_mode = 2 size_flags_horizontal = 3 -[node name="mapsizelabel" type="Label" parent="HSplitContainer/MapeditorContainer/Toolbar"] -layout_mode = 2 -text = "Size: W:" - -[node name="MapWidth" type="TextEdit" parent="HSplitContainer/MapeditorContainer/Toolbar"] -clip_contents = true -custom_minimum_size = Vector2(40, 22) -layout_mode = 2 -theme_override_constants/line_spacing = 0 -theme_override_font_sizes/font_size = 16 -text = "32" - -[node name="MapHeightLabel" type="Label" parent="HSplitContainer/MapeditorContainer/Toolbar"] -layout_mode = 2 -text = "H:" - -[node name="MapHeight" type="TextEdit" parent="HSplitContainer/MapeditorContainer/Toolbar"] -clip_contents = true -custom_minimum_size = Vector2(40, 22) -layout_mode = 2 -theme_override_constants/line_spacing = 0 -theme_override_font_sizes/font_size = 16 -text = "32" - [node name="RotateRight" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 tooltip_text = "Rotate the brush to paint with rotation" From 8f18d723ce32087364d0c2eec90f0824cf71a468 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 27 Jan 2024 12:01:16 +0100 Subject: [PATCH 137/138] Add map rotation to map editor --- .../Mapeditor/Scripts/GridContainer.gd | 51 ++++++++++++++++++- .../Mapeditor/Scripts/mapeditor.gd | 4 ++ .../ContentManager/Mapeditor/mapeditor.tscn | 9 ++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 2579c594..869f5fb6 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -3,7 +3,7 @@ extends GridContainer #This is the index of the level we are on. 0 is ground level. can be -10 to +10 var currentLevel: int = 10 #Contains the data of every tile in the current level, the ground level or level 0 by default -var currentLevelData: Array[Dictionary] = [] +var currentLevelData: Array = [] @export var mapEditor: Control @export var LevelScrollBar: VScrollBar @export var levelgrid_below: GridContainer @@ -405,3 +405,52 @@ func save_miniature_map_image(): func _on_create_preview_image_button_button_up(): save_miniature_map_image() + + +# This function will loop over all levels and rotate them if they contain tile data. +func rotate_map(): + # Store the data of the current level before rotating the map + storeLevelData() + + for i in range(mapData.levels.size()): + # Load each level's data into currentLevelData + currentLevelData = mapData.levels[i] + # Rotate the current level data + rotate_level_clockwise() + # Update the rotated data back into the mapData + mapData.levels[i] = currentLevelData.duplicate() + + # After rotation, reload the current level's data + loadLevelData(currentLevel) + + +# Rotates the current level 90 degrees clockwise. +func rotate_level_clockwise(): + # Check if currentLevelData has at least one item + if !currentLevelData.size() > 0: + return + var width = mapEditor.mapWidth + var height = mapEditor.mapHeight + var new_level_data: Array[Dictionary] = [] + + # Initialize new_level_data with empty dictionaries + for i in range(width * height): + new_level_data.append({}) + + # Rotate the tile data + for x in range(width): + for y in range(height): + var old_index = y * width + x + var new_x = width - y - 1 + var new_y = x + var new_index = new_y * width + new_x + new_level_data[new_index] = currentLevelData[old_index].duplicate() + + # Add rotation to the tile's data if it has an id + if new_level_data[new_index].has("id"): + var rotation = int(new_level_data[new_index].get("rotation", 0)) + new_level_data[new_index]["rotation"] = (rotation + 90) % 360 + + # Update the current level data + currentLevelData = new_level_data + #mapData.levels[currentLevel] = currentLevelData diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd index 3e2f32d7..88895f3a 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd @@ -65,3 +65,7 @@ func _on_tile_grid_zoom_level_changed(value): #TODO: Check for unsaved changes func _on_close_button_button_up(): queue_free() + + +func _on_rotate_map_button_up(): + tileGrid.rotate_map() diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 833837e3..2eee8025 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -84,6 +84,14 @@ tooltip_text = "Creates a miniature image of the map in the /mods/core/maps fold theme_override_icons/checked = ExtResource("2_bib5l") theme_override_icons/unchecked = ExtResource("2_bib5l") +[node name="RotateMap" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +tooltip_text = "Rotate the brush to paint with rotation" +theme_override_icons/checked = ExtResource("3_8q2iq") +theme_override_icons/unchecked = ExtResource("3_8q2iq") +shortcut = SubResource("Shortcut_1tryc") +text = "0" + [node name="ZoomScroller" parent="HSplitContainer/MapeditorContainer/Toolbar" instance=ExtResource("1_0ytmu")] layout_mode = 2 size_flags_horizontal = 3 @@ -238,6 +246,7 @@ offset_bottom = 40.0 [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/CloseButton" to="." method="_on_close_button_button_up"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/SaveButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="save_map_json_file"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/CreatePreviewImageButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_create_preview_image_button_button_up"] +[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/RotateMap" to="." method="_on_rotate_map_button_up"] [connection signal="zoom_level_changed" from="HSplitContainer/MapeditorContainer/Toolbar/ZoomScroller" to="." method="_on_zoom_scroller_zoom_level_changed"] [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/RotateRight" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_rotate_right_button_up"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_draw_rectangle_toggled"] From 55f3cfd802b5639f1908e4c4e85d88482453e9eb Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 27 Jan 2024 12:19:21 +0100 Subject: [PATCH 138/138] Furniture rotates when map rotatates --- .../ContentManager/Mapeditor/Scripts/GridContainer.gd | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 869f5fb6..723e6012 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -448,9 +448,14 @@ func rotate_level_clockwise(): # Add rotation to the tile's data if it has an id if new_level_data[new_index].has("id"): - var rotation = int(new_level_data[new_index].get("rotation", 0)) - new_level_data[new_index]["rotation"] = (rotation + 90) % 360 + var tile_rotation = int(new_level_data[new_index].get("rotation", 0)) + new_level_data[new_index]["rotation"] = (tile_rotation + 90) % 360 + + # Rotate furniture if present, initializing rotation to 0 if not set + if new_level_data[new_index].has("furniture"): + var furniture_rotation = int(new_level_data[new_index].get("furniture").get("rotation", 0)) + new_level_data[new_index]["furniture"]["rotation"] = (furniture_rotation + 90) % 360 + # Update the current level data currentLevelData = new_level_data - #mapData.levels[currentLevel] = currentLevelData

|B_el6u%rjLQj`N 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 T47H$000000NkvXXu0mjfU49R_ diff --git a/Mods/Core/Tiles/grasssouthdirt.png.import b/Mods/Core/Tiles/grasssouthdirt.png.import deleted file mode 100644 index c879ac23..00000000 --- a/Mods/Core/Tiles/grasssouthdirt.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://0klc8fh8ale7" -path="res://.godot/imported/grasssouthdirt.png-5d19b1fdb64b86e2caf7af0258c63503.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/grasssouthdirt.png" -dest_files=["res://.godot/imported/grasssouthdirt.png-5d19b1fdb64b86e2caf7af0258c63503.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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/Mods/Core/Tiles/grasswestdirt.png b/Mods/Core/Tiles/grasswestdirt.png deleted file mode 100644 index 2246c80203a7c770df6650afa0b5b2c6f1b914ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35414 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 T;ax0J00000NkvXXu0mjfE`;4p diff --git a/Mods/Core/Tiles/grasswestdirt.png.import b/Mods/Core/Tiles/grasswestdirt.png.import deleted file mode 100644 index fd2a3b5f..00000000 --- a/Mods/Core/Tiles/grasswestdirt.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cd5ks4lgp524w" -path="res://.godot/imported/grasswestdirt.png-e6b019b695a27f8b98f6b51cb061918d.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Mods/Core/Tiles/grasswestdirt.png" -dest_files=["res://.godot/imported/grasswestdirt.png-e6b019b695a27f8b98f6b51cb061918d.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -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/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 From 486853d5a246d154d92285c907c1baa62b126533 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 17 Jan 2024 10:43:12 +0100 Subject: [PATCH 095/138] Add the last tiles --- Mods/Core/Tiles/Tiles.json | 255 +++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index 94d3c647..a712ea82 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -949,5 +949,260 @@ "name": "Forest underbrush", "shape": "cube", "sprite": "forestunderbrushscale5.png" + }, + { + "categories": [ + "Ground" + ], + "description": "There is just dirt here. It's color is pretty dark", + "id": "dirt_dark_00", + "name": "Dirt", + "shape": "cube", + "sprite": "dirt.png" + }, + { + "categories": [ + "Ground" + ], + "description": "There is just dirt here. It's color is pretty dark", + "id": "dirt_dark_01", + "name": "Dirt", + "shape": "cube", + "sprite": "dirt1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "There is just dirt here. It's color is pretty dark", + "id": "dirt_dark_02", + "name": "Dirt", + "shape": "cube", + "sprite": "dirt2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "There is just dirt here. It's color is light", + "id": "dirt_light_00", + "name": "Dirt", + "shape": "cube", + "sprite": "dirt3.png" + }, + { + "categories": [ + "Ground" + ], + "description": "There is just dirt here. It's color is light", + "id": "dirt_light_01", + "name": "Dirt", + "shape": "cube", + "sprite": "dirt4.png" + }, + { + "categories": [ + "Ground" + ], + "description": "There is just dirt here. It's color is light", + "id": "dirt_light_02", + "name": "Dirt", + "shape": "cube", + "sprite": "dirt5.png" + }, + { + "categories": [ + "Ground" + ], + "description": "There is dirt here. Part of it is covered with grass", + "id": "dirt_light_grass_north_00", + "name": "Dirt with grass", + "shape": "cube", + "sprite": "dirtgrass.png" + }, + { + "categories": [ + "Ground" + ], + "description": "There is dirt here. Part of it is covered with grass", + "id": "dirt_light_grass_north_01", + "name": "Dirt with grass", + "shape": "cube", + "sprite": "dirt_grass_north.png" + }, + { + "categories": [ + "Slopes" + ], + "description": "A dirt slope. You can go up and down here. Be careful not to slip", + "id": "dirt_light_ramp_00", + "name": "Dirt ramp", + "shape": "slope", + "sprite": "dirtrampnorth1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "This grass is dead and all that remains is dry straws", + "id": "grass_dead_00", + "name": "Dead grass", + "shape": "cube", + "sprite": "deadgrass.png" + }, + { + "categories": [ + "Ground" + ], + "description": "This grass is dead and all that remains is dry straws", + "id": "grass_dead_01", + "name": "Dead grass", + "shape": "cube", + "sprite": "deadgrass1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "This grass is dead and all that remains is dry straws", + "id": "grass_dead_02", + "name": "Dead grass", + "shape": "cube", + "sprite": "deadgrass2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "This grass is dead and all that remains is dry straws", + "id": "grass_dead_03", + "name": "Dead grass", + "shape": "cube", + "sprite": "deadgrassdirt.png" + }, + { + "categories": [ + "Ground" + ], + "description": "This grass is dead and all that remains is dry straws", + "id": "grass_dead_04", + "name": "Dead grass", + "shape": "cube", + "sprite": "deadgrassdirt1.png" + }, + { + "categories": [ + "Ground" + ], + "description": "This grass is dead and all that remains is dry straws", + "id": "grass_dead_05", + "name": "Dead grass", + "shape": "cube", + "sprite": "deadgrassdirt2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A tiled floor with colorful stones", + "id": "cobblestone_00", + "name": "Cobblestone", + "shape": "cube", + "sprite": "cobblestone.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A tiled floor with colorful stones", + "id": "cobblestone_01", + "name": "Cobblestone", + "shape": "cube", + "sprite": "cobblestone2.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A tiled floor with colorful stones", + "id": "cobblestone_02", + "name": "Cobblestone", + "shape": "cube", + "sprite": "cobblestone3.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A tiled floor with colorful stones", + "id": "cobblestone_03", + "name": "Cobblestone", + "shape": "cube", + "sprite": "cobblestone4.png" + }, + { + "categories": [ + "Ground" + ], + "description": "A tiled floor with brown stones laid in a beautiful pattern", + "id": "cobblestone_04", + "name": "Cobblestone", + "shape": "cube", + "sprite": "cobblestone1.png" + }, + { + "categories": [ + "Urban", + "Wall" + ], + "description": "A solid wall made out of bricks", + "id": "brick_wall_01", + "name": "Brick wall", + "shape": "cube", + "sprite": "brickroad.png" + }, + { + "categories": [ + "Urban", + "Wall" + ], + "description": "A solid wall made out of bricks", + "id": "brick_wall_02", + "name": "Brick wall", + "shape": "cube", + "sprite": "brickroad1.png" + }, + { + "categories": [ + "Urban", + "Wall" + ], + "description": "A solid wall made out of bricks", + "id": "brick_wall_03", + "name": "Brick wall", + "shape": "cube", + "sprite": "brickroad3.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A tiled floor you would find in a bathroom. The tiles are painted blue", + "id": "bathroom_tiles_blue_00", + "name": "Bathroom tiles (blue)", + "shape": "cube", + "sprite": "bathroomtiles.png" + }, + { + "categories": [ + "Floor", + "Urban" + ], + "description": "A stone floor wihere the stones are shaped like an arch. Used in an urban environement.", + "id": "arc_stones_floor_00", + "name": "Arc stones floor", + "shape": "cube", + "sprite": "arcstones1.png" } ] \ No newline at end of file From 6f9f37453ff8963bacdce4fbb511b1757d56eaab Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:12:37 +0100 Subject: [PATCH 096/138] Mob looks at target --- Mods/Core/Mobs/scrapwalker64.png | Bin 4122 -> 4399 bytes Mods/Core/Mobs/scrapwalker64.png.import | 2 +- Scripts/MobAttack.gd | 7 +++++++ Scripts/MobFollow.gd | 14 ++++++++------ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Mods/Core/Mobs/scrapwalker64.png b/Mods/Core/Mobs/scrapwalker64.png index 3867e73a52d112837b506471d4ffefffe805970c..e174107711d6247e67d0ebd424c78982d583b48c 100644 GIT binary patch delta 4144 zcmV-05YO+LAg>~jvJ^BgFflJNHy|-GIyE#pH95cZveuEtcz-fBdt#aP000luNklwLwP`M|MplMOy@~V z$0z0#?v$_N!V_D^#};`icaL|ok0R*c;JRG(o92%yC^0=(@ZEL_*KJ+z@!j5abH~u- zqjY@z(-TEskyvIBZEIR@4l{|!eR>s89i9blg1VZ=qAi5U$BuYX0+z4m%%&2Yz*EU$3t?g+*Vv9*^g!FOD2!E_m4BtG=avyr)pFSx{oI~<9Rf6TW=La-*tJpK?PLmG+g1i0zszp(N?2?FG}vPnpR{Z^)vO42J7F1T=YKT?_nXVZ?!SKWTEYvUBfjL0#EITV z$94a$71&7vtU`-4cw}^NN${gjf9UYE3TFs0q(wD9&M3Va0Z+L-7m?S%^~+(LCM@WW zKl9866*@UnA2hut=G}M7f2#u$jKm&a<{=D@c?LELRMb`k<*HFP!J?o`fUOU6{*|v* zLVvl1O@4a~sJJXbY9sVfBeh0?jSk1H9^6R-!jC<3WXDB+`PmQq>~QvP?K|yk(W!jC zSqLxi$ga6)Sq&*=I~*QHErWdjcDH!H|J+AZ#sHSr$J7#2pGRM1uQYM9!6fNTL(u2w z-&OPb+Z$El>eQ-b-M_9kHP0riUwrgFJAc;1h05Ut8$Ng#k3Br>zV{!;w}TDZAzZ3&FT5t211m~Pke$%6;g?6Eqw-CQ*2Zik>lt6EqGF=J))k$;Qu zy&5N9Y5~D5w!e+G+kJmr1#3;2cNvaugJZr0aP+2d2K*@fD8^@&Kq9tb?lG-1tBLac z_r2ZjE3YfBJC@ChQVZj?3K+g&9yH~4NL|XYBdIC73-#$T-xF_DZX)^s>s{7_kX){-VR{+@czG4x5zAFq)Zv!V`vf=`BP7Ha>Yhm z^s1qlupK=EFr>kPRA3JZS!^NZGN$Rs#FwPIa}}X`S%vYT_^&^?omQFT-=bIp-&#Oq zH@5+r=y|Y3ZfBh6)YbL$g{=>;z6H`m4~~t1RSz!2PhX70sj4+H6H+{lQ-8k>$1Py9 zTX2!+|9j6KR481U*W!UG{|9*%4Dw#zFj-(vji)f!ws+S;mL`$WfvozEm)8+~t^)pf z9L7BWj}3K|?YY#0DWn$xm58H)y$D&n0bYdjvWgnS^1;^Y?LKsTz6BE815!XIIA!DP zJJ~pMY17@N$Lf5y_a474|9|Se9I9jYZq-g*UKbYdu&-MOf2~0+Zq_Z&ok!K!7b3b- zjK!MIfKCE{c^YP(5ql)X%vkArZHBjTSv-K$JdH4%o2H})QQgUIKOEBUd-FsMwFt!V z)@FhAG?C8PEso@$HObp+?>a2ZgY^P*KpY_rn84MCjrt?lt5|noXn#E7HB|5A<=a*E zz$9ll?bHtMirzFX&hNU}c`M1r_Sj@2(Kv~~=SbbtASJn08`$|}h{>to1cjtye(_@M z|G~I!9l*IT7J+}GA@tGvQ93fSpV8cm39w?9QTsjrZ9X=PNJNmN@l+zG;vr z`GWC7FiqhMpcBTHpnq#}6i$cp8KB0Cmldd0s0CpmvJ~~o&sm=|a&zII3HL5Wy48QH zQmW3~?jiOuPY=De^nfpZWb9y%Zh`MUTQ6n`y&PX)Zr`dEx6SM%rJ*XSOjL)q*}Z6B zH0qn(NDQ<(vG1|TQ+!*Kxc6QJ1I=GH=f*p2#hK>PtmBN^fPeV9-}`_VeTI~j<|)!m zj1|jSyV~9MM(yKI-VJ|A_gYPW-IBniJw1zKjNp--LGD^K+TIGT^?@&ODDjtkML&Te zAMs!Q#CBVz24wW~g=F}c30DBgFS-6)rM9Zp4!b|8aij6+-Tv?Yd`EM_RZwdvTuvzW zmGD=W@3?@!m3gB=f2{Rs^pWR0<4m&s~_sjoxZ@=ck z72EM^kY4nJJ(Gl#Uin<@|FJSL$;L*iCO%eCr9$kn)#zl{aCs5r%UMq2)mK@u!Cebh zSwd%=iC`4oZv^30n^l73zu3P6VE46;ec*6;cDB2tIe%ea{pIgXfsb0>le1tsT(RXf zc6jix3dXOG&wkbDc^zcH7J76IlEy}RZdlh@odH7(@H|tf#6v9oWFaDfm9NN&eg4Va z?$>Xs>EuH)TmT{t_$ohcUjgL=EGG{={mU5wGFVqp#j|y(mC5?h z3{ltT4}V6CBH}Enagyz(q1mh<{I9ZXG zUi|~7pBV=)h83D0tNNc$Jz$y-I?T!Og?}MmT_6RnS7GVg27Vi8dZzdJ6;Ct8FXhcb z=Pf{jEJBh|1V!EUSJKLwvkt~MVjZtw}N7W7((_yZKq2Y8^`KgO>p-a|KZNVScBCrg8 zvt2&e-O_7*J27J)K+smSiXTMS89qs+x-JsCsT80~ZHuSLDrAPJKKG$2T5u6pTl7yp@3p?Oc+n*Q2RO6~toK-Y;V&gZ+Y0zrWnEttL9WL(BIHThF z3E0&xxbOqR7cw&_j9P=g_7?c+FW)rtOP{=J=KH(lTb~KHLmKzlp+E{E(tn90N3x25 zx(W`62EbOodsW91AX^8}}7wt^0a-1asf+%V4)`N{J7r|`1j|OK*2Cva@6^$nIN*WOZ zdlXM>t*m8oVnbhj%b-)$IwMxa0tRQ=a5oB{7|6^&fp54v-*52bZOe zr*QY~Z5t<06n`CD8eqTe7z3leRMoJST6ud z0&&ENEkPlQpLzEsCb)2hH+FC@zWV0=O1~}UR^Y?_{C~4Q|GhUaD?V|^p6@1H#}EUq z+t#>w3k2L{bO;g{*?rNGj3n(6doSd7S9f=3_ut-~i<@7!B}Xuk#AWo{u_0G`xbStJ z;8GXti|cM64Pb)BVDKt z!DPPrV@JkE%<*rBWyk>3Nqf*r(&t_89Er#O?N9y7;e8kSp~hW(GgHdP_2c%J#~(Tb zNA4aUUhJtWSY&i?@vpM`!Z)7*At4Ao5+Eb<_H$tnk&mj(Zl9TvUp*;>gnCSk?Fip<& zn|~*MCd5?`uE^vfrsob?|N{^5GGM=*0fr9=XX1PQ_|_a98@=aFja`EC*Wr~k2|E$CKJVlyCgj~0?jDc+mLC0_yEEPY u%o)M-Ireaz!gPP?>pZdbSab%szW|Ulz7g|;j^HZ*0000!ky5k{XnyZ}pTW|#>4!<1$T?p^}01ndYrciTJYW{iozECIIQW()Qdj3@RG zNnSxe@?_p~Z&s<)VQ#xB^JaeeTJ-sJioObKt;$m9P=kwH6@E_T`U%ktH%tJg! z`L)T>W7WkR<$u&i{5>6m#vY8m_w8}}z43ede!s`*N2-fK{uEos?0NKQcRzFJFxfr8 zM6P0bOmk25A-~*81NM9D-G=U7X{=I=vUBWXIws=<=x{H2C;NYGa&@ULZ{N$`ZR&d| zb}zwo>|S@DaSwrUcA&cWE-l~)(|L^Pcw>%mN4}1eM}J$#Yf~QO?(x~|n+Q5sT$g+O zq5Yc*GN$Je-)%>@ZtHrF?{@U{k{_r)J$ol!DAy}xPgpuX0bb9$;`yr|Hu1(HStiq7 z9H;y#(tUfZIPLQ7_i*Uzy77CPdnAk4M}n6eq|pO_>ZNS#B?1434}TpdFm-gFd_4x; z)pc!1IDafqd*2_$b-y~&-00fn)c2N27coV~gcwq&49lxd{jG=e^+a-LGl@BnEQ{&> zeQY7?+;Q5m8Kd94V6=(B*7LGwxRq3%zx}?3!ajMtu|ftq!i%8t z6K`bU*`+B?U_ScCH&OQ*NczVfy9;dJ?_>7<%^i?UX2PPA*9J&~4U+md)27YD&!6re zi+_QO*leEoaS#J0xKR(@^9_KK!P*}&J&=0Pqtqxj?b>+jHjT@YKqtJp!5xw9tz858Y{_Hn%2)!Y5 z?}yU&>IZV&R=f|$J2MNSX;w{;K$2cubAS7uPCwqBPB-OB)b;SQdG9JtHk00J$mA;r z&cScME^dUU_%3oLI_h}wYCRJ2W_=D7=5aNx9g?oI_fnzP)gJ|L(d&ro7fr{F5OM>b zcL463T*%pcRB8cmTO@k*8oYtWK7Fxw5$mDt-OJF%&_9b8Ui>zs4t5{6_sNIcynhd9 z!#kaCZlH>Ts!C2j&BY^<)^LwO7c}?dSv^-ry?`JabVL&y@5U}31y}9U7^gWD4Peo; zoZ=PJhmepc)SO)&`5po2j@-oQE*gZmQc;ketzPlPkyk%pv#=2Yi+PYX`{#e1Pk;HA zM=Ij8v6W*ERTGfFkRxk}{qy!tRDT$f91g`j(z?1We+pz#Bcp}pydz2cM`)fo-3Bfm z#USGjVTF&17Q~=sOUN36g(!=ssMKxJedo_oM_T;w$ffQOjMu;VtGIjwHXu6AuB$2f zqTv{8oY-;H_Ud$Vy33ysSh3f*L?&>Y2&V{S>8H~tA1s8nW!Y+*hDNH&27ljp)<^o5S(z?OrY49jOs4!~f4zo$@cZ-#N1`e4YusyUm& z!<&>!T7`^BWjq`?xDZv~C=~lx`y%1a0S%1)lnf>83q~v4}Sq~yTz+CcKyoZh?S@{hP0NfvK%`GAXq>z*G*as$e$RxRL( zXDBRV(fK8bxHqkipY=ol`ut^x%|k>K1qpS5;cnQkOhWD8;&4rUneO?`D@Vpg3ikRO zO1^2zTA9-#oq0@rAb;W7a0Vv!D~TimUq1c$>@;nWPy?wiuXzy13J1Q{yPlMHx4v&+ zh+ACWrydcPS9ND)a8HV1?9KPkUC?_=o^k4Z=8GT(!8VWNU{!%mn<>s3mJ&9bA7LXM z@rw&%;%p*i`DeZa&G72i^qR@19@3_i&6PfT#NO-Kd>~>l0Dl9jd4j5NZ@WxR@u8#- z=2=lV_&s3k<*Hi*V62WEh8*n3lcqSq9p{l_a2l&j-2K~o4zx&SPcX9Z-@5~FP_V&A zMS;oNe-w~c6g`XOZVK8~9C-QAS?=d>(w3g^AqxXHLkD-Xz<&9=C+BU=h40+^c=BV* z0hmmw(}bCO6n~XXstZu&5W;B(Nw}Jg>o}0BA)vyu*_O z^qqLI8Gk>cF}Fq>*g`LjMQ?%I=EYYEIc;pic`I% zui+1Lirycb^A5nF6NiVv?70*ARiQ8!etdPH=m{CRHDlGa&DZcl&0G=4{gzk*??YD( z5(SRCfrB{nD0}!E07jecLE5q5zvA8BD1<#LiGRb!4pZ8@FC749C}FV}^os8V@}o2< z$VEJ-l$E?=9hC1(>%!DUdLI9h_=LbK8}~k108n4aXSj7vEOYCm+<^DkM!nERObl;+g4#1>Y2`V zNg7W5^=QJfNX#|A8^pju>P*8pX-nMTNqxk0EPCP5R?^%#5vxl?VS2;Dh;g-R63q>Q z6s70T1I(8>`E6E6n6Kh%ydE2-T+}$<2-Ou^w}{Pw?7FuncJ*F(Vk4`3>wh{BF;>(& z$}dBkQO_kPi;sZKP&&cT!R5stdj{d4NP+*whwF1rlE2~0(Q1N5JSZ;zWkp54DL4po z7!;7jMA}hIc-B?O0g-;JiDBQS5xe4tY+w~*pACi%ZVhPR@5~#R>O*YxHD3g?@Ih`< z%9%4VbX$)RL&Fp`eH5AvhJOtZdMa#=Rs&FUHjo4xa5Y>_-~dp92)Mn8if2M4w}05%*tin!ROZ4|-2nh67tkyLx#fD~2^xyQwWdMs=7mm+4VeV8hin})(kB)>F-m>NeGFf^=2u?{ ziZ5H^w>M_v*Yn26m#}uSHcb3jBbLRLN6pab>$;~Vv&%W7+X&UkA8I| z%b40#)16m4I10#*z4O;r-lEoLct?2Ski8b`?f%rG$sEGCJAW7omfCWGwh{9Yz$~d! zTW{{jCl1L1V~i4eZ-Booy5rAl##=UVVwA+WdTwo8Z<+!>FZ!GS7ZW61dy%(y>E?}4 zFCqym`fxB7Xi@Hsa|oo@hfVy8ufD#xyW{r9U*9r=6Qd-aC5IUI`WQmCnK=qy9ARfb z)u;ojDHrXB-uV8I9JDY9Y1@H9?$;cC-0nZUdR7_6PVk$6FN@pkpw4iD&xA3 zYZa!t4}ewEg{r8Goc+OH=)z=?Ccp%My;2)e+}^jhcRz8g&!7F`{F?vwDD=C#N2g2v z!Yn_w`X=ikhGp*D?Dpo-*QGi463pH|Ga!loY=hY~7ce-H9(;G5vUVlOI{X9DDgJPA<8L(Wfp( z30579%Nn}`xA{|9z!*)4?x9V>y#&YV3DCQ}bN$DUY}(Z~N0)MRo1E6bUR>Alo70%S aC+2_gP|roK`sJqp0000 void: nav_agent.target_position = target_location From d5d2435c1d5a5bab4db4ec3ad58a83d6d9829d57 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 17 Jan 2024 15:17:29 +0100 Subject: [PATCH 097/138] Mobs spawn with stats --- Defaults/Mobs/mob.tscn | 26 ++------ LevelGenerator.gd | 5 +- Mods/Core/Mobs/Mobs.json | 2 +- .../Custom_Editors/Scripts/MobEditor.gd | 4 +- Scripts/Detection.gd | 8 +-- Scripts/Mob.gd | 66 ++++++++++++++++--- Scripts/MobAttack.gd | 9 ++- Scripts/MobFollow.gd | 5 +- Scripts/MobIdle.gd | 19 +++--- 9 files changed, 87 insertions(+), 57 deletions(-) diff --git a/Defaults/Mobs/mob.tscn b/Defaults/Mobs/mob.tscn index 4a454268..96ca93a0 100644 --- a/Defaults/Mobs/mob.tscn +++ b/Defaults/Mobs/mob.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3 uid="uid://b2r6nh12wv41k"] +[gd_scene load_steps=14 format=3 uid="uid://b2r6nh12wv41k"] [ext_resource type="Script" path="res://Scripts/Mob.gd" id="1_ajqy0"] [ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/mob_corpse.tscn" id="2_eldwl"] @@ -6,7 +6,6 @@ [ext_resource type="Script" path="res://Scripts/MobAttack.gd" id="4_fqxd2"] [ext_resource type="Script" path="res://Scripts/MobIdle.gd" id="5_qf6ud"] [ext_resource type="Script" path="res://Scripts/MobFollow.gd" id="6_va33k"] -[ext_resource type="Script" path="res://Scripts/MobStats.gd" id="7_a31ax"] [ext_resource type="Script" path="res://Scripts/Detection.gd" id="8_ugi6q"] [ext_resource type="Texture2D" uid="uid://cy56wx4qynp3m" path="res://Textures/enemy.png" id="9_vd6sy"] [ext_resource type="Shader" path="res://transparent_lighting.gdshader" id="10_qbt4f"] @@ -36,7 +35,6 @@ collision_mask = 3 wall_min_slide_angle = 0.0 floor_constant_speed = true script = ExtResource("1_ajqy0") -stats = NodePath("MobStats") corpse_scene = ExtResource("2_eldwl") [node name="NavigationAgent3D" type="NavigationAgent3D" parent="."] @@ -50,18 +48,16 @@ debug_enabled = true script = ExtResource("3_qfjv5") initial_state = NodePath("MobIdle") -[node name="MobAttack" type="Node3D" parent="StateMachine" node_paths=PackedStringArray("attack_timer")] +[node name="MobAttack" type="Node3D" parent="StateMachine" node_paths=PackedStringArray("attack_timer", "mob")] script = ExtResource("4_fqxd2") -stats = NodePath("../../MobStats") attack_timer = NodePath("AttackCooldown") mob = NodePath("../..") [node name="AttackCooldown" type="Timer" parent="StateMachine/MobAttack"] -[node name="MobIdle" type="Node3D" parent="StateMachine" node_paths=PackedStringArray("nav_agent", "moving_timer")] +[node name="MobIdle" type="Node3D" parent="StateMachine" node_paths=PackedStringArray("nav_agent", "mob", "moving_timer")] script = ExtResource("5_qf6ud") nav_agent = NodePath("../../NavigationAgent3D") -stats = NodePath("../../MobStats") mob = NodePath("../..") move_distance = 50.0 moving_timer = NodePath("MovingCooldown") @@ -74,27 +70,15 @@ script = ExtResource("6_va33k") nav_agent = NodePath("../../NavigationAgent3D") mob = NodePath("../..") mobCol = NodePath("../../CollisionShape3D") -stats = NodePath("../../MobStats") pathfinding_timer = NodePath("Timer") [node name="Timer" type="Timer" parent="StateMachine/MobFollow"] wait_time = 0.2 autostart = true -[node name="MobStats" type="Node" parent="."] -script = ExtResource("7_a31ax") -melee_damage = 20.0 -melee_range = 1.5 -health = 100.0 -moveSpeed = 1.0 -idle_move_speed = 0.5 -sightRange = 200.0 -senseRange = 50.0 -hearingRange = 1000.0 - -[node name="Detection" type="Node3D" parent="."] +[node name="Detection" type="Node3D" parent="." node_paths=PackedStringArray("mob")] script = ExtResource("8_ugi6q") -stats = NodePath("../MobStats") +mob = NodePath("..") [node name="Sprite3D" type="Sprite3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0275174, 0) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 2f3a7965..a2c06299 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -104,12 +104,11 @@ func generate_mobs() -> void: func add_mob_to_map(mob: Dictionary) -> void: var newMob: CharacterBody3D = defaultMob.instantiate() newMob.add_to_group("mobs") - newMob.set_sprite(Gamedata.get_sprite_by_id(Gamedata.data.mobs,mob.id)) get_tree().get_root().add_child(newMob) newMob.global_position.x = mob.global_position_x newMob.global_position.y = mob.global_position_y newMob.global_position.z = mob.global_position_z - newMob.id = mob.id + newMob.apply_stats_from_json(Gamedata.get_data_by_id(Gamedata.data.mobs,mob.id)) func generate_items() -> void: if map_save_folder == "": @@ -219,11 +218,11 @@ func add_block_mob(tileJSON: Dictionary, block: StaticBody3D): if tileJSON.has("mob"): var newMob: CharacterBody3D = defaultMob.instantiate() newMob.add_to_group("mobs") - newMob.set_sprite(Gamedata.get_sprite_by_id(Gamedata.data.mobs,tileJSON.mob)) get_tree().get_root().add_child(newMob) newMob.global_position.x = block.global_position.x newMob.global_position.y = block.global_position.y+0.5 newMob.global_position.z = block.global_position.z + newMob.apply_stats_from_json(Gamedata.get_data_by_id(Gamedata.data.mobs,tileJSON.mob)) # This function takes a tile id and creates a new instance of either a block diff --git a/Mods/Core/Mobs/Mobs.json b/Mods/Core/Mobs/Mobs.json index a58432a5..888f2a1f 100644 --- a/Mods/Core/Mobs/Mobs.json +++ b/Mods/Core/Mobs/Mobs.json @@ -6,7 +6,7 @@ "id": "scrapwalker", "idle_move_speed": "0.5", "melee_damage": "20", - "melee_range": "20", + "melee_range": "1.5", "move_speed": "1", "name": "Scrap walker", "sense_range": "50", diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd index 9ec8d34d..9c8232a1 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/MobEditor.gd @@ -47,7 +47,7 @@ func load_mob_data() -> void: if melee_damage_numedit != null and contentData.has("melee_damage"): melee_damage_numedit.get_line_edit().text = contentData["melee_damage"] if melee_range_numedit != null and contentData.has("melee_range"): - melee_damage_numedit.get_line_edit().text = contentData["melee_range"] + melee_range_numedit.get_line_edit().text = contentData["melee_range"] if health_numedit != null and contentData.has("health"): health_numedit.get_line_edit().text = contentData["health"] if moveSpeed_numedit != null and contentData.has("move_speed"): @@ -76,7 +76,7 @@ func _on_save_button_button_up() -> void: contentData["name"] = NameTextEdit.text contentData["description"] = DescriptionTextEdit.text contentData["melee_damage"] = melee_damage_numedit.get_line_edit().text - contentData["melee_range"] = melee_damage_numedit.get_line_edit().text + contentData["melee_range"] = melee_range_numedit.get_line_edit().text contentData["health"] = health_numedit.get_line_edit().text contentData["move_speed"] = moveSpeed_numedit.get_line_edit().text contentData["idle_move_speed"] = idle_move_speed_numedit.get_line_edit().text diff --git a/Scripts/Detection.gd b/Scripts/Detection.gd index 4098095b..132733a4 100644 --- a/Scripts/Detection.gd +++ b/Scripts/Detection.gd @@ -1,7 +1,7 @@ extends Node3D @export var playerCol: Node3D -@export var stats: NodePath +@export var mob: CharacterBody3D signal player_spotted @@ -13,9 +13,9 @@ var melee_range # Called when the node enters the scene tree for the first time. func _ready(): - sightRange = get_node(stats).sightRange - senseRange = get_node(stats).senseRange - hearingRange = get_node(stats).hearingRange + sightRange = mob.sightRange + senseRange = mob.senseRange + hearingRange = mob.hearingRange # Called every frame. 'delta' is the elapsed time since the previous frame. diff --git a/Scripts/Mob.gd b/Scripts/Mob.gd index 601666c4..df93409c 100644 --- a/Scripts/Mob.gd +++ b/Scripts/Mob.gd @@ -7,16 +7,31 @@ var original_scale # and some dynamic json like the mob health and buffs and debuffs var id: String -@export var stats: NodePath -@export var corpse_scene: PackedScene +var melee_damage: float = 20.0 +var melee_range: float = 1.5 +var health: float = 100.0 +var current_health: float +var moveSpeed: float = 1.0 +var current_move_speed: float +var idle_move_speed: float = 0.5 +var current_idle_move_speed: float +var sightRange: float = 200.0 +var senseRange: float = 50.0 +var hearingRange: float = 1000.0 +@export var corpse_scene: PackedScene @onready var nav_agent := $NavigationAgent3D as NavigationAgent3D - +# +#func _ready(): + #pass + ##3d +## original_scale = get_node(sprite).scale +# Called when the node enters the scene tree for the first time. func _ready(): - pass - #3d -# original_scale = get_node(sprite).scale + current_health = health + current_move_speed = moveSpeed + current_idle_move_speed = idle_move_speed func _get_hit(damage): @@ -25,8 +40,8 @@ func _get_hit(damage): # tween.tween_property(get_node(sprite), "scale", get_node(sprite).scale * 1.35, 0.1) # tween.tween_property(get_node(sprite), "scale", original_scale, 0.1) - get_node(stats).current_health -= damage - if get_node(stats).current_health <= 0: + current_health -= damage + if current_health <= 0: _die() func _die(): @@ -44,3 +59,38 @@ func set_sprite(newSprite: Resource): material.albedo_texture = newSprite # Set the texture of the material material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA $MeshInstance3D.mesh.surface_set_material(0, material) + +# Applies it's own data from the dictionary it received +# If it is created as a new mob, it will spawn with the default stats +# If it is created from a saved game, it might have lower health for example +func apply_stats_from_json(json_data: Dictionary) -> void: + id = json_data.id + set_sprite(Gamedata.get_sprite_by_id(Gamedata.data.mobs,json_data.id)) + if json_data.has("melee_damage"): + melee_damage = float(json_data["melee_damage"]) + if json_data.has("melee_range"): + melee_range = float(json_data["melee_range"]) + if json_data.has("health"): + health = float(json_data["health"]) + if json_data.has("current_health"): + current_health = float(json_data["current_health"]) + else: # Reset current health to max health + current_health = health + if json_data.has("move_speed"): + moveSpeed = float(json_data["move_speed"]) + if json_data.has("current_move_speed"): + current_move_speed = float(json_data["current_move_speed"]) + else: # Reset current moveSpeed to max moveSpeed + current_move_speed = moveSpeed + if json_data.has("idle_move_speed"): + idle_move_speed = float(json_data["idle_move_speed"]) + if json_data.has("current_idle_move_speed"): + current_idle_move_speed = float(json_data["current_idle_move_speed"]) + else: # Reset current idle_move_speed to max idle_move_speed + current_idle_move_speed = idle_move_speed + if json_data.has("sight_range"): + sightRange = float(json_data["sight_range"]) + if json_data.has("sense_range"): + senseRange = float(json_data["sense_range"]) + if json_data.has("hearing_range"): + hearingRange = float(json_data["hearing_range"]) diff --git a/Scripts/MobAttack.gd b/Scripts/MobAttack.gd index 0f914616..07afbaf3 100644 --- a/Scripts/MobAttack.gd +++ b/Scripts/MobAttack.gd @@ -1,9 +1,8 @@ extends State class_name MobAttack -@export var stats: NodePath @export var attack_timer: Timer -@export var mob: NodePath +@export var mob: CharacterBody3D @export var mob_sprite: NodePath var tween: Tween @@ -31,13 +30,13 @@ func Physics_Update(_delta: float): var space_state = get_world_3d().direct_space_state # TO-DO Change playerCol to group of players - var query = PhysicsRayQueryParameters3D.create(get_node(mob).global_position, targeted_player.global_position, int(pow(2, 1-1) + pow(2, 3-1)), [self]) + var query = PhysicsRayQueryParameters3D.create(mob.global_position, targeted_player.global_position, int(pow(2, 1-1) + pow(2, 3-1)), [self]) var result = space_state.intersect_ray(query) if result: - if result.collider.is_in_group("Players") && Vector3(get_node(mob).global_position).distance_to(targeted_player.global_position) <= get_node(stats).melee_range: + if result.collider.is_in_group("Players") && Vector3(mob.global_position).distance_to(targeted_player.global_position) <= mob.melee_range: if !is_in_attack_mode: is_in_attack_mode = true @@ -68,7 +67,7 @@ func attack(): # tween.tween_property(get_node(mob_sprite), "position", Vector2(0,0), 0.1 ) if targeted_player.has_method("_get_hit"): - targeted_player._get_hit(get_node(stats).melee_damage) + targeted_player._get_hit(mob.melee_damage) func stop_attacking(): diff --git a/Scripts/MobFollow.gd b/Scripts/MobFollow.gd index 4d3f5eb9..06f28225 100644 --- a/Scripts/MobFollow.gd +++ b/Scripts/MobFollow.gd @@ -6,7 +6,6 @@ class_name MobFollow @export var nav_agent: NavigationAgent3D @export var mob: CharacterBody3D @export var mobCol: NodePath -@export var stats: NodePath @export var pathfinding_timer: Timer var targeted_player @@ -24,7 +23,7 @@ func Exit(): func Physics_Update(_delta: float): var dir = mob.to_local(nav_agent.get_next_path_position()).normalized() - mob.velocity = dir * get_node(stats).current_move_speed + mob.velocity = dir * mob.current_move_speed mob.move_and_slide() # Rotation towards target using look_at @@ -43,7 +42,7 @@ func Physics_Update(_delta: float): if result: - if result.collider.is_in_group("Players")&& Vector3(get_node(mobCol).global_position).distance_to(targeted_player.global_position) <= get_node(stats).melee_range / 2: + if result.collider.is_in_group("Players")&& Vector3(get_node(mobCol).global_position).distance_to(targeted_player.global_position) <= mob.melee_range / 2: print("changing state to mobattack...") Transistioned.emit(self, "mobattack") diff --git a/Scripts/MobIdle.gd b/Scripts/MobIdle.gd index dc1be9ad..a994fc8f 100644 --- a/Scripts/MobIdle.gd +++ b/Scripts/MobIdle.gd @@ -4,8 +4,7 @@ class_name MobIdle var idle_speed @export var nav_agent: NavigationAgent3D -@export var stats: NodePath -@export var mob: NodePath +@export var mob: CharacterBody3D @export var move_distance: float @export var moving_timer: Timer @@ -20,7 +19,7 @@ var rng = RandomNumberGenerator.new() func Enter(): print("Mob idle") - idle_speed = get_node(stats).idle_move_speed + idle_speed = mob.idle_move_speed moving_timer.start() func Exit(): @@ -28,12 +27,12 @@ func Exit(): func Physics_Update(_delta: float): if is_looking_to_move: - var dir = get_node(mob).to_local(nav_agent.get_next_path_position()).normalized() - get_node(mob).velocity = dir * get_node(stats).current_idle_move_speed - get_node(mob).move_and_slide() + var dir = mob.to_local(nav_agent.get_next_path_position()).normalized() + mob.velocity = dir * mob.current_idle_move_speed + mob.move_and_slide() - if Vector3(get_node(mob).global_position).distance_to(target_location) <= 0.5: + if Vector3(mob.global_position).distance_to(target_location) <= 0.5: is_looking_to_move = false @@ -49,12 +48,12 @@ func makepath() -> void: func _on_moving_cooldown_timeout(): var space_state = get_world_3d().direct_space_state - var random_dir = Vector3(rng.randf_range(-1,1), get_node(mob).global_position.y, rng.randf_range(-1, 1)) - var query = PhysicsRayQueryParameters3D.create(get_node(mob).global_position, get_node(mob).global_position + (random_dir * move_distance), int(pow(2, 1-1) + pow(2, 3-1)),[self]) + var random_dir = Vector3(rng.randf_range(-1,1), mob.global_position.y, rng.randf_range(-1, 1)) + var query = PhysicsRayQueryParameters3D.create(mob.global_position, mob.global_position + (random_dir * move_distance), int(pow(2, 1-1) + pow(2, 3-1)),[self]) var result = space_state.intersect_ray(query) if !result: is_looking_to_move = true - target_location = get_node(mob).global_position + (random_dir * move_distance) + target_location = mob.global_position + (random_dir * move_distance) makepath() From 637e503987165c8337284bc21bd160cf6869d694 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 17 Jan 2024 16:07:12 +0100 Subject: [PATCH 098/138] Save load mobs, add rust sentinel --- LevelGenerator.gd | 2 +- Mods/Core/Maps/Generichouse.json | 1 + Mods/Core/Mobs/Mobs.json | 18 ++++++++-- Mods/Core/Mobs/rust_sentinel_72.png | Bin 0 -> 6031 bytes Mods/Core/Mobs/rust_sentinel_72.png.import | 34 ++++++++++++++++++ .../Custom_Editors/MobEditor.tscn | 5 ++- Scripts/Helper/save_helper.gd | 29 +++++++++------ 7 files changed, 75 insertions(+), 14 deletions(-) create mode 100644 Mods/Core/Mobs/rust_sentinel_72.png create mode 100644 Mods/Core/Mobs/rust_sentinel_72.png.import diff --git a/LevelGenerator.gd b/LevelGenerator.gd index a2c06299..2410a02e 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -108,7 +108,7 @@ func add_mob_to_map(mob: Dictionary) -> void: newMob.global_position.x = mob.global_position_x newMob.global_position.y = mob.global_position_y newMob.global_position.z = mob.global_position_z - newMob.apply_stats_from_json(Gamedata.get_data_by_id(Gamedata.data.mobs,mob.id)) + newMob.apply_stats_from_json(mob) func generate_items() -> void: if map_save_folder == "": diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index 79dfd557..b68b1a8a 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -4638,6 +4638,7 @@ }, { "id": "grass_plain_01", + "mob": "rust_sentinel", "rotation": 0 }, { diff --git a/Mods/Core/Mobs/Mobs.json b/Mods/Core/Mobs/Mobs.json index 888f2a1f..c7603af9 100644 --- a/Mods/Core/Mobs/Mobs.json +++ b/Mods/Core/Mobs/Mobs.json @@ -1,16 +1,30 @@ [ { "description": "A small robot", - "health": "100", + "health": "80", "hearing_range": "1000", "id": "scrapwalker", "idle_move_speed": "0.5", "melee_damage": "20", "melee_range": "1.5", - "move_speed": "1", + "move_speed": "1.1", "name": "Scrap walker", "sense_range": "50", "sight_range": "200", "sprite": "scrapwalker64.png" + }, + { + "description": "A slightly more advanced robot but still considered a weaker enemy in the robot faction. The Rust Sentinel stands tall and imposing, with a sturdy build. Its design incorporates rusted and recycled metal parts, giving it a rugged, battle-worn appearance.\n\nThe Rust Sentinel features a broad, slightly dome-shaped head with glowing red eyes that serve as visual sensors. Its torso is bulkier, reinforced with scrap metal plates, and it has two powerful arms ending in claws. The legs are designed for stability and power rather than speed. Its color scheme is a mix of rusted orange, steel gray, and hints of worn-out blue paint, suggesting it was once part of a larger machinery or vehicle.\n\nThe Rust Sentinel moves with deliberate, heavy steps, making it slower but more resilient. It's equipped with basic tools and weaponry, which it uses to scavenges and patrol.", + "health": "120", + "hearing_range": "1000", + "id": "rust_sentinel", + "idle_move_speed": "0.4", + "melee_damage": "20", + "melee_range": "1.5", + "move_speed": "0.8", + "name": "Rust sentinel", + "sense_range": "50", + "sight_range": "200", + "sprite": "rust_sentinel_72.png" } ] \ No newline at end of file diff --git a/Mods/Core/Mobs/rust_sentinel_72.png b/Mods/Core/Mobs/rust_sentinel_72.png new file mode 100644 index 0000000000000000000000000000000000000000..52b4c2f14d3b588e3c7b3dfaa547bb58dc6d7b4c GIT binary patch literal 6031 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 literal 0 HcmV?d00001 diff --git a/Mods/Core/Mobs/rust_sentinel_72.png.import b/Mods/Core/Mobs/rust_sentinel_72.png.import new file mode 100644 index 00000000..6a42ded9 --- /dev/null +++ b/Mods/Core/Mobs/rust_sentinel_72.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b51nqjd3iawap" +path="res://.godot/imported/rust_sentinel_72.png-1dc7caa0dc4fb18d9b1b07a0de34b249.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Mobs/rust_sentinel_72.png" +dest_files=["res://.godot/imported/rust_sentinel_72.png-1dc7caa0dc4fb18d9b1b07a0de34b249.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Scenes/ContentManager/Custom_Editors/MobEditor.tscn b/Scenes/ContentManager/Custom_Editors/MobEditor.tscn index c3e8d524..7885b457 100644 --- a/Scenes/ContentManager/Custom_Editors/MobEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/MobEditor.tscn @@ -108,6 +108,7 @@ size_flags_stretch_ratio = 0.9 focus_next = NodePath("../HealthSpinBox") focus_previous = NodePath("../NameTextEdit") placeholder_text = "A very dangerous land animal often found in dry climates" +wrap_mode = 1 [node name="HealthLabel" type="Label" parent="VBoxContainer/FormGrid"] layout_mode = 2 @@ -115,6 +116,7 @@ text = "Health" [node name="HealthSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] layout_mode = 2 +max_value = 1000.0 value = 100.0 [node name="MeleeDamageLabel" type="Label" parent="VBoxContainer/FormGrid"] @@ -142,6 +144,7 @@ text = "Move speed" [node name="MoveSpeedSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] layout_mode = 2 tooltip_text = "The speed at which it moves" +step = 0.1 value = 1.0 [node name="IdleMoveSpeedLabel" type="Label" parent="VBoxContainer/FormGrid"] @@ -151,7 +154,7 @@ text = "Idle move speed" [node name="IdleMoveSpeedSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] layout_mode = 2 tooltip_text = "The speed at which it moves when idle" -step = 0.5 +step = 0.1 value = 0.5 [node name="SightRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index e3af9d1a..a399ea31 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -37,24 +37,33 @@ func create_new_save(): else: print_debug("Failed to create a unique folder for the demo.") -#Save the type and position of all mobs on the map +# Save all the mobs and their current stats to the mobs file for this map func save_mob_data(target_folder: String) -> void: var mobData: Array = [] - var defaultMob: Dictionary = {"id": "scrapwalker", \ - "global_position_x": 0, "global_position_y": 0, "global_position_z": 0} var mapMobs = get_tree().get_nodes_in_group("mobs") var newMobData: Dictionary for mob in mapMobs: mob.remove_from_group("mobs") - newMobData = defaultMob.duplicate() - newMobData["global_position_x"] = mob.global_position.x - newMobData["global_position_y"] = mob.global_position.y - newMobData["global_position_z"] = mob.global_position.z - newMobData["id"] = mob.id + newMobData = { + "id": mob.id, + "global_position_x": mob.global_position.x, + "global_position_y": mob.global_position.y, + "global_position_z": mob.global_position.z, + "melee_damage": mob.melee_damage, + "melee_range": mob.melee_range, + "health": mob.health, + "current_health": mob.current_health, + "move_speed": mob.moveSpeed, + "current_move_speed": mob.current_move_speed, + "idle_move_speed": mob.idle_move_speed, + "current_idle_move_speed": mob.current_idle_move_speed, + "sight_range": mob.sightRange, + "sense_range": mob.senseRange, + "hearing_range": mob.hearingRange + } mobData.append(newMobData.duplicate()) mob.queue_free() - Helper.json_helper.write_json_file(target_folder + "/mobs.json",\ - JSON.stringify(mobData)) + Helper.json_helper.write_json_file(target_folder + "/mobs.json", JSON.stringify(mobData)) #Save the type and position of all mobs on the map func save_item_data(target_folder: String) -> void: From 4b12ee856aba5af87833aa4ab7db8b442d914c19 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 17 Jan 2024 18:51:05 +0100 Subject: [PATCH 099/138] Mobs get unique meshes --- Mods/Core/Maps/Generichouse.json | 6 +++--- Scripts/Mob.gd | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index b68b1a8a..9b2a8f82 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -4638,7 +4638,6 @@ }, { "id": "grass_plain_01", - "mob": "rust_sentinel", "rotation": 0 }, { @@ -6137,7 +6136,6 @@ }, { "id": "grass_plain_01", - "mob": "scrapwalker", "rotation": 0 }, { @@ -6267,7 +6265,6 @@ }, { "id": "grass_plain_01", - "mob": "scrapwalker", "rotation": 0 }, { @@ -7173,6 +7170,7 @@ }, { "id": "grass_plain_01", + "mob": "scrapwalker", "rotation": 0 }, { @@ -7553,6 +7551,7 @@ }, { "id": "grass_plain_01", + "mob": "scrapwalker", "rotation": 0 }, { @@ -7781,6 +7780,7 @@ }, { "id": "grass_plain_01", + "mob": "rust_sentinel", "rotation": 0 }, { diff --git a/Scripts/Mob.gd b/Scripts/Mob.gd index df93409c..10faea40 100644 --- a/Scripts/Mob.gd +++ b/Scripts/Mob.gd @@ -53,12 +53,21 @@ func add_corpse(pos: Vector3): get_tree().get_root().add_child(corpse) corpse.global_position = pos corpse.add_to_group("mapitems") - + +# Sets the sprite to the mob +# TODO: In order to optimize this, instead of calling original_mesh.duplicate() +# We should keep track of every unique mesh (one for each type of mob) +# THen we check if there has already been a mesh created for a mob with this +# id and assign that mesh. Right now every mob has it's own unique mesh func set_sprite(newSprite: Resource): - var material := StandardMaterial3D.new() - material.albedo_texture = newSprite # Set the texture of the material + var original_mesh = $MeshInstance3D.mesh + var new_mesh = original_mesh.duplicate() # Clone the mesh + var material := StandardMaterial3D.new() + material.albedo_texture = newSprite material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA - $MeshInstance3D.mesh.surface_set_material(0, material) + new_mesh.surface_set_material(0, material) + $MeshInstance3D.mesh = new_mesh # Set the new mesh to MeshInstance3D + # Applies it's own data from the dictionary it received # If it is created as a new mob, it will spawn with the default stats From ff7eea040e9f6cc57207b28db32992c3a40b3e8d Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 18 Jan 2024 16:10:57 +0100 Subject: [PATCH 100/138] Furniture above player invisible, fix bug --- LevelManager.gd | 29 ++++++++++++++++++++--------- Scripts/player.gd | 8 +++++--- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/LevelManager.gd b/LevelManager.gd index f8a298c4..056f8375 100644 --- a/LevelManager.gd +++ b/LevelManager.gd @@ -1,15 +1,26 @@ extends Node3D - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass - + # Initialize with a value that's unlikely to be a valid Y-level +var last_player_y_level: float = -1 # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): + var player = get_tree().get_first_node_in_group("Players") + if player: + var current_player_y = player.global_position.y + + # Check if the player's Y-level has changed + if current_player_y != last_player_y_level: + update_visibility(current_player_y) + last_player_y_level = current_player_y + +func update_visibility(player_y: float): + # Update level visibility for level in get_children(): - if level.global_position.y > get_tree().get_first_node_in_group("Players").global_position.y: - level.visible = false - else: - level.visible = true + var is_above_player = level.global_position.y > player_y + level.visible = not is_above_player + + # Update furniture visibility + for furniture in get_tree().get_nodes_in_group("furniture"): + var is_above_player = furniture.global_position.y > player_y + furniture.visible = not is_above_player diff --git a/Scripts/player.gd b/Scripts/player.gd index 4210c88c..c7726f1b 100644 --- a/Scripts/player.gd +++ b/Scripts/player.gd @@ -133,9 +133,11 @@ func _input(event): print("Interact button pressed") if result: print("Found object") - if result.collider.get_owner().has_method("interact"): - print("collider has method") - result.collider.get_owner().interact() + var myOwner = result.collider.get_owner() + if myOwner: + if myOwner.has_method("interact"): + print("collider has method") + myOwner.interact() func _get_hit(damage: float): From a77e99151e177fec377cb21d145d5e7b77f60855 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 18 Jan 2024 17:00:53 +0100 Subject: [PATCH 101/138] Add static furniture node and load and save --- Defaults/Furniture/FurnitureStatic.tscn | 19 ++++++++++++++++ LevelGenerator.gd | 13 +++++++++-- LevelManager.gd | 2 +- Scripts/FurniturePhysics.gd | 11 ++-------- Scripts/FurnitureStatic.gd | 29 +++++++++++++++++++++++++ Scripts/Helper/save_helper.gd | 2 ++ level_generation.tscn | 4 +++- 7 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 Defaults/Furniture/FurnitureStatic.tscn create mode 100644 Scripts/FurnitureStatic.gd diff --git a/Defaults/Furniture/FurnitureStatic.tscn b/Defaults/Furniture/FurnitureStatic.tscn new file mode 100644 index 00000000..1b21a4ef --- /dev/null +++ b/Defaults/Furniture/FurnitureStatic.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=5 format=3 uid="uid://cm4n8cljiij4w"] + +[ext_resource type="Script" path="res://Scripts/FurnitureStatic.gd" id="1_wituf"] +[ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/mob_corpse.tscn" id="2_ln6uk"] +[ext_resource type="Texture2D" uid="uid://cqfqxgp12asw1" path="res://Mods/Core/Furniture/table_64.png" id="2_nt0ji"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_xaq3g"] +radius = 0.2 + +[node name="FurnitureStatic" type="StaticBody3D"] +script = ExtResource("1_wituf") +corpse_scene = ExtResource("2_ln6uk") + +[node name="Sprite3D" type="Sprite3D" parent="."] +billboard = 1 +texture = ExtResource("2_nt0ji") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_xaq3g") diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 2410a02e..ab14275b 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -14,6 +14,7 @@ var level_height : int = 32 @export var defaultMob: PackedScene @export var defaultItem: PackedScene @export var defaultFurniturePhysics: PackedScene +@export var defaultFurnitureStatic: PackedScene @export var level_manager : Node3D @export_file var default_level_json @@ -134,7 +135,11 @@ func generate_furniture() -> void: add_furniture_to_map.call_deferred(furnitureData) func add_furniture_to_map(furnitureData: Dictionary) -> void: - var newFurniture: Node3D = defaultFurniturePhysics.instantiate() + var newFurniture: Node3D + if furnitureData.has("moveable") and furnitureData.moveable: + newFurniture = defaultFurniturePhysics.instantiate() + else: + newFurniture = defaultFurnitureStatic.instantiate() newFurniture.add_to_group("furniture") newFurniture.set_sprite(Gamedata.get_sprite_by_id(Gamedata.data.furniture, furnitureData.id)) get_tree().get_root().add_child(newFurniture) @@ -188,7 +193,11 @@ func generate_saved_level(tacticalMapJSON: Dictionary) -> void: func add_furniture_to_block(tileJSON: Dictionary, block: StaticBody3D): if tileJSON.has("furniture"): - var newFurniture: Node3D = defaultFurniturePhysics.instantiate() + var newFurniture: Node3D + if tileJSON.has("moveable") and tileJSON.moveable: + newFurniture = defaultFurniturePhysics.instantiate() + else: + newFurniture = defaultFurnitureStatic.instantiate() newFurniture.add_to_group("furniture") newFurniture.set_sprite(Gamedata.get_sprite_by_id(\ Gamedata.data.furniture, tileJSON.furniture)) diff --git a/LevelManager.gd b/LevelManager.gd index 056f8375..11e6d7f1 100644 --- a/LevelManager.gd +++ b/LevelManager.gd @@ -1,6 +1,6 @@ extends Node3D - # Initialize with a value that's unlikely to be a valid Y-level + # Initialize with a value that's unlikely to be a valid starting Y-level var last_player_y_level: float = -1 # Called every frame. 'delta' is the elapsed time since the previous frame. diff --git a/Scripts/FurniturePhysics.gd b/Scripts/FurniturePhysics.gd index 6b47a65b..4f72b0fe 100644 --- a/Scripts/FurniturePhysics.gd +++ b/Scripts/FurniturePhysics.gd @@ -1,20 +1,13 @@ extends RigidBody3D -var tween: Tween -var original_scale -# id for the mob json. this will be used to load the data when creating a mob +# id for the furniture json. this will be used to load the data when creating a furniture # when saving a mob in between levels, we will use some static json defined by this id -# and some dynamic json like the mob health and buffs and debuffs +# and some dynamic json like the furniture health var id: String @export var corpse_scene: PackedScene var current_health: float = 10.0 -func _ready(): - pass - #3d -# original_scale = get_node(sprite).scale - func _get_hit(damage): #3d diff --git a/Scripts/FurnitureStatic.gd b/Scripts/FurnitureStatic.gd new file mode 100644 index 00000000..c3afc197 --- /dev/null +++ b/Scripts/FurnitureStatic.gd @@ -0,0 +1,29 @@ +extends StaticBody3D + + +# id for the furniture json. this will be used to load the data when creating a furniture +# when saving a mob in between levels, we will use some static json defined by this id +# and some dynamic json like the furniture health +var id: String + +@export var corpse_scene: PackedScene +var current_health: float = 10.0 + + +func _get_hit(damage): + current_health -= damage + if current_health <= 0: + _die() + +func _die(): + add_corpse.call_deferred(global_position) + queue_free() + +func add_corpse(pos: Vector3): + var corpse = corpse_scene.instantiate() + get_tree().get_root().add_child(corpse) + corpse.global_position = pos + corpse.add_to_group("mapitems") + +func set_sprite(newSprite: Resource): + $Sprite3D.texture = newSprite diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index a399ea31..d1459223 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -89,6 +89,7 @@ func save_furniture_data(target_folder: String) -> void: var furnitureData: Array = [] var defaultFurniture: Dictionary = { "id": "table_round_wood", + "moveable": false, "global_position_x": 0, "global_position_y": 0, "global_position_z": 0 @@ -102,6 +103,7 @@ func save_furniture_data(target_folder: String) -> void: newFurnitureData["global_position_y"] = furniture.global_position.y newFurnitureData["global_position_z"] = furniture.global_position.z newFurnitureData["id"] = furniture.id + newFurnitureData["moveable"] = furniture is RigidBody3D furnitureData.append(newFurnitureData.duplicate()) furniture.queue_free() Helper.json_helper.write_json_file(target_folder + "/furniture.json", JSON.stringify(furnitureData)) diff --git a/level_generation.tscn b/level_generation.tscn index 49624323..051a55f5 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=25 format=3 uid="uid://drl78uuphij1l"] +[gd_scene load_steps=26 format=3 uid="uid://drl78uuphij1l"] [ext_resource type="Script" path="res://LevelGenerator.gd" id="1_i8qa4"] [ext_resource type="Script" path="res://LevelManager.gd" id="2_gm6x7"] [ext_resource type="PackedScene" uid="uid://b2r6nh12wv41k" path="res://Defaults/Mobs/mob.tscn" id="2_jhj6h"] [ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/mob_corpse.tscn" id="3_l8ooc"] [ext_resource type="PackedScene" uid="uid://cpmwu7v1r8cg8" path="res://Defaults/Furniture/FurniturePhysics.tscn" id="4_30bqp"] +[ext_resource type="PackedScene" uid="uid://cm4n8cljiij4w" path="res://Defaults/Furniture/FurnitureStatic.tscn" id="5_cakgt"] [ext_resource type="Script" path="res://Scripts/BuildManager.gd" id="6_y7rk5"] [ext_resource type="Script" path="res://Scripts/player.gd" id="8_gposs"] [ext_resource type="Script" path="res://Scripts/Camera.gd" id="9_gi6l6"] @@ -62,6 +63,7 @@ script = ExtResource("1_i8qa4") defaultMob = ExtResource("2_jhj6h") defaultItem = ExtResource("3_l8ooc") defaultFurniturePhysics = ExtResource("4_30bqp") +defaultFurnitureStatic = ExtResource("5_cakgt") level_manager = NodePath("../NavigationRegion3D/LevelManager") default_level_json = "res://Mods/Core/Maps/Generichouse.json" From 8f3536e6b28b46c5fa3f47d1c2f82b037929b321 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 18 Jan 2024 20:58:23 +0100 Subject: [PATCH 102/138] Furniture rotation, not working yet --- LevelGenerator.gd | 43 +- Mods/Core/Furniture/Furniture.json | 14 + Mods/Core/Furniture/countertop_100_52.png | Bin 0 -> 5462 bytes .../Furniture/countertop_100_52.png.import | 34 + Mods/Core/Maps/Generichouse.json | 9277 +++++++++-------- .../Custom_Editors/FurnitureEditor.tscn | 14 +- .../Custom_Editors/Scripts/FurnitureEditor.gd | 4 + .../Scripts/Selectable_Sprite_Widget.gd | 24 +- .../Selectable_Sprite_Widget.tscn | 2 +- .../Custom_Widgets/Sprite_Selector_Popup.tscn | 3 +- .../Mapeditor/Scripts/GridContainer.gd | 21 +- .../Mapeditor/Scripts/mapeditortile.gd | 46 +- .../Mapeditor/mapeditortile.tscn | 2 +- Scripts/FurniturePhysics.gd | 4 + Scripts/FurnitureStatic.gd | 4 + Scripts/Helper/save_helper.gd | 25 +- 16 files changed, 5369 insertions(+), 4148 deletions(-) create mode 100644 Mods/Core/Furniture/countertop_100_52.png create mode 100644 Mods/Core/Furniture/countertop_100_52.png.import diff --git a/LevelGenerator.gd b/LevelGenerator.gd index ab14275b..bfca0657 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -94,7 +94,8 @@ func generate_tactical_map_level_segment(segment_x: int, segment_z: int, mapsegm level_number += 1 - +# Called when the map is generated +# Only applicable if a save is loaded func generate_mobs() -> void: if map_save_folder == "": return @@ -102,6 +103,7 @@ func generate_mobs() -> void: for mob: Dictionary in mobsArray: add_mob_to_map.call_deferred(mob) +# Called by generate_mobs function when a save is loaded func add_mob_to_map(mob: Dictionary) -> void: var newMob: CharacterBody3D = defaultMob.instantiate() newMob.add_to_group("mobs") @@ -109,8 +111,13 @@ func add_mob_to_map(mob: Dictionary) -> void: newMob.global_position.x = mob.global_position_x newMob.global_position.y = mob.global_position_y newMob.global_position.z = mob.global_position_z + # Check if rotation data is available and apply it + if mob.has("rotation"): + newMob.rotation_degrees.y = mob.rotation newMob.apply_stats_from_json(mob) +# Called when the map is generated +# Only applicable if a save is loaded func generate_items() -> void: if map_save_folder == "": return @@ -118,6 +125,7 @@ func generate_items() -> void: for item: Dictionary in itemsArray: add_item_to_map.call_deferred(item) +# Called by generate_items function when a save is loaded func add_item_to_map(item: Dictionary): var newItem: Node3D = defaultItem.instantiate() newItem.add_to_group("mapitems") @@ -125,8 +133,13 @@ func add_item_to_map(item: Dictionary): newItem.global_position.x = item.global_position_x newItem.global_position.y = item.global_position_y newItem.global_position.z = item.global_position_z + # Check if rotation data is available and apply it + if item.has("rotation"): + newItem.rotation_degrees.y = item.rotation newItem.get_node(newItem.inventory).deserialize(item.inventory) +# Called when the map is generated +# Only applicable if a save is loaded func generate_furniture() -> void: if map_save_folder == "": return @@ -134,6 +147,7 @@ func generate_furniture() -> void: for furnitureData: Dictionary in furnitureArray: add_furniture_to_map.call_deferred(furnitureData) +# Called by generate_furniture function when a save is loaded func add_furniture_to_map(furnitureData: Dictionary) -> void: var newFurniture: Node3D if furnitureData.has("moveable") and furnitureData.moveable: @@ -146,6 +160,9 @@ func add_furniture_to_map(furnitureData: Dictionary) -> void: newFurniture.global_position.x = furnitureData.global_position_x newFurniture.global_position.y = furnitureData.global_position_y newFurniture.global_position.z = furnitureData.global_position_z + # Check if rotation data is available and apply it + if furnitureData.has("rotation"): + newFurniture.rotation_degrees.y = furnitureData.rotation newFurniture.id = furnitureData.id # Generate the map layer by layer @@ -154,7 +171,6 @@ func add_furniture_to_map(furnitureData: Dictionary) -> void: func generate_saved_level(tacticalMapJSON: Dictionary) -> void: var tileJSON: Dictionary = {} var currentBlocks: Array = [] - var level_number = 0 #we need to generate level layer by layer starting from the bottom for level: Dictionary in tacticalMapJSON.maplevels: if level != {}: @@ -189,23 +205,26 @@ func generate_saved_level(tacticalMapJSON: Dictionary) -> void: add_block_mob(tileJSON, block) add_furniture_to_block(tileJSON, block) current_block += 1 - level_number += 1 func add_furniture_to_block(tileJSON: Dictionary, block: StaticBody3D): if tileJSON.has("furniture"): var newFurniture: Node3D - if tileJSON.has("moveable") and tileJSON.moveable: + var furnitureJSON: Dictionary = Gamedata.get_data_by_id(\ + Gamedata.data.furniture, tileJSON.furniture.id) + if furnitureJSON.has("moveable") and furnitureJSON.moveable: newFurniture = defaultFurniturePhysics.instantiate() else: newFurniture = defaultFurnitureStatic.instantiate() newFurniture.add_to_group("furniture") - newFurniture.set_sprite(Gamedata.get_sprite_by_id(\ - Gamedata.data.furniture, tileJSON.furniture)) + newFurniture.set_sprite(Gamedata.data.furniture.sprites[furnitureJSON.sprite]) get_tree().get_root().add_child(newFurniture) newFurniture.global_position.x = block.global_position.x - newFurniture.global_position.y = block.global_position.y+0.5 + newFurniture.global_position.y = block.global_position.y + 0.5 newFurniture.global_position.z = block.global_position.z - newFurniture.id = tileJSON.furniture + + if tileJSON.furniture.has("rotation"): + newFurniture.set_new_rotation(tileJSON.furniture.rotation) + newFurniture.id = furnitureJSON.id func apply_block_rotation(tileJSON: Dictionary, block: StaticBody3D): if tileJSON.has("rotation"): @@ -229,10 +248,12 @@ func add_block_mob(tileJSON: Dictionary, block: StaticBody3D): newMob.add_to_group("mobs") get_tree().get_root().add_child(newMob) newMob.global_position.x = block.global_position.x - newMob.global_position.y = block.global_position.y+0.5 + newMob.global_position.y = block.global_position.y + 0.5 newMob.global_position.z = block.global_position.z - newMob.apply_stats_from_json(Gamedata.get_data_by_id(Gamedata.data.mobs,tileJSON.mob)) - + #if tileJSON.mob.has("rotation"): + #newMob.rotation_degrees.y = tileJSON.mob.rotation + newMob.apply_stats_from_json(Gamedata.get_data_by_id(\ + Gamedata.data.mobs, tileJSON.mob.id)) # This function takes a tile id and creates a new instance of either a block # or a slope which is a StaticBody3D. Look up the sprite property that is specified in diff --git a/Mods/Core/Furniture/Furniture.json b/Mods/Core/Furniture/Furniture.json index 9b361f5c..557e194d 100644 --- a/Mods/Core/Furniture/Furniture.json +++ b/Mods/Core/Furniture/Furniture.json @@ -6,6 +6,7 @@ ], "description": "A round wooden table. This weathered relic from a bygone era stands as a testament to a simpler time, a stark contrast to the harsh reality surrounding it.\nThe table's surface bears the scars a history as a dining spot.", "id": "table_round_wood", + "moveable": true, "name": "Round wooden table", "sprite": "table_64.png" }, @@ -16,7 +17,20 @@ ], "description": "A simple wooden chair, its construction is basic yet sturdy, a testament to durability in the face of decay. \nWith a rough-hewn seat and a backrest that bears the marks of time, this chair offers a momentary respite from the unforgiving environment.", "id": "chair_wood", + "moveable": true, "name": "Wooden chair", "sprite": "chair_32.png" + }, + { + "categories": [ + "Urban", + "Kitchen", + "Indoor" + ], + "description": "One of the central pieces of fruniture that make up a kitchen", + "id": "countertop_wood", + "moveable": false, + "name": "Wooden countertop", + "sprite": "countertop_100_52.png" } ] \ No newline at end of file diff --git a/Mods/Core/Furniture/countertop_100_52.png b/Mods/Core/Furniture/countertop_100_52.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee1bb49572262e988942c59e46ae7d1814116b3 GIT binary patch literal 5462 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 literal 0 HcmV?d00001 diff --git a/Mods/Core/Furniture/countertop_100_52.png.import b/Mods/Core/Furniture/countertop_100_52.png.import new file mode 100644 index 00000000..bea65ef2 --- /dev/null +++ b/Mods/Core/Furniture/countertop_100_52.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ggjyl5rafav" +path="res://.godot/imported/countertop_100_52.png-d6074e65a1149d3afc3dca25b2afe393.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Furniture/countertop_100_52.png" +dest_files=["res://.godot/imported/countertop_100_52.png-d6074e65a1149d3afc3dca25b2afe393.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index 9b2a8f82..0b5123c4 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -8,8208 +8,9289 @@ [], [], [], - [], [ { - "id": "", - "rotation": 0 + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + } ], [ { + "furniture": { + "id": "chair_wood", + "rotation": 180 + }, "id": "grass_plain_01", "rotation": 90 }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "furniture": "table_round_wood", - "id": "grass_plain_01", - "rotation": 0 + "furniture": { + "id": "table_round_wood" + }, + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "furniture": "chair_wood", - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "countertop_wood" + }, + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "countertop_wood" + }, + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "countertop_wood" + }, + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "countertop_wood", + "rotation": 90 + }, + "id": "orange_carpet_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "furniture": "table_round_wood", - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "chair_wood", + "rotation": 180 + }, + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "countertop_wood", + "rotation": 90 + }, + "id": "orange_carpet_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "furniture": "chair_wood", - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "chair_wood", + "rotation": 90 + }, + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "table_round_wood", + "rotation": 90 + }, + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "chair_wood", + "rotation": 270 + }, + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "countertop_wood", + "rotation": 90 + }, + "id": "orange_carpet_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { "id": "grass_plain_01", - "rotation": 0 + "mob": { + "id": "scrapwalker" + } }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "furniture": { + "id": "chair_wood" + }, + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { "id": "grass_plain_01", - "rotation": 0 + "mob": { + "id": "scrapwalker", + "rotation": 270 + } }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { "id": "grass_plain_01", - "rotation": 0 + "mob": { + "id": "scrapwalker", + "rotation": 90 + } }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { "id": "grass_plain_01", - "rotation": 0 + "mob": { + "id": "scrapwalker", + "rotation": 180 + } }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "orange_carpet_00", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "beehive_stones_00", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "mob": "scrapwalker", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "mob": "scrapwalker", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "mob": "rust_sentinel", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" }, { - "id": "grass_plain_01", - "rotation": 0 + "id": "grass_plain_01" } ], [ diff --git a/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn b/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn index 1ab08e01..f2db0a55 100644 --- a/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn @@ -5,7 +5,7 @@ [ext_resource type="PackedScene" uid="uid://b8i6wfk3fngy4" path="res://Scenes/ContentManager/Custom_Widgets/Editable_Item_List.tscn" id="2_ekwf5"] [ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="3_o3k3a"] -[node name="FurnitureEditor" type="Control" node_paths=PackedStringArray("furnitureImageDisplay", "IDTextLabel", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "furnitureSelector", "imageNameStringLabel")] +[node name="FurnitureEditor" type="Control" node_paths=PackedStringArray("furnitureImageDisplay", "IDTextLabel", "NameTextEdit", "DescriptionTextEdit", "CategoriesList", "furnitureSelector", "imageNameStringLabel", "moveableCheckboxButton")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -19,7 +19,8 @@ NameTextEdit = NodePath("VBoxContainer/FormGrid/NameTextEdit") DescriptionTextEdit = NodePath("VBoxContainer/FormGrid/DescriptionTextEdit") CategoriesList = NodePath("VBoxContainer/FormGrid/Editable_Item_List") furnitureSelector = NodePath("Sprite_selector") -imageNameStringLabel = NodePath("VBoxContainer/FormGrid/ImageNameLabel") +imageNameStringLabel = NodePath("VBoxContainer/FormGrid/ImageNameStringLabel") +moveableCheckboxButton = NodePath("VBoxContainer/FormGrid/UnmoveableCheckBox") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -115,6 +116,15 @@ focus_previous = NodePath("../DescriptionTextEdit") focus_mode = 2 header = "Categories" +[node name="MoveableLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Can move" + +[node name="UnmoveableCheckBox" type="CheckBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "Check this if the furniture should be moveable, like a chair. Leave this unchecked if the furniture should not move, like a fence" +text = "Moveable" + [node name="Sprite_selector" parent="." instance=ExtResource("3_o3k3a")] visible = false diff --git a/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd b/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd index 655217a1..8dd76da4 100644 --- a/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/Scripts/FurnitureEditor.gd @@ -12,6 +12,7 @@ extends Control @export var CategoriesList: Control = null @export var furnitureSelector: Popup = null @export var imageNameStringLabel: Label = null +@export var moveableCheckboxButton: CheckBox = null var control_elements: Array = [] # This signal will be emitted when the user presses the save button @@ -46,6 +47,8 @@ func load_furniture_data(): CategoriesList.clear_list() for category in contentData["categories"]: CategoriesList.add_item_to_list(category) + if moveableCheckboxButton != null and contentData.has("moveable"): + moveableCheckboxButton.button_pressed = contentData["moveable"] #The editor is closed, destroy the instance #TODO: Check for unsaved changes @@ -61,6 +64,7 @@ func _on_save_button_button_up(): contentData["name"] = NameTextEdit.text contentData["description"] = DescriptionTextEdit.text contentData["categories"] = CategoriesList.get_items() + contentData["moveable"] = moveableCheckboxButton.button_pressed data_changed.emit() func _input(event): diff --git a/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd b/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd index 78fbf742..6a65f81c 100644 --- a/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd +++ b/Scenes/ContentManager/Custom_Widgets/Scripts/Selectable_Sprite_Widget.gd @@ -17,20 +17,26 @@ func _on_texture_rect_gui_input(event): else: selectableSprite_clicked.emit(self) last_click_time = current_time - -#func _on_texture_rect_gui_input(event): - #if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: - #selectableSprite_clicked.emit(self) - + func set_sprite_texture(res: Resource) -> void: + var texture: Texture if res is BaseMaterial3D: - $SpriteImage.texture = res.albedo_texture + texture = res.albedo_texture else: - $SpriteImage.texture = res - + texture = res + + if texture: + $SpriteImage.texture = texture + # Set the minimum size of the widget based on the texture size + var texture_size = texture.get_size() + custom_minimum_size = Vector2(texture_size.x, texture_size.y) + else: + $SpriteImage.texture = null + custom_minimum_size = Vector2(0, custom_minimum_size.y) # Reset to no minimum width + func get_texture() -> Resource: return $SpriteImage.texture - + #Mark the clicked spritebrush as selected func set_selected(is_selected: bool) -> void: selected = is_selected diff --git a/Scenes/ContentManager/Custom_Widgets/Selectable_Sprite_Widget.tscn b/Scenes/ContentManager/Custom_Widgets/Selectable_Sprite_Widget.tscn index 3e4e6880..5082f8fc 100644 --- a/Scenes/ContentManager/Custom_Widgets/Selectable_Sprite_Widget.tscn +++ b/Scenes/ContentManager/Custom_Widgets/Selectable_Sprite_Widget.tscn @@ -19,6 +19,6 @@ layout_mode = 0 offset_right = 40.0 offset_bottom = 40.0 texture = ExtResource("2_5qjrc") -expand_mode = 3 +stretch_mode = 2 [connection signal="gui_input" from="SpriteImage" to="." method="_on_texture_rect_gui_input"] diff --git a/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn b/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn index fcdf5f23..720dc601 100644 --- a/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn +++ b/Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn @@ -7,10 +7,11 @@ [node name="Sprite_selector" type="Popup" node_paths=PackedStringArray("spriteList")] title = "Input ID" initial_position = 2 -size = Vector2i(400, 400) +size = Vector2i(600, 400) visible = true unresizable = false borderless = false +min_size = Vector2i(500, 400) script = ExtResource("1_rag8d") selectable_Sprite_Widget = ExtResource("2_wjnk7") spriteList = NodePath("VBoxContainer/Scrolling_Flow_Container") diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 98570ddd..8243aa01 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -146,19 +146,36 @@ func paint_single_tile(clicked_tile): elif selected_brush: if selected_brush.entityType == "mob": clicked_tile.set_mob_id(selected_brush.tileID) + clicked_tile.set_mob_rotation(rotationAmount) elif selected_brush.entityType == "furniture": clicked_tile.set_furniture_id(selected_brush.tileID) + clicked_tile.set_furniture_rotation(rotationAmount) else: clicked_tile.set_tile_id(selected_brush.tileID) clicked_tile.set_rotation_amount(rotationAmount) -#When this function is called, loop over all the TileGrid's children and get the tileData property. Store this data in the currentLevelData array func storeLevelData(): currentLevelData.clear() + var has_significant_data = false + + # First pass: Check if any tile has significant data for child in get_children(): - currentLevelData.append(child.tileData) + if child.tileData and (child.tileData.has("id") or \ + child.tileData.has("mob") or child.tileData.has("furniture")): + has_significant_data = true + break + + # Second pass: Add all tiles to currentLevelData if any significant data is found + if has_significant_data: + for child in get_children(): + currentLevelData.append(child.tileData) + else: + # If no tile has significant data, consider adding a special marker or log + print_debug("No significant tile data found for the current level") + mapData.levels[currentLevel] = currentLevelData.duplicate() + # Loads the leveldata from the mapdata # If no data exists, use the default to create a new map func loadLevelData(newLevel: int): diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd index 7ca79973..51251ceb 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditortile.gd @@ -14,13 +14,18 @@ var tileData: Dictionary = defaultTileData.duplicate(): if tileData.has("rotation"): set_rotation_amount(tileData.rotation) $MobFurnitureSprite.hide() - if tileData.has("furniture"): - $MobFurnitureSprite.texture = Gamedata.get_sprite_by_id(\ - Gamedata.data.furniture, tileData.furniture) - $MobFurnitureSprite.show() - elif tileData.has("mob"): + $MobFurnitureSprite.rotation_degrees = 0 + if tileData.has("mob"): + if tileData.mob.has("rotation"): + $MobFurnitureSprite.rotation_degrees = tileData.mob.rotation $MobFurnitureSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.mobs,\ - tileData.mob) + tileData.mob.id) + $MobFurnitureSprite.show() + elif tileData.has("furniture"): + if tileData.furniture.has("rotation"): + $MobFurnitureSprite.rotation_degrees = tileData.furniture.rotation + $MobFurnitureSprite.texture = Gamedata.get_sprite_by_id(\ + Gamedata.data.furniture, tileData.furniture.id) $MobFurnitureSprite.show() else: $TileSprite.texture = load(defaultTexture) @@ -37,7 +42,10 @@ func _on_texture_rect_gui_input(event: InputEvent) -> void: func set_rotation_amount(amount: int) -> void: $TileSprite.rotation_degrees = amount - tileData.rotation = amount + if amount == 0: + tileData.erase("rotation") + else: + tileData.rotation = amount func get_rotation_amount() -> int: return $TileSprite.rotation_degrees @@ -62,7 +70,10 @@ func set_mob_id(id: String) -> void: else: # A tile can either have a mob or furniture. If we add a mob, remove furniture tileData.erase("furniture") - tileData.mob = id + if tileData.has("mob"): + tileData.mob.id = id + else: + tileData.mob = {"id": id} $MobFurnitureSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.mobs, id) $MobFurnitureSprite.show() @@ -74,10 +85,27 @@ func set_furniture_id(id: String) -> void: else: # A tile can either have a mob or furniture. If we add furniture, remove the mob tileData.erase("mob") - tileData.furniture = id + if tileData.has("furniture"): + tileData.furniture.id = id + else: + tileData.furniture = {"id": id} $MobFurnitureSprite.texture = Gamedata.get_sprite_by_id(Gamedata.data.furniture, id) $MobFurnitureSprite.show() +func set_mob_rotation(rotationDegrees): + $MobFurnitureSprite.rotation_degrees = rotationDegrees + if rotationDegrees == 0: + tileData.mob.erase("rotation") + else: + tileData.mob.rotation = rotationDegrees + +func set_furniture_rotation(rotationDegrees): + $MobFurnitureSprite.rotation_degrees = rotationDegrees + if rotationDegrees == 0: + tileData.furniture.erase("rotation") + else: + tileData.furniture.rotation = rotationDegrees + func _on_texture_rect_mouse_entered() -> void: if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): tile_clicked.emit(self) diff --git a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn index 37d22fca..7ea2c40a 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditortile.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditortile.tscn @@ -32,7 +32,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 texture = ExtResource("2_rued1") -expand_mode = 3 +expand_mode = 2 [connection signal="gui_input" from="TileSprite" to="." method="_on_texture_rect_gui_input"] [connection signal="mouse_entered" from="TileSprite" to="." method="_on_texture_rect_mouse_entered"] diff --git a/Scripts/FurniturePhysics.gd b/Scripts/FurniturePhysics.gd index 4f72b0fe..42f9bad2 100644 --- a/Scripts/FurniturePhysics.gd +++ b/Scripts/FurniturePhysics.gd @@ -35,3 +35,7 @@ func set_sprite(newSprite: Resource): #material.albedo_texture = newSprite # Set the texture of the material #material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA #$MeshInstance3D.mesh.surface_set_material(0, material) + +func set_new_rotation(amount: int): + rotation_degrees.y = amount + $Sprite3D.rotation_degrees.y = amount diff --git a/Scripts/FurnitureStatic.gd b/Scripts/FurnitureStatic.gd index c3afc197..36ae91e8 100644 --- a/Scripts/FurnitureStatic.gd +++ b/Scripts/FurnitureStatic.gd @@ -27,3 +27,7 @@ func add_corpse(pos: Vector3): func set_sprite(newSprite: Resource): $Sprite3D.texture = newSprite + +func set_new_rotation(amount: int): + rotation_degrees.y = amount + $Sprite3D.rotation_degrees.y = amount diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index d1459223..84a877ed 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -49,6 +49,7 @@ func save_mob_data(target_folder: String) -> void: "global_position_x": mob.global_position.x, "global_position_y": mob.global_position.y, "global_position_z": mob.global_position.z, + "rotation": mob.rotation_degrees.y, "melee_damage": mob.melee_damage, "melee_range": mob.melee_range, "health": mob.health, @@ -84,30 +85,26 @@ func save_item_data(target_folder: String) -> void: Helper.json_helper.write_json_file(target_folder + "/items.json",\ JSON.stringify(itemData)) -# Save the type and position of all furniture on the map + func save_furniture_data(target_folder: String) -> void: var furnitureData: Array = [] - var defaultFurniture: Dictionary = { - "id": "table_round_wood", - "moveable": false, - "global_position_x": 0, - "global_position_y": 0, - "global_position_z": 0 - } var mapFurniture = get_tree().get_nodes_in_group("furniture") var newFurnitureData: Dictionary for furniture in mapFurniture: furniture.remove_from_group("furniture") - newFurnitureData = defaultFurniture.duplicate() - newFurnitureData["global_position_x"] = furniture.global_position.x - newFurnitureData["global_position_y"] = furniture.global_position.y - newFurnitureData["global_position_z"] = furniture.global_position.z - newFurnitureData["id"] = furniture.id - newFurnitureData["moveable"] = furniture is RigidBody3D + newFurnitureData = { + "id": furniture.id, + "moveable": furniture is RigidBody3D, + "global_position_x": furniture.global_position.x, + "global_position_y": furniture.global_position.y, + "global_position_z": furniture.global_position.z, + "rotation": furniture.rotation_degrees.y, # Save the Y-axis rotation + } furnitureData.append(newFurnitureData.duplicate()) furniture.queue_free() Helper.json_helper.write_json_file(target_folder + "/furniture.json", JSON.stringify(furnitureData)) + # Saves all of the maplevels to disk # A maplevel is one 32x32 layer at a certain x,y and z position # This layer will contain 1024 blocks From b401d213bac9f02986b25bf3ada9e9a248d1d6c3 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 19 Jan 2024 23:58:16 +0100 Subject: [PATCH 103/138] Fix tacticalmap editor bug --- .../Scripts/TacticalMapEditor.gd | 16 +++- .../TacticalMapEditor/Scripts/TileGrid.gd | 77 +++++++++++++++---- .../TacticalMapEditor/TacticalMapEditor.tscn | 3 - 3 files changed, 77 insertions(+), 19 deletions(-) diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd index a91ae378..1a564408 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TacticalMapEditor.gd @@ -13,16 +13,26 @@ var contentSource: String = "": contentSource = newSource tileGrid.load_tacticalmap_json_file() +# In tacticalmapeditor.gd +func _ready() -> void: + # Connect the signal from TileGrid to this script + tileGrid.connect("map_dimensions_changed",_on_map_dimensions_changed) -func _on_map_height_text_changed(): +func _on_map_height_text_changed() -> void: mapHeight = int(mapheightTextEdit.text) tileGrid.resetGrid() -func _on_map_width_text_changed(): +func _on_map_width_text_changed() -> void: mapWidth = int(mapwidthTextEdit.text) tileGrid.resetGrid() #The editor is closed, destroy the instance #TODO: Check for unsaved changes -func _on_close_button_button_up(): +func _on_close_button_button_up() -> void: queue_free() + + +# Handler for the signal +func _on_map_dimensions_changed(new_map_width: int, new_map_height: int) -> void: + mapwidthTextEdit.text = str(new_map_width) + mapheightTextEdit.text = str(new_map_height) diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd index 324403bf..6bf1488a 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd @@ -1,5 +1,6 @@ extends GridContainer +signal map_dimensions_changed(new_map_width, new_map_height) @export var tileScene: PackedScene #This is the index of the level we are on. 0 is ground level. can be -10 to +10 var currentLevel: int = 10 @@ -36,11 +37,31 @@ func createTiles(): add_child(tileInstance) tileInstance.connect("tile_clicked",grid_tile_clicked) +#func resetGrid(): + #for child in get_children(): + #child.queue_free() + #createTiles() + func resetGrid(): + # Clear the existing children for child in get_children(): child.queue_free() + + # Update mapData with new dimensions + mapData.mapwidth = mapEditor.mapWidth + mapData.mapheight = mapEditor.mapHeight + var newMapsArray = [] + for x in range(mapEditor.mapWidth): + for y in range(mapEditor.mapHeight): + newMapsArray.append({}) # Add an empty dictionary for each tile + + mapData.maps = newMapsArray + + # Recreate tiles createTiles() + + #When one of the grid tiles is clicked, we paint the tile accordingly func grid_tile_clicked(clicked_tile): paint_single_tile(clicked_tile) @@ -78,23 +99,53 @@ func storeLevelData(): func load_tacticalmap_json_file(): var fileToLoad: String = mapEditor.contentSource mapData = Helper.json_helper.load_json_dictionary_file(fileToLoad) - - + # Notify about the change in map dimensions + map_dimensions_changed.emit(mapData.mapwidth, mapData.mapheight) + + # +#func loadLevel(): + #if mapData.is_empty(): + #print_debug("Tried to load data from an empty mapData dictionary") + #return; + #var newLevelData: Array = mapData.maps + #var i: int = 0 + ## If any data exists on this level, we load it + #if newLevelData != []: + #for tile in get_children(): + #tile.tileData = newLevelData[i] + #i += 1 + #else: + ##No data is present on this level. apply the default value for each tile + #for tile in get_children(): + #tile.set_default() + func loadLevel(): if mapData.is_empty(): print_debug("Tried to load data from an empty mapData dictionary") - return; + return + + # Clear existing children + for child in get_children(): + child.queue_free() + + # Set the number of columns based on mapWidth + columns = mapData.mapwidth + + # Recreate the grid based on mapData dimensions var newLevelData: Array = mapData.maps - var i: int = 0 - # If any data exists on this level, we load it - if newLevelData != []: - for tile in get_children(): - tile.tileData = newLevelData[i] - i += 1 - else: - #No data is present on this level. apply the default value for each tile - for tile in get_children(): - tile.set_default() + var index: int = 0 + for x in range(mapData.mapwidth): + for y in range(mapData.mapheight): + var tileInstance: Control = tileScene.instantiate() + add_child(tileInstance) + tileInstance.connect("tile_clicked",grid_tile_clicked) + + # Load tile data if available, otherwise use default data + if index < newLevelData.size(): + tileInstance.tileData = newLevelData[index] + else: + tileInstance.set_default() + index += 1 func _on_entities_container_tile_brush_selection_change(tilebrush): diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn index 14ca8aa2..3d992a9e 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/TacticalMapEditor.tscn @@ -141,7 +141,4 @@ tileBrush = ExtResource("11_bh5ke") [connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/SaveButton" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="save_map_json_file"] [connection signal="text_changed" from="HSplitContainer/MapeditorContainer/Toolbar/MapWidth" to="." method="_on_map_width_text_changed"] [connection signal="text_changed" from="HSplitContainer/MapeditorContainer/Toolbar/MapHeight" to="." method="_on_map_height_text_changed"] -[connection signal="button_up" from="HSplitContainer/MapeditorContainer/Toolbar/RotateRight" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_rotate_right_button_up"] -[connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_draw_rectangle_toggled"] -[connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/Erase" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_erase_toggled"] [connection signal="tile_brush_selection_change" from="HSplitContainer/EntitiesContainer" to="HSplitContainer/MapeditorContainer/HBoxContainer/TileGrid" method="_on_entities_container_tile_brush_selection_change"] From 1becb662a7cd8d57a8f1eb1f9b95176397d42347 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 19 Jan 2024 23:59:05 +0100 Subject: [PATCH 104/138] Rotate furniture, loading not working yet --- Defaults/Furniture/FurniturePhysics.tscn | 5 ++++- Defaults/Furniture/FurnitureStatic.tscn | 4 +++- LevelGenerator.gd | 2 ++ Scripts/FurniturePhysics.gd | 8 ++++++-- Scripts/FurnitureStatic.gd | 12 ++++++++++-- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Defaults/Furniture/FurniturePhysics.tscn b/Defaults/Furniture/FurniturePhysics.tscn index 33d87a00..b7a9e611 100644 --- a/Defaults/Furniture/FurniturePhysics.tscn +++ b/Defaults/Furniture/FurniturePhysics.tscn @@ -10,12 +10,15 @@ radius = 0.2 [node name="FurniturePhysics" type="RigidBody3D"] collision_layer = 4 collision_mask = 7 +axis_lock_angular_x = true +axis_lock_angular_z = true linear_damp = 59.0 +angular_damp = 59.0 script = ExtResource("1_klkkl") corpse_scene = ExtResource("2_jy8nl") [node name="Sprite3D" type="Sprite3D" parent="."] -billboard = 1 +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0) texture = ExtResource("1_q67ig") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] diff --git a/Defaults/Furniture/FurnitureStatic.tscn b/Defaults/Furniture/FurnitureStatic.tscn index 1b21a4ef..55a584c1 100644 --- a/Defaults/Furniture/FurnitureStatic.tscn +++ b/Defaults/Furniture/FurnitureStatic.tscn @@ -8,11 +8,13 @@ radius = 0.2 [node name="FurnitureStatic" type="StaticBody3D"] +axis_lock_angular_x = true +axis_lock_angular_z = true script = ExtResource("1_wituf") corpse_scene = ExtResource("2_ln6uk") [node name="Sprite3D" type="Sprite3D" parent="."] -billboard = 1 +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0) texture = ExtResource("2_nt0ji") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] diff --git a/LevelGenerator.gd b/LevelGenerator.gd index bfca0657..f4e1b416 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -224,6 +224,8 @@ func add_furniture_to_block(tileJSON: Dictionary, block: StaticBody3D): if tileJSON.furniture.has("rotation"): newFurniture.set_new_rotation(tileJSON.furniture.rotation) + else: + newFurniture.set_new_rotation(0) newFurniture.id = furnitureJSON.id func apply_block_rotation(tileJSON: Dictionary, block: StaticBody3D): diff --git a/Scripts/FurniturePhysics.gd b/Scripts/FurniturePhysics.gd index 42f9bad2..21c96424 100644 --- a/Scripts/FurniturePhysics.gd +++ b/Scripts/FurniturePhysics.gd @@ -37,5 +37,9 @@ func set_sprite(newSprite: Resource): #$MeshInstance3D.mesh.surface_set_material(0, material) func set_new_rotation(amount: int): - rotation_degrees.y = amount - $Sprite3D.rotation_degrees.y = amount + if amount == 180: + $Sprite3D.rotation_degrees.y = amount-180 + elif amount == 0: + $Sprite3D.rotation_degrees.y = amount+180 + else: + $Sprite3D.rotation_degrees.y = amount-0 diff --git a/Scripts/FurnitureStatic.gd b/Scripts/FurnitureStatic.gd index 36ae91e8..60baa9cc 100644 --- a/Scripts/FurnitureStatic.gd +++ b/Scripts/FurnitureStatic.gd @@ -27,7 +27,15 @@ func add_corpse(pos: Vector3): func set_sprite(newSprite: Resource): $Sprite3D.texture = newSprite +# +#func set_new_rotation(amount: int): + #rotation_degrees.y = amount + #$Sprite3D.rotation_degrees.y = amount func set_new_rotation(amount: int): - rotation_degrees.y = amount - $Sprite3D.rotation_degrees.y = amount + if amount == 180: + $Sprite3D.rotation_degrees.y = amount-180 + elif amount == 0: + $Sprite3D.rotation_degrees.y = amount+180 + else: + $Sprite3D.rotation_degrees.y = amount-0 From e26115619a8068303544f63d47a72f7dfe5692f5 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 20 Jan 2024 12:59:23 +0100 Subject: [PATCH 105/138] Rotation is saved and loaded properly --- LevelGenerator.gd | 4 ++++ Scripts/FurniturePhysics.gd | 9 +++++++++ Scripts/FurnitureStatic.gd | 3 +++ Scripts/Helper/save_helper.gd | 1 + 4 files changed, 17 insertions(+) diff --git a/LevelGenerator.gd b/LevelGenerator.gd index f4e1b416..7b7fd570 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -163,6 +163,10 @@ func add_furniture_to_map(furnitureData: Dictionary) -> void: # Check if rotation data is available and apply it if furnitureData.has("rotation"): newFurniture.rotation_degrees.y = furnitureData.rotation + + # Check if sprite rotation data is available and apply it + if furnitureData.has("sprite_rotation"): + newFurniture.set_new_rotation(furnitureData.sprite_rotation) newFurniture.id = furnitureData.id # Generate the map layer by layer diff --git a/Scripts/FurniturePhysics.gd b/Scripts/FurniturePhysics.gd index 21c96424..2e509132 100644 --- a/Scripts/FurniturePhysics.gd +++ b/Scripts/FurniturePhysics.gd @@ -43,3 +43,12 @@ func set_new_rotation(amount: int): $Sprite3D.rotation_degrees.y = amount+180 else: $Sprite3D.rotation_degrees.y = amount-0 + +func get_sprite_rotation() -> int: + var rot: int = $Sprite3D.rotation_degrees.y + if rot == 180: + return rot-180 + elif rot == 0: + return rot+180 + else: + return rot-0 diff --git a/Scripts/FurnitureStatic.gd b/Scripts/FurnitureStatic.gd index 60baa9cc..5e8abbde 100644 --- a/Scripts/FurnitureStatic.gd +++ b/Scripts/FurnitureStatic.gd @@ -39,3 +39,6 @@ func set_new_rotation(amount: int): $Sprite3D.rotation_degrees.y = amount+180 else: $Sprite3D.rotation_degrees.y = amount-0 + +func get_sprite_rotation() -> int: + return $Sprite3D.rotation_degrees.y diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 84a877ed..e9a1c39a 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -99,6 +99,7 @@ func save_furniture_data(target_folder: String) -> void: "global_position_y": furniture.global_position.y, "global_position_z": furniture.global_position.z, "rotation": furniture.rotation_degrees.y, # Save the Y-axis rotation + "sprite_rotation": furniture.get_sprite_rotation() } furnitureData.append(newFurnitureData.duplicate()) furniture.queue_free() From 21e2fe1ccf634a87eb5676b058217488f56c8e45 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 21 Jan 2024 00:10:39 +0100 Subject: [PATCH 106/138] proper furniture save load rotation --- Defaults/Furniture/FurnitureStatic.tscn | 6 ++-- LevelGenerator.gd | 10 ++++-- Scripts/FurnitureStatic.gd | 48 +++++++++++++++++++------ Scripts/Helper/save_helper.gd | 7 +++- 4 files changed, 53 insertions(+), 18 deletions(-) diff --git a/Defaults/Furniture/FurnitureStatic.tscn b/Defaults/Furniture/FurnitureStatic.tscn index 55a584c1..da98f666 100644 --- a/Defaults/Furniture/FurnitureStatic.tscn +++ b/Defaults/Furniture/FurnitureStatic.tscn @@ -4,8 +4,8 @@ [ext_resource type="PackedScene" uid="uid://mu6nbyuq02o5" path="res://Defaults/Mobs/mob_corpse.tscn" id="2_ln6uk"] [ext_resource type="Texture2D" uid="uid://cqfqxgp12asw1" path="res://Mods/Core/Furniture/table_64.png" id="2_nt0ji"] -[sub_resource type="SphereShape3D" id="SphereShape3D_xaq3g"] -radius = 0.2 +[sub_resource type="BoxShape3D" id="BoxShape3D_23dag"] +size = Vector3(0.4, 0.5, 0.4) [node name="FurnitureStatic" type="StaticBody3D"] axis_lock_angular_x = true @@ -18,4 +18,4 @@ transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, texture = ExtResource("2_nt0ji") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("SphereShape3D_xaq3g") +shape = SubResource("BoxShape3D_23dag") diff --git a/LevelGenerator.gd b/LevelGenerator.gd index 7b7fd570..34b2ed16 100644 --- a/LevelGenerator.gd +++ b/LevelGenerator.gd @@ -150,7 +150,8 @@ func generate_furniture() -> void: # Called by generate_furniture function when a save is loaded func add_furniture_to_map(furnitureData: Dictionary) -> void: var newFurniture: Node3D - if furnitureData.has("moveable") and furnitureData.moveable: + var isMoveable = furnitureData.has("moveable") and furnitureData.moveable + if isMoveable: newFurniture = defaultFurniturePhysics.instantiate() else: newFurniture = defaultFurnitureStatic.instantiate() @@ -162,10 +163,13 @@ func add_furniture_to_map(furnitureData: Dictionary) -> void: newFurniture.global_position.z = furnitureData.global_position_z # Check if rotation data is available and apply it if furnitureData.has("rotation"): - newFurniture.rotation_degrees.y = furnitureData.rotation + if isMoveable: + newFurniture.rotation_degrees.y = furnitureData.rotation + else: + newFurniture.set_new_rotation(furnitureData.rotation) # Check if sprite rotation data is available and apply it - if furnitureData.has("sprite_rotation"): + if furnitureData.has("sprite_rotation") and isMoveable: newFurniture.set_new_rotation(furnitureData.sprite_rotation) newFurniture.id = furnitureData.id diff --git a/Scripts/FurnitureStatic.gd b/Scripts/FurnitureStatic.gd index 5e8abbde..e4755cd4 100644 --- a/Scripts/FurnitureStatic.gd +++ b/Scripts/FurnitureStatic.gd @@ -24,21 +24,47 @@ func add_corpse(pos: Vector3): get_tree().get_root().add_child(corpse) corpse.global_position = pos corpse.add_to_group("mapitems") - -func set_sprite(newSprite: Resource): + +func get_sprite_rotation() -> int: + return $Sprite3D.rotation_degrees.y + +func set_sprite(newSprite: Texture): $Sprite3D.texture = newSprite -# -#func set_new_rotation(amount: int): - #rotation_degrees.y = amount - #$Sprite3D.rotation_degrees.y = amount + + # Calculate new dimensions for the collision shape + var sprite_width = newSprite.get_width() + var sprite_height = newSprite.get_height() + + var new_x = sprite_width / 100.0 # 0.1 units per 10 pixels in width + var new_z = sprite_height / 100.0 # 0.1 units per 10 pixels in height + var new_y = 0.5 # Fixed height for now + + # Update the collision shape + var new_shape = BoxShape3D.new() + new_shape.extents = Vector3(new_x / 2.0, new_y / 2.0, new_z / 2.0) # BoxShape3D extents are half extents + + var collision_shape_node = $CollisionShape3D + collision_shape_node.shape = new_shape func set_new_rotation(amount: int): + var rotation_amount = amount if amount == 180: - $Sprite3D.rotation_degrees.y = amount-180 + rotation_amount = amount - 180 elif amount == 0: - $Sprite3D.rotation_degrees.y = amount+180 + rotation_amount = amount + 180 else: - $Sprite3D.rotation_degrees.y = amount-0 + rotation_amount = amount + + # Rotate the entire StaticBody3D node, including its children + rotation_degrees.y = rotation_amount + + +func get_my_rotation() -> int: + var rot: int = int(rotation_degrees.y) + if rot == 180: + return rot-180 + elif rot == 0: + return rot+180 + else: + return rot-0 -func get_sprite_rotation() -> int: - return $Sprite3D.rotation_degrees.y diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index e9a1c39a..078b840e 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -90,15 +90,20 @@ func save_furniture_data(target_folder: String) -> void: var furnitureData: Array = [] var mapFurniture = get_tree().get_nodes_in_group("furniture") var newFurnitureData: Dictionary + var newRot: int for furniture in mapFurniture: furniture.remove_from_group("furniture") + if furniture is RigidBody3D: + newRot = furniture.rotation_degrees.y + else: + newRot = furniture.get_my_rotation() newFurnitureData = { "id": furniture.id, "moveable": furniture is RigidBody3D, "global_position_x": furniture.global_position.x, "global_position_y": furniture.global_position.y, "global_position_z": furniture.global_position.z, - "rotation": furniture.rotation_degrees.y, # Save the Y-axis rotation + "rotation": newRot, # Save the Y-axis rotation "sprite_rotation": furniture.get_sprite_rotation() } furnitureData.append(newFurnitureData.duplicate()) From b702eafef3bf68c30e44aec5a321a9af544bea09 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 21 Jan 2024 00:19:24 +0100 Subject: [PATCH 107/138] Remove commented out code --- .../TacticalMapEditor/Scripts/TileGrid.gd | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd index 6bf1488a..4f3ef65e 100644 --- a/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd +++ b/Scenes/ContentManager/Custom_Editors/TacticalMapEditor/Scripts/TileGrid.gd @@ -37,11 +37,6 @@ func createTiles(): add_child(tileInstance) tileInstance.connect("tile_clicked",grid_tile_clicked) -#func resetGrid(): - #for child in get_children(): - #child.queue_free() - #createTiles() - func resetGrid(): # Clear the existing children for child in get_children(): @@ -102,23 +97,6 @@ func load_tacticalmap_json_file(): # Notify about the change in map dimensions map_dimensions_changed.emit(mapData.mapwidth, mapData.mapheight) - # -#func loadLevel(): - #if mapData.is_empty(): - #print_debug("Tried to load data from an empty mapData dictionary") - #return; - #var newLevelData: Array = mapData.maps - #var i: int = 0 - ## If any data exists on this level, we load it - #if newLevelData != []: - #for tile in get_children(): - #tile.tileData = newLevelData[i] - #i += 1 - #else: - ##No data is present on this level. apply the default value for each tile - #for tile in get_children(): - #tile.set_default() - func loadLevel(): if mapData.is_empty(): print_debug("Tried to load data from an empty mapData dictionary") From 6e5cbeb658cd7be10fba429971510bedce26d793 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 21 Jan 2024 11:26:52 +0100 Subject: [PATCH 108/138] Initial item editor, sprites --- Mods/Core/Items/9mm.png | Bin 0 -> 309 bytes Mods/Core/Items/9mm.png.import | 34 ++++ Mods/Core/Items/pistol_magazine.png | Bin 0 -> 386 bytes Mods/Core/Items/pistol_magazine.png.import | 34 ++++ Mods/Core/Items/plank.png | Bin 0 -> 764 bytes Mods/Core/Items/plank.png.import | 34 ++++ Mods/Core/Items/steel_scrap.png | Bin 0 -> 2207 bytes Mods/Core/Items/steel_scrap.png.import | 34 ++++ .../Custom_Editors/ItemEditor/ItemEditor.tscn | 177 ++++++++++++++++++ Scripts/ItemEditor.gd | 98 ++++++++++ 10 files changed, 411 insertions(+) create mode 100644 Mods/Core/Items/9mm.png create mode 100644 Mods/Core/Items/9mm.png.import create mode 100644 Mods/Core/Items/pistol_magazine.png create mode 100644 Mods/Core/Items/pistol_magazine.png.import create mode 100644 Mods/Core/Items/plank.png create mode 100644 Mods/Core/Items/plank.png.import create mode 100644 Mods/Core/Items/steel_scrap.png create mode 100644 Mods/Core/Items/steel_scrap.png.import create mode 100644 Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn create mode 100644 Scripts/ItemEditor.gd diff --git a/Mods/Core/Items/9mm.png b/Mods/Core/Items/9mm.png new file mode 100644 index 0000000000000000000000000000000000000000..912edd0484c104a9bed2204cbd523276afbc53c5 GIT binary patch literal 309 zcmV-50m}Y~P)Px#?@2^KR9J=Wmpu-IAP|MeO=vj|_pdz;Ed^Vx8HE|Zd*9vfw zBmpFM0{v>5@~%lCE`e5ywt4{PBpj;$2q&<5PI$t$qeD8|+q5r0PY;QaylRA(ABF zNs9v5z&0Per|d!a%->rrrxwP40=2~3anM+*h^uMDw11ehi#v@{C00000NkvXX Hu0mjf;DmSz literal 0 HcmV?d00001 diff --git a/Mods/Core/Items/9mm.png.import b/Mods/Core/Items/9mm.png.import new file mode 100644 index 00000000..03570caf --- /dev/null +++ b/Mods/Core/Items/9mm.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dfmrlie57qrbo" +path="res://.godot/imported/9mm.png-3441f559393926783dc0d2e02461da36.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Items/9mm.png" +dest_files=["res://.godot/imported/9mm.png-3441f559393926783dc0d2e02461da36.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Mods/Core/Items/pistol_magazine.png b/Mods/Core/Items/pistol_magazine.png new file mode 100644 index 0000000000000000000000000000000000000000..a792d563ce1eb5eb6756ffb510b5db020f008b18 GIT binary patch literal 386 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 literal 0 HcmV?d00001 diff --git a/Mods/Core/Items/steel_scrap.png.import b/Mods/Core/Items/steel_scrap.png.import new file mode 100644 index 00000000..9e07436c --- /dev/null +++ b/Mods/Core/Items/steel_scrap.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c5tbuxmrli7e4" +path="res://.godot/imported/steel_scrap.png-945eecc671a66949a44a03816c3ce558.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Items/steel_scrap.png" +dest_files=["res://.godot/imported/steel_scrap.png-945eecc671a66949a44a03816c3ce558.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn new file mode 100644 index 00000000..dfe609ce --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn @@ -0,0 +1,177 @@ +[gd_scene load_steps=4 format=3 uid="uid://dmpomdwta1pgq"] + +[ext_resource type="Script" path="res://Scripts/ItemEditor.gd" id="1_ef3j7"] +[ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_ghd7c"] +[ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="3_qb68r"] + +[node name="ItemEditor" 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_ef3j7") + +[node name="VBoxContainer" 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="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="CloseButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Close" + +[node name="SaveButton" type="Button" parent="VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "Save" + +[node name="FormGrid" type="GridContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +columns = 2 + +[node name="ImageLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Sprite:" + +[node name="MobImageDisplay" type="TextureRect" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(128, 128) +layout_mode = 2 +size_flags_horizontal = 0 +size_flags_stretch_ratio = 0.4 +texture = ExtResource("2_ghd7c") +expand_mode = 3 + +[node name="PathLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Sprite name" + +[node name="PathTextLabel" type="Label" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 + +[node name="IDLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "ID:" + +[node name="IDTextLabel" type="Label" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 + +[node name="NameLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Name" + +[node name="NameTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 +focus_next = NodePath("../DescriptionTextEdit") +focus_previous = NodePath("../MobImageDisplay") +placeholder_text = "Scorpion " + +[node name="DescriptionLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Description" + +[node name="DescriptionTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.9 +focus_next = NodePath("../HealthSpinBox") +focus_previous = NodePath("../NameTextEdit") +placeholder_text = "A very dangerous land animal often found in dry climates" +wrap_mode = 1 + +[node name="HealthLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Health" + +[node name="HealthSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +max_value = 1000.0 +value = 100.0 + +[node name="MeleeDamageLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Melee damage" + +[node name="MeleeDamageSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +value = 20.0 + +[node name="MeleeRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Melee range" + +[node name="MeleeRangeSpinbox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The maximum distance it can reach when attacking in melee" +step = 0.5 +value = 1.5 + +[node name="MoveSpeedLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Move speed" + +[node name="MoveSpeedSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The speed at which it moves" +step = 0.1 +value = 1.0 + +[node name="IdleMoveSpeedLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Idle move speed" + +[node name="IdleMoveSpeedSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The speed at which it moves when idle" +step = 0.1 +value = 0.5 + +[node name="SightRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Sight range" + +[node name="SightRangeSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The maximum distance it can visually detect other entities" +max_value = 500.0 +value = 200.0 + +[node name="SenseRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Sense range" + +[node name="SenseRangeSpinbox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The maximum distance at which it can detect entities with senses other then sight and hearing" +value = 50.0 + +[node name="HearingRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +text = "Hearing range" + +[node name="HearingRangeSpinbox" type="SpinBox" parent="VBoxContainer/FormGrid"] +layout_mode = 2 +tooltip_text = "The maximum distance at which it can detect entities trough hearing" +max_value = 5000.0 +value = 1000.0 + +[node name="Sprite_selector" parent="." node_paths=PackedStringArray("spriteList") instance=ExtResource("3_qb68r")] +visible = false +spriteList = NodePath("") diff --git a/Scripts/ItemEditor.gd b/Scripts/ItemEditor.gd new file mode 100644 index 00000000..95ea0b33 --- /dev/null +++ b/Scripts/ItemEditor.gd @@ -0,0 +1,98 @@ +extends Control + +#This scene is intended to be used inside the content editor +#It is supposed to edit exactly one item (friend and foe) +#It expects to save the data to a JSON file that contains all data from a mod +#To load data, provide the name of the item data file and an ID + +@export var itemImageDisplay: TextureRect = null +@export var IDTextLabel: Label = null +@export var PathTextLabel: Label = null +@export var NameTextEdit: TextEdit = null +@export var DescriptionTextEdit: TextEdit = null +@export var itemSelector: Popup = null +@export var melee_damage_numedit: SpinBox +@export var melee_range_numedit: SpinBox +@export var health_numedit: SpinBox +@export var moveSpeed_numedit: SpinBox +@export var idle_move_speed_numedit: SpinBox +@export var sightRange_numedit: SpinBox +@export var senseRange_numedit: SpinBox +@export var hearingRange_numedit: SpinBox +# This signal will be emitted when the user presses the save button +# This signal should alert Gamedata that the item data array should be saved to disk +# The content editor has connected this signal to Gamedata already +signal data_changed() + +# The data that represents this item +# The data is selected from the Gamedata.data.items.data array +# based on the ID that the user has selected in the content editor +var contentData: Dictionary = {}: + set(value): + contentData = value + load_item_data() + itemSelector.sprites_collection = Gamedata.data.items.sprites + +#This function update the form based on the contentData that has been loaded +func load_item_data() -> void: + if itemImageDisplay != null and contentData.has("sprite"): + itemImageDisplay.texture = Gamedata.data.items.sprites[contentData["sprite"]] + PathTextLabel.text = contentData["sprite"] + if IDTextLabel != null: + IDTextLabel.text = str(contentData["id"]) + if NameTextEdit != null and contentData.has("name"): + NameTextEdit.text = contentData["name"] + if DescriptionTextEdit != null and contentData.has("description"): + DescriptionTextEdit.text = contentData["description"] + if melee_damage_numedit != null and contentData.has("melee_damage"): + melee_damage_numedit.get_line_edit().text = contentData["melee_damage"] + if melee_range_numedit != null and contentData.has("melee_range"): + melee_range_numedit.get_line_edit().text = contentData["melee_range"] + if health_numedit != null and contentData.has("health"): + health_numedit.get_line_edit().text = contentData["health"] + if moveSpeed_numedit != null and contentData.has("move_speed"): + moveSpeed_numedit.get_line_edit().text = contentData["move_speed"] + if idle_move_speed_numedit != null and contentData.has("idle_move_speed"): + idle_move_speed_numedit.get_line_edit().text = contentData["idle_move_speed"] + if sightRange_numedit != null and contentData.has("sight_range"): + sightRange_numedit.get_line_edit().text = contentData["sight_range"] + if senseRange_numedit != null and contentData.has("sense_range"): + senseRange_numedit.get_line_edit().text = contentData["sense_range"] + if hearingRange_numedit != null and contentData.has("hearing_range"): + hearingRange_numedit.get_line_edit().text = contentData["hearing_range"] + + +#The editor is closed, destroy the instance +#TODO: Check for unsaved changes +func _on_close_button_button_up() -> void: + queue_free() + +# This function takes all data fro the form elements stores them in the contentData +# Since contentData is a reference to an item in Gamedata.data.items.data +# the central array for itemdata is updated with the changes as well +# The function will signal to Gamedata that the data has changed and needs to be saved +func _on_save_button_button_up() -> void: + contentData["sprite"] = PathTextLabel.text + contentData["name"] = NameTextEdit.text + contentData["description"] = DescriptionTextEdit.text + contentData["melee_damage"] = melee_damage_numedit.get_line_edit().text + contentData["melee_range"] = melee_range_numedit.get_line_edit().text + contentData["health"] = health_numedit.get_line_edit().text + contentData["move_speed"] = moveSpeed_numedit.get_line_edit().text + contentData["idle_move_speed"] = idle_move_speed_numedit.get_line_edit().text + contentData["sight_range"] = sightRange_numedit.get_line_edit().text + contentData["sense_range"] = senseRange_numedit.get_line_edit().text + contentData["hearing_range"] = hearingRange_numedit.get_line_edit().text + data_changed.emit() + +#When the itemImageDisplay is clicked, the user will be prompted to select an image from +# "res://Mods/Core/items/". The texture of the itemImageDisplay will change to the selected image +func _on_item_image_display_gui_input(event) -> void: + if event is InputEventMouseButton and event.pressed: + itemSelector.show() + + +func _on_sprite_selector_sprite_selected_ok(clicked_sprite) -> void: + var itemTexture: Resource = clicked_sprite.get_texture() + itemImageDisplay.texture = itemTexture + PathTextLabel.text = itemTexture.resource_path.get_file() From 6b4a6ca79b7b480ec5da14b9789a19f5d8fa5f69 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 21 Jan 2024 13:23:01 +0100 Subject: [PATCH 109/138] First item created --- Mods/Core/Items/Items.json | 8 ++ .../Custom_Editors/ItemEditor/ItemEditor.tscn | 121 +++++------------- .../ContentManager/Scripts/contenteditor.gd | 4 + Scenes/ContentManager/contenteditor.tscn | 4 +- Scripts/ItemEditor.gd | 40 ++---- Scripts/gamedata.gd | 3 + 6 files changed, 55 insertions(+), 125 deletions(-) create mode 100644 Mods/Core/Items/Items.json diff --git a/Mods/Core/Items/Items.json b/Mods/Core/Items/Items.json new file mode 100644 index 00000000..4523675c --- /dev/null +++ b/Mods/Core/Items/Items.json @@ -0,0 +1,8 @@ +[ + { + "description": "A wooden plank that could be used for all kinds of crafting and construction", + "id": "plank_2x4", + "name": "Plank 2x4", + "sprite": "plank.png" + } +] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn index dfe609ce..2a178935 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn @@ -4,7 +4,7 @@ [ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_ghd7c"] [ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="3_qb68r"] -[node name="ItemEditor" type="Control"] +[node name="ItemEditor" type="Control" node_paths=PackedStringArray("itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -12,6 +12,12 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_ef3j7") +itemImageDisplay = NodePath("VBoxContainer/TabContainer/Basic/ItemImageDisplay") +IDTextLabel = NodePath("VBoxContainer/TabContainer/Basic/IDTextLabel") +PathTextLabel = NodePath("VBoxContainer/TabContainer/Basic/PathTextLabel") +NameTextEdit = NodePath("VBoxContainer/TabContainer/Basic/NameTextEdit") +DescriptionTextEdit = NodePath("VBoxContainer/TabContainer/Basic/DescriptionTextEdit") +itemSelector = NodePath("Sprite_selector") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -32,16 +38,20 @@ text = "Close" layout_mode = 2 text = "Save" -[node name="FormGrid" type="GridContainer" parent="VBoxContainer"] +[node name="TabContainer" type="TabContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Basic" type="GridContainer" parent="VBoxContainer/TabContainer"] layout_mode = 2 size_flags_vertical = 3 columns = 2 -[node name="ImageLabel" type="Label" parent="VBoxContainer/FormGrid"] +[node name="ImageLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 text = "Sprite:" -[node name="MobImageDisplay" type="TextureRect" parent="VBoxContainer/FormGrid"] +[node name="ItemImageDisplay" type="TextureRect" parent="VBoxContainer/TabContainer/Basic"] custom_minimum_size = Vector2(128, 128) layout_mode = 2 size_flags_horizontal = 0 @@ -49,129 +59,56 @@ size_flags_stretch_ratio = 0.4 texture = ExtResource("2_ghd7c") expand_mode = 3 -[node name="PathLabel" type="Label" parent="VBoxContainer/FormGrid"] +[node name="PathLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 text = "Sprite name" -[node name="PathTextLabel" type="Label" parent="VBoxContainer/FormGrid"] +[node name="PathTextLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] custom_minimum_size = Vector2(0, 30) layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.1 -[node name="IDLabel" type="Label" parent="VBoxContainer/FormGrid"] +[node name="IDLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 text = "ID:" -[node name="IDTextLabel" type="Label" parent="VBoxContainer/FormGrid"] +[node name="IDTextLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] custom_minimum_size = Vector2(0, 30) layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.1 -[node name="NameLabel" type="Label" parent="VBoxContainer/FormGrid"] +[node name="NameLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 text = "Name" -[node name="NameTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +[node name="NameTextEdit" type="TextEdit" parent="VBoxContainer/TabContainer/Basic"] custom_minimum_size = Vector2(0, 30) layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.1 focus_next = NodePath("../DescriptionTextEdit") -focus_previous = NodePath("../MobImageDisplay") +focus_previous = NodePath("../ItemImageDisplay") placeholder_text = "Scorpion " -[node name="DescriptionLabel" type="Label" parent="VBoxContainer/FormGrid"] +[node name="DescriptionLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 text = "Description" -[node name="DescriptionTextEdit" type="TextEdit" parent="VBoxContainer/FormGrid"] +[node name="DescriptionTextEdit" type="TextEdit" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 size_flags_stretch_ratio = 0.9 -focus_next = NodePath("../HealthSpinBox") focus_previous = NodePath("../NameTextEdit") placeholder_text = "A very dangerous land animal often found in dry climates" wrap_mode = 1 -[node name="HealthLabel" type="Label" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -text = "Health" - -[node name="HealthSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -max_value = 1000.0 -value = 100.0 - -[node name="MeleeDamageLabel" type="Label" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -text = "Melee damage" - -[node name="MeleeDamageSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -value = 20.0 - -[node name="MeleeRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -text = "Melee range" - -[node name="MeleeRangeSpinbox" type="SpinBox" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -tooltip_text = "The maximum distance it can reach when attacking in melee" -step = 0.5 -value = 1.5 - -[node name="MoveSpeedLabel" type="Label" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -text = "Move speed" - -[node name="MoveSpeedSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -tooltip_text = "The speed at which it moves" -step = 0.1 -value = 1.0 - -[node name="IdleMoveSpeedLabel" type="Label" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -text = "Idle move speed" - -[node name="IdleMoveSpeedSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -tooltip_text = "The speed at which it moves when idle" -step = 0.1 -value = 0.5 - -[node name="SightRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -text = "Sight range" - -[node name="SightRangeSpinBox" type="SpinBox" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -tooltip_text = "The maximum distance it can visually detect other entities" -max_value = 500.0 -value = 200.0 - -[node name="SenseRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -text = "Sense range" - -[node name="SenseRangeSpinbox" type="SpinBox" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -tooltip_text = "The maximum distance at which it can detect entities with senses other then sight and hearing" -value = 50.0 - -[node name="HearingRangeLabel" type="Label" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -text = "Hearing range" - -[node name="HearingRangeSpinbox" type="SpinBox" parent="VBoxContainer/FormGrid"] -layout_mode = 2 -tooltip_text = "The maximum distance at which it can detect entities trough hearing" -max_value = 5000.0 -value = 1000.0 - -[node name="Sprite_selector" parent="." node_paths=PackedStringArray("spriteList") instance=ExtResource("3_qb68r")] +[node name="Sprite_selector" parent="." instance=ExtResource("3_qb68r")] visible = false -spriteList = NodePath("") + +[connection signal="button_up" from="VBoxContainer/HBoxContainer/CloseButton" to="." method="_on_close_button_button_up"] +[connection signal="button_up" from="VBoxContainer/HBoxContainer/SaveButton" to="." method="_on_save_button_button_up"] +[connection signal="gui_input" from="VBoxContainer/TabContainer/Basic/ItemImageDisplay" to="." method="_on_item_image_display_gui_input"] +[connection signal="sprite_selected_ok" from="Sprite_selector" to="." method="_on_sprite_selector_sprite_selected_ok"] diff --git a/Scenes/ContentManager/Scripts/contenteditor.gd b/Scenes/ContentManager/Scripts/contenteditor.gd index 48d17c88..f76cbbc2 100644 --- a/Scenes/ContentManager/Scripts/contenteditor.gd +++ b/Scenes/ContentManager/Scripts/contenteditor.gd @@ -5,6 +5,7 @@ extends Control @export var tacticalmapEditor: PackedScene = null @export var terrainTileEditor: PackedScene = null @export var furnitureEditor: PackedScene = null +@export var itemEditor: PackedScene = null @export var mobEditor: PackedScene = null @export var content: VBoxContainer = null @export var tabContainer: TabContainer = null @@ -15,6 +16,7 @@ var selectedMod: String = "Core" func _ready(): load_content_list(Gamedata.data.tacticalmaps, "Tactical Maps") load_content_list(Gamedata.data.maps, "Maps") + load_content_list(Gamedata.data.items, "Items") load_content_list(Gamedata.data.tiles, "Terrain Tiles") load_content_list(Gamedata.data.mobs, "Mobs") load_content_list(Gamedata.data.furniture, "Furniture") @@ -48,6 +50,8 @@ func _on_content_item_activated(data: Dictionary, itemID: String): instantiate_editor(data, itemID, terrainTileEditor) if data == Gamedata.data.furniture: instantiate_editor(data, itemID, furnitureEditor) + if data == Gamedata.data.items: + instantiate_editor(data, itemID, itemEditor) if data == Gamedata.data.mobs: instantiate_editor(data, itemID, mobEditor) if data == Gamedata.data.maps: diff --git a/Scenes/ContentManager/contenteditor.tscn b/Scenes/ContentManager/contenteditor.tscn index f01e7445..825815b5 100644 --- a/Scenes/ContentManager/contenteditor.tscn +++ b/Scenes/ContentManager/contenteditor.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://480xqusluqrk"] +[gd_scene load_steps=9 format=3 uid="uid://480xqusluqrk"] [ext_resource type="Script" path="res://Scenes/ContentManager/Scripts/contenteditor.gd" id="1_65sl4"] [ext_resource type="PackedScene" uid="uid://bhh0v7x4fjsgi" path="res://Scenes/ContentManager/content_list.tscn" id="2_4f21i"] @@ -7,6 +7,7 @@ [ext_resource type="PackedScene" uid="uid://vfj2if40vf10" path="res://Scenes/ContentManager/Custom_Editors/TerrainTileEditor.tscn" id="4_5nnw0"] [ext_resource type="PackedScene" uid="uid://drby7yfu8t38e" path="res://Scenes/ContentManager/Custom_Editors/MobEditor.tscn" id="5_86se2"] [ext_resource type="PackedScene" uid="uid://cng4m3os6smj8" path="res://Scenes/ContentManager/Custom_Editors/FurnitureEditor.tscn" id="5_r1dle"] +[ext_resource type="PackedScene" uid="uid://dmpomdwta1pgq" path="res://Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn" id="7_i5608"] [node name="contenteditor" type="Control" node_paths=PackedStringArray("content", "tabContainer")] layout_mode = 3 @@ -21,6 +22,7 @@ mapEditor = ExtResource("3_q062s") tacticalmapEditor = ExtResource("4_5du0w") terrainTileEditor = ExtResource("4_5nnw0") furnitureEditor = ExtResource("5_r1dle") +itemEditor = ExtResource("7_i5608") mobEditor = ExtResource("5_86se2") content = NodePath("HSplitContainer/ContentLists/TabContainer2/Content") tabContainer = NodePath("HSplitContainer/TabContainer") diff --git a/Scripts/ItemEditor.gd b/Scripts/ItemEditor.gd index 95ea0b33..9506518e 100644 --- a/Scripts/ItemEditor.gd +++ b/Scripts/ItemEditor.gd @@ -5,20 +5,20 @@ extends Control #It expects to save the data to a JSON file that contains all data from a mod #To load data, provide the name of the item data file and an ID +# Used to open the sprite selector popup @export var itemImageDisplay: TextureRect = null @export var IDTextLabel: Label = null + +# To show the name of the sprite @export var PathTextLabel: Label = null + +# Name and description of the item @export var NameTextEdit: TextEdit = null @export var DescriptionTextEdit: TextEdit = null + +#The actual sprite selector popup @export var itemSelector: Popup = null -@export var melee_damage_numedit: SpinBox -@export var melee_range_numedit: SpinBox -@export var health_numedit: SpinBox -@export var moveSpeed_numedit: SpinBox -@export var idle_move_speed_numedit: SpinBox -@export var sightRange_numedit: SpinBox -@export var senseRange_numedit: SpinBox -@export var hearingRange_numedit: SpinBox + # This signal will be emitted when the user presses the save button # This signal should alert Gamedata that the item data array should be saved to disk # The content editor has connected this signal to Gamedata already @@ -44,22 +44,6 @@ func load_item_data() -> void: NameTextEdit.text = contentData["name"] if DescriptionTextEdit != null and contentData.has("description"): DescriptionTextEdit.text = contentData["description"] - if melee_damage_numedit != null and contentData.has("melee_damage"): - melee_damage_numedit.get_line_edit().text = contentData["melee_damage"] - if melee_range_numedit != null and contentData.has("melee_range"): - melee_range_numedit.get_line_edit().text = contentData["melee_range"] - if health_numedit != null and contentData.has("health"): - health_numedit.get_line_edit().text = contentData["health"] - if moveSpeed_numedit != null and contentData.has("move_speed"): - moveSpeed_numedit.get_line_edit().text = contentData["move_speed"] - if idle_move_speed_numedit != null and contentData.has("idle_move_speed"): - idle_move_speed_numedit.get_line_edit().text = contentData["idle_move_speed"] - if sightRange_numedit != null and contentData.has("sight_range"): - sightRange_numedit.get_line_edit().text = contentData["sight_range"] - if senseRange_numedit != null and contentData.has("sense_range"): - senseRange_numedit.get_line_edit().text = contentData["sense_range"] - if hearingRange_numedit != null and contentData.has("hearing_range"): - hearingRange_numedit.get_line_edit().text = contentData["hearing_range"] #The editor is closed, destroy the instance @@ -75,14 +59,6 @@ func _on_save_button_button_up() -> void: contentData["sprite"] = PathTextLabel.text contentData["name"] = NameTextEdit.text contentData["description"] = DescriptionTextEdit.text - contentData["melee_damage"] = melee_damage_numedit.get_line_edit().text - contentData["melee_range"] = melee_range_numedit.get_line_edit().text - contentData["health"] = health_numedit.get_line_edit().text - contentData["move_speed"] = moveSpeed_numedit.get_line_edit().text - contentData["idle_move_speed"] = idle_move_speed_numedit.get_line_edit().text - contentData["sight_range"] = sightRange_numedit.get_line_edit().text - contentData["sense_range"] = senseRange_numedit.get_line_edit().text - contentData["hearing_range"] = hearingRange_numedit.get_line_edit().text data_changed.emit() #When the itemImageDisplay is clicked, the user will be prompted to select an image from diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index b0dda3d8..f0e4edac 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -16,10 +16,13 @@ func _ready(): data.maps = {} data.tacticalmaps = {} data.furniture = {} + data.items = {} data.tiles.dataPath = "./Mods/Core/Tiles/Tiles.json" data.tiles.spritePath = "./Mods/Core/Tiles/" data.mobs.dataPath = "./Mods/Core/Mobs/Mobs.json" data.mobs.spritePath = "./Mods/Core/Mobs/" + data.items.dataPath = "./Mods/Core/Items/Items.json" + data.items.spritePath = "./Mods/Core/Items/" data.furniture.spritePath = "./Mods/Core/Furniture/" data.furniture.dataPath = "./Mods/Core/Furniture/Furniture.json" data.overmaptiles.spritePath = "./Mods/Core/OvermapTiles/" From 4d816d056df4b9cb97b86596878e65728056922f Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 21 Jan 2024 13:45:49 +0100 Subject: [PATCH 110/138] Add height width stack properties --- Mods/Core/Items/Items.json | 6 +- .../Custom_Editors/ItemEditor/ItemEditor.tscn | 85 ++++++++++++++++++- Scripts/ItemEditor.gd | 19 ++++- 3 files changed, 107 insertions(+), 3 deletions(-) diff --git a/Mods/Core/Items/Items.json b/Mods/Core/Items/Items.json index 4523675c..6ddba2bb 100644 --- a/Mods/Core/Items/Items.json +++ b/Mods/Core/Items/Items.json @@ -1,8 +1,12 @@ [ { "description": "A wooden plank that could be used for all kinds of crafting and construction", + "height": "2", "id": "plank_2x4", + "max_stack_size": "3", "name": "Plank 2x4", - "sprite": "plank.png" + "sprite": "plank.png", + "stack_size": "3", + "width": "4" } ] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn index 2a178935..92cfa3b6 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn @@ -4,7 +4,7 @@ [ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_ghd7c"] [ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="3_qb68r"] -[node name="ItemEditor" type="Control" node_paths=PackedStringArray("itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector")] +[node name="ItemEditor" type="Control" node_paths=PackedStringArray("itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector", "WidthNumberBox", "HeightNumberBox", "StackSizeNumberBox", "MaxStackSizeNumberBox")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -18,6 +18,10 @@ PathTextLabel = NodePath("VBoxContainer/TabContainer/Basic/PathTextLabel") NameTextEdit = NodePath("VBoxContainer/TabContainer/Basic/NameTextEdit") DescriptionTextEdit = NodePath("VBoxContainer/TabContainer/Basic/DescriptionTextEdit") itemSelector = NodePath("Sprite_selector") +WidthNumberBox = NodePath("VBoxContainer/TabContainer/Basic/WidthNumber") +HeightNumberBox = NodePath("VBoxContainer/TabContainer/Basic/HeightNumber") +StackSizeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/StackSizeNumber") +MaxStackSizeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/MaxStackSizeNumber") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -105,6 +109,85 @@ focus_previous = NodePath("../NameTextEdit") placeholder_text = "A very dangerous land animal often found in dry climates" wrap_mode = 1 +[node name="WidthLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +text = "Width" + +[node name="WidthNumber" type="SpinBox" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +tooltip_text = "The width of this item in the inventory. A larger number means it will take up more horizontal inventory slots" +min_value = 1.0 +max_value = 8.0 +value = 1.0 + +[node name="HeightLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +text = "Height" + +[node name="HeightNumber" type="SpinBox" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +tooltip_text = "The height of this item in the inventory. A larger number means it will take up more vertical inventory slots" +min_value = 1.0 +max_value = 8.0 +value = 1.0 + +[node name="StackSizeLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +text = "Stack size" + +[node name="StackSizeNumber" type="SpinBox" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +tooltip_text = "The amount of this item that will spawn in a stack by default" +min_value = 1.0 +max_value = 8.0 +value = 1.0 + +[node name="MaxStackSizeLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +text = "Max stack size" + +[node name="MaxStackSizeNumber" type="SpinBox" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +tooltip_text = "The maximum number of this item that will fit in a stack" +min_value = 1.0 +max_value = 8.0 +value = 1.0 + +[node name="TypesLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +text = "Type(s)" + +[node name="TypesContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 + +[node name="RangedWeaponCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +text = "Ranged" + +[node name="MeleeCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +text = "Melee" + +[node name="MedicalCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +text = "Medical" + +[node name="MagazineCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +text = "Magazine" + +[node name="AmmunitionCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +text = "Ammo" + +[node name="BookCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +text = "Book" + +[node name="CraftableCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +text = "Craftable" + [node name="Sprite_selector" parent="." instance=ExtResource("3_qb68r")] visible = false diff --git a/Scripts/ItemEditor.gd b/Scripts/ItemEditor.gd index 9506518e..a99799e1 100644 --- a/Scripts/ItemEditor.gd +++ b/Scripts/ItemEditor.gd @@ -19,6 +19,12 @@ extends Control #The actual sprite selector popup @export var itemSelector: Popup = null +# Inventory propeties +@export var WidthNumberBox: SpinBox = null +@export var HeightNumberBox: SpinBox = null +@export var StackSizeNumberBox: SpinBox = null +@export var MaxStackSizeNumberBox: SpinBox = null + # This signal will be emitted when the user presses the save button # This signal should alert Gamedata that the item data array should be saved to disk # The content editor has connected this signal to Gamedata already @@ -44,7 +50,14 @@ func load_item_data() -> void: NameTextEdit.text = contentData["name"] if DescriptionTextEdit != null and contentData.has("description"): DescriptionTextEdit.text = contentData["description"] - + if WidthNumberBox != null and contentData.has("width"): + WidthNumberBox.get_line_edit().text = contentData["width"] + if HeightNumberBox != null and contentData.has("height"): + HeightNumberBox.get_line_edit().text = contentData["height"] + if StackSizeNumberBox != null and contentData.has("stack_size"): + StackSizeNumberBox.get_line_edit().text = contentData["stack_size"] + if MaxStackSizeNumberBox != null and contentData.has("max_stack_size"): + MaxStackSizeNumberBox.get_line_edit().text = contentData["max_stack_size"] #The editor is closed, destroy the instance #TODO: Check for unsaved changes @@ -59,6 +72,10 @@ func _on_save_button_button_up() -> void: contentData["sprite"] = PathTextLabel.text contentData["name"] = NameTextEdit.text contentData["description"] = DescriptionTextEdit.text + contentData["width"] = WidthNumberBox.get_line_edit().text + contentData["height"] = HeightNumberBox.get_line_edit().text + contentData["stack_size"] = StackSizeNumberBox.get_line_edit().text + contentData["max_stack_size"] = MaxStackSizeNumberBox.get_line_edit().text data_changed.emit() #When the itemImageDisplay is clicked, the user will be prompted to select an image from From 657e978418fba47386394e3581b8d9443c59054a Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 21 Jan 2024 15:22:08 +0100 Subject: [PATCH 111/138] Add current items --- Mods/Core/Items/Items.json | 34 +++++++++++++++++++ .../Custom_Editors/ItemEditor/ItemEditor.tscn | 31 ++++++++++++++--- Scripts/ItemEditor.gd | 4 +++ 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/Mods/Core/Items/Items.json b/Mods/Core/Items/Items.json index 6ddba2bb..21ea1e00 100644 --- a/Mods/Core/Items/Items.json +++ b/Mods/Core/Items/Items.json @@ -7,6 +7,40 @@ "name": "Plank 2x4", "sprite": "plank.png", "stack_size": "3", + "weight": "2", "width": "4" + }, + { + "description": "Some metal bits and pieces. Useful for something, right?", + "height": "2", + "id": "steel_scrap", + "max_stack_size": "100", + "name": "Steel scrap", + "sprite": "steel_scrap.png", + "stack_size": "2", + "weight": "0.25", + "width": "2" + }, + { + "description": "Standard type of ammunition. Very common.", + "height": "1", + "id": "bullet_9mm", + "max_stack_size": "100", + "name": "9mm bullet", + "sprite": "9mm.png", + "stack_size": "20", + "weight": "0.01", + "width": "1" + }, + { + "description": "In order for your pistol to fire a bullet, it needs to have a magazine loaded with bullets", + "height": "1", + "id": "pistol_magazine", + "max_stack_size": "1", + "name": "Pistol magazine", + "sprite": "pistol_magazine.png", + "stack_size": "1", + "weight": "0.25", + "width": "1" } ] \ No newline at end of file diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn index 92cfa3b6..0940519f 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn @@ -4,7 +4,7 @@ [ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_ghd7c"] [ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="3_qb68r"] -[node name="ItemEditor" type="Control" node_paths=PackedStringArray("itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector", "WidthNumberBox", "HeightNumberBox", "StackSizeNumberBox", "MaxStackSizeNumberBox")] +[node name="ItemEditor" type="Control" node_paths=PackedStringArray("itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector", "WidthNumberBox", "HeightNumberBox", "WeightNumberBox", "StackSizeNumberBox", "MaxStackSizeNumberBox")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -20,6 +20,7 @@ DescriptionTextEdit = NodePath("VBoxContainer/TabContainer/Basic/DescriptionText itemSelector = NodePath("Sprite_selector") WidthNumberBox = NodePath("VBoxContainer/TabContainer/Basic/WidthNumber") HeightNumberBox = NodePath("VBoxContainer/TabContainer/Basic/HeightNumber") +WeightNumberBox = NodePath("VBoxContainer/TabContainer/Basic/WeightNumber") StackSizeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/StackSizeNumber") MaxStackSizeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/MaxStackSizeNumber") @@ -131,6 +132,18 @@ min_value = 1.0 max_value = 8.0 value = 1.0 +[node name="WeightLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +text = "Weight" + +[node name="WeightNumber" type="SpinBox" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +tooltip_text = "The weight of this item in kg" +min_value = 0.01 +max_value = 500.0 +step = 0.01 +value = 1.0 + [node name="StackSizeLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 text = "Stack size" @@ -139,7 +152,6 @@ text = "Stack size" layout_mode = 2 tooltip_text = "The amount of this item that will spawn in a stack by default" min_value = 1.0 -max_value = 8.0 value = 1.0 [node name="MaxStackSizeLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] @@ -150,7 +162,6 @@ text = "Max stack size" layout_mode = 2 tooltip_text = "The maximum number of this item that will fit in a stack" min_value = 1.0 -max_value = 8.0 value = 1.0 [node name="TypesLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] @@ -162,31 +173,43 @@ layout_mode = 2 [node name="RangedWeaponCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] layout_mode = 2 +tooltip_text = "If this is checked, the item functions as a ranged weapon and the ranged properties tab will be visible. Otherwise, this item will not function as a ranged weapon and the ranged properties tab will not be visible" text = "Ranged" [node name="MeleeCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] layout_mode = 2 +tooltip_text = "If this is checked, the item functions as a melee weapon and the melee properties tab will be visible. Otherwise, this item will not function as a melee weapon and the melee properties tab will not be visible" text = "Melee" [node name="MedicalCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] layout_mode = 2 +tooltip_text = "If this is checked, the item functions as a medical item, for example to be used for healing and the medical properties tab will be visible. Otherwise, this item will not function as a medical item and the medical properties tab will not be visible" text = "Medical" [node name="MagazineCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] layout_mode = 2 +tooltip_text = "If this is checked, the item functions as a magazine for a gun or tool and the magazine properties tab will be visible. Otherwise, this item will not function as a magazine and the magazine properties tab will not be visible" text = "Magazine" [node name="AmmunitionCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] layout_mode = 2 +tooltip_text = "If this is checked, the item functions as ammo for a magazine and the ammo properties tab will be visible. Otherwise, this item will not function as ammo and the ammo properties tab will not be visible" text = "Ammo" [node name="BookCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] layout_mode = 2 +tooltip_text = "If this is checked, the item functions as a book and the book properties tab will be visible. Otherwise, this item will not function as a book and the book properties tab will not be visible" text = "Book" [node name="CraftableCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] layout_mode = 2 -text = "Craftable" +tooltip_text = "If this is checked, the item can be crafted and recipe tab will be visible. Otherwise, this item cannot be crafted and the recipe tab will not be visible" +text = "Craft" + +[node name="DisassembleCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +tooltip_text = "If this is checked, the item can be disassembled and disassembly tab will be visible. Otherwise, this item cannot be disassembled and the disassembly tab will not be visible" +text = "Disassemble" [node name="Sprite_selector" parent="." instance=ExtResource("3_qb68r")] visible = false diff --git a/Scripts/ItemEditor.gd b/Scripts/ItemEditor.gd index a99799e1..da556f8a 100644 --- a/Scripts/ItemEditor.gd +++ b/Scripts/ItemEditor.gd @@ -22,6 +22,7 @@ extends Control # Inventory propeties @export var WidthNumberBox: SpinBox = null @export var HeightNumberBox: SpinBox = null +@export var WeightNumberBox: SpinBox = null @export var StackSizeNumberBox: SpinBox = null @export var MaxStackSizeNumberBox: SpinBox = null @@ -54,6 +55,8 @@ func load_item_data() -> void: WidthNumberBox.get_line_edit().text = contentData["width"] if HeightNumberBox != null and contentData.has("height"): HeightNumberBox.get_line_edit().text = contentData["height"] + if WeightNumberBox != null and contentData.has("weight"): + WeightNumberBox.get_line_edit().text = contentData["weight"] if StackSizeNumberBox != null and contentData.has("stack_size"): StackSizeNumberBox.get_line_edit().text = contentData["stack_size"] if MaxStackSizeNumberBox != null and contentData.has("max_stack_size"): @@ -74,6 +77,7 @@ func _on_save_button_button_up() -> void: contentData["description"] = DescriptionTextEdit.text contentData["width"] = WidthNumberBox.get_line_edit().text contentData["height"] = HeightNumberBox.get_line_edit().text + contentData["weight"] = WeightNumberBox.get_line_edit().text contentData["stack_size"] = StackSizeNumberBox.get_line_edit().text contentData["max_stack_size"] = MaxStackSizeNumberBox.get_line_edit().text data_changed.emit() From 53c2a9b0eb522434a975475717d4ec04f289831f Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 21 Jan 2024 21:33:33 +0100 Subject: [PATCH 112/138] Items are loaded from json data --- ItemProtosets.tres | 110 +++++++++++++++++-------------------- Mods/Core/Items/Items.json | 7 ++- Scripts/ItemEditor.gd | 2 + Scripts/container.gd | 8 +-- Scripts/gamedata.gd | 21 +++++++ Scripts/hud.gd | 2 - hud.tscn | 1 + 7 files changed, 81 insertions(+), 70 deletions(-) diff --git a/ItemProtosets.tres b/ItemProtosets.tres index 079ccf6f..359c581a 100644 --- a/ItemProtosets.tres +++ b/ItemProtosets.tres @@ -5,65 +5,53 @@ [resource] script = ExtResource("1_o35lu") json_data = "[ - { - \"name\": \"Steel scrap\", - \"assigned_id\": 0, - \"id\": \"steel_scrap\", - \"height\": 2, - \"width\": 2, - \"weight\": 0.25, - \"stack_size\": 2, - \"description\": \"Test steel scrap test\", - \"image\": \"res://Textures/steel_scrap.png\", - \"flags\": [] - }, - { - \"name\": \"Plank\", - \"assigned_id\": 0, - \"id\": \"plank\", - \"height\": 2, - \"width\": 4, - \"weight\": 2, - \"stack_size\": 3, - \"max_stack_size\": 3, - \"description\": \"Test plank test\", - \"image\": \"res://Textures/plank.png\", - \"flags\": [] - }, - { - \"name\": \"Bullet: 9mm\", - \"assigned_id\": 0, - \"id\": \"9mm\", - \"height\": 1, - \"width\": 1, - \"weight\": 0.01, - \"stack_size\": 100, - \"description\": \"Test 9mm test\", - \"image\": \"res://Textures/9mm.png\", - \"flags\": [\"ammunition\"] - }, - { - \"name\": \"Bandages\", - \"assigned_id\": 0, - \"id\": \"bandages\", - \"height\": 1, - \"width\": 1, - \"weight\": 0.05, - \"stack_size\": 1, - \"max_stack_size\": 20, - \"description\": \"Basic bandages for stopping bleeding.\", - \"flags\": [\"healing\"] - }, - { - \"name\": \"Pistol magazine\", - \"assigned_id\": 0, - \"id\": \"pistol_magazine\", - \"height\": 1, - \"width\": 1, - \"weight\": 0.25, - \"description\": \"Test pistol magazine test\", - \"image\": \"res://Textures/pistol_magazine.png\", - \"current_ammo\": 0, - \"flags\": [\"magazine\"] - } + { + \"description\": \"A wooden plank that could be used for all kinds of crafting and construction\", + \"height\": \"2\", + \"iamge\": \"res://Textures/plank.png\", + \"id\": \"plank_2x4\", + \"image\": \"./Mods/Core/Items/plank.png\", + \"max_stack_size\": \"3\", + \"name\": \"Plank 2x4\", + \"sprite\": \"plank.png\", + \"stack_size\": \"3\", + \"weight\": \"2\", + \"width\": \"4\" + }, + { + \"description\": \"Some metal bits and pieces. Useful for something, right?\", + \"height\": \"2\", + \"id\": \"steel_scrap\", + \"image\": \"./Mods/Core/Items/steel_scrap.png\", + \"max_stack_size\": \"100\", + \"name\": \"Steel scrap\", + \"sprite\": \"steel_scrap.png\", + \"stack_size\": \"2\", + \"weight\": \"0.25\", + \"width\": \"2\" + }, + { + \"description\": \"Standard type of ammunition. Very common.\", + \"height\": \"1\", + \"id\": \"bullet_9mm\", + \"image\": \"./Mods/Core/Items/9mm.png\", + \"max_stack_size\": \"100\", + \"name\": \"bullet 9mm\", + \"sprite\": \"9mm.png\", + \"stack_size\": \"20\", + \"weight\": \"0.01\", + \"width\": \"1\" + }, + { + \"description\": \"In order for your pistol to fire a bullet, it needs to have a magazine loaded with bullets\", + \"height\": \"1\", + \"id\": \"pistol_magazine\", + \"image\": \"./Mods/Core/Items/pistol_magazine.png\", + \"max_stack_size\": \"1\", + \"name\": \"Pistol magazine\", + \"sprite\": \"pistol_magazine.png\", + \"stack_size\": \"1\", + \"weight\": \"0.25\", + \"width\": \"1\" + } ]" diff --git a/Mods/Core/Items/Items.json b/Mods/Core/Items/Items.json index 21ea1e00..0b691ae2 100644 --- a/Mods/Core/Items/Items.json +++ b/Mods/Core/Items/Items.json @@ -2,7 +2,9 @@ { "description": "A wooden plank that could be used for all kinds of crafting and construction", "height": "2", + "iamge": "res://Textures/plank.png", "id": "plank_2x4", + "image": "./Mods/Core/Items/plank.png", "max_stack_size": "3", "name": "Plank 2x4", "sprite": "plank.png", @@ -14,6 +16,7 @@ "description": "Some metal bits and pieces. Useful for something, right?", "height": "2", "id": "steel_scrap", + "image": "./Mods/Core/Items/steel_scrap.png", "max_stack_size": "100", "name": "Steel scrap", "sprite": "steel_scrap.png", @@ -25,8 +28,9 @@ "description": "Standard type of ammunition. Very common.", "height": "1", "id": "bullet_9mm", + "image": "./Mods/Core/Items/9mm.png", "max_stack_size": "100", - "name": "9mm bullet", + "name": "bullet 9mm", "sprite": "9mm.png", "stack_size": "20", "weight": "0.01", @@ -36,6 +40,7 @@ "description": "In order for your pistol to fire a bullet, it needs to have a magazine loaded with bullets", "height": "1", "id": "pistol_magazine", + "image": "./Mods/Core/Items/pistol_magazine.png", "max_stack_size": "1", "name": "Pistol magazine", "sprite": "pistol_magazine.png", diff --git a/Scripts/ItemEditor.gd b/Scripts/ItemEditor.gd index da556f8a..f2fb3bd8 100644 --- a/Scripts/ItemEditor.gd +++ b/Scripts/ItemEditor.gd @@ -73,6 +73,8 @@ func _on_close_button_button_up() -> void: # The function will signal to Gamedata that the data has changed and needs to be saved func _on_save_button_button_up() -> void: contentData["sprite"] = PathTextLabel.text + # We add this image property only for the itemprotosets of gloot + contentData["image"] = Gamedata.data.items.spritePath + PathTextLabel.text contentData["name"] = NameTextEdit.text contentData["description"] = DescriptionTextEdit.text contentData["width"] = WidthNumberBox.get_line_edit().text diff --git a/Scripts/container.gd b/Scripts/container.gd index 5cfb4a00..9c8301e1 100644 --- a/Scripts/container.gd +++ b/Scripts/container.gd @@ -9,14 +9,10 @@ func _ready(): func create_random_loot(): if get_node(inventory).get_children() == []: - var item = get_node(inventory).create_and_add_item("plank") - item.set_property("assigned_id", ItemManager.assign_id()) - item = get_node(inventory).create_and_add_item("9mm") - item.set_property("assigned_id", ItemManager.assign_id()) + var item = get_node(inventory).create_and_add_item("plank_2x4") + item = get_node(inventory).create_and_add_item("bullet_9mm") item = get_node(inventory).create_and_add_item("pistol_magazine") - item.set_property("assigned_id", ItemManager.assign_id()) item = get_node(inventory).create_and_add_item("steel_scrap") - item.set_property("assigned_id", ItemManager.assign_id()) func get_items(): diff --git a/Scripts/gamedata.gd b/Scripts/gamedata.gd index f0e4edac..2e001648 100644 --- a/Scripts/gamedata.gd +++ b/Scripts/gamedata.gd @@ -33,6 +33,7 @@ func _ready(): load_sprites() load_tile_sprites() load_data() + update_item_protoset_json_data("res://ItemProtosets.tres",JSON.stringify(data.items.data,"\t")) data.maps.data = Helper.json_helper.file_names_in_dir(data.maps.dataPath, ["json"]) data.tacticalmaps.data = Helper.json_helper.file_names_in_dir(\ data.tacticalmaps.dataPath, ["json"]) @@ -180,3 +181,23 @@ func get_sprite_by_id(contentData: Dictionary, id: String) -> Resource: # and binds the appropriate data array so it can be saved in this function func on_data_changed(contentData: Dictionary): save_data_to_file(contentData) + +# This will update the given resource file with the provided json data +# It is intended to save item data from json to the res://ItemProtosets.tres file +# So we can use the item json data in-game +func update_item_protoset_json_data(tres_path: String, new_json_data: String) -> void: + # Load the ItemProtoset resource + var item_protoset = load(tres_path) as ItemProtoset + if not item_protoset: + print("Failed to load ItemProtoset resource from:", tres_path) + return + + # Update the json_data property + item_protoset.json_data = new_json_data + + # Save the resource back to the .tres file + var save_result = ResourceSaver.save(item_protoset, tres_path) + if save_result != OK: + print("Failed to save updated ItemProtoset resource to:", tres_path) + else: + print("ItemProtoset resource updated and saved successfully to:", tres_path) diff --git a/Scripts/hud.gd b/Scripts/hud.gd index de3617e5..26428868 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -73,8 +73,6 @@ func _input(event): # Called when the node enters the scene tree for the first time. func _ready(): - #temporary hack - ItemManager.create_item_protoset(item_protoset) get_node(inventory).deserialize(General.player_inventory_dict) # Called every frame. 'delta' is the elapsed time since the previous frame. diff --git a/hud.tscn b/hud.tscn index ccd75c69..a23dd0c0 100644 --- a/hud.tscn +++ b/hud.tscn @@ -310,6 +310,7 @@ theme_override_constants/outline_size = 4 theme_override_fonts/font = ExtResource("1_pxloi") theme_override_font_sizes/font_size = 13 text = "Item description" +autowrap_mode = 3 [node name="CraftingMenu" type="Panel" parent="." groups=["CraftingMenu"]] visible = false From 3066dbee66c928f7c5f037960e880a93a760009e Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 21 Jan 2024 22:35:31 +0100 Subject: [PATCH 113/138] Basic inventory window --- Scenes/InventoryWindow.tscn | 145 ++++++++++++++++++++++++++++++++++++ Scripts/InventoryWindow.gd | 141 +++++++++++++++++++++++++++++++++++ hud.tscn | 11 ++- 3 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 Scenes/InventoryWindow.tscn create mode 100644 Scripts/InventoryWindow.gd diff --git a/Scenes/InventoryWindow.tscn b/Scenes/InventoryWindow.tscn new file mode 100644 index 00000000..287096ce --- /dev/null +++ b/Scenes/InventoryWindow.tscn @@ -0,0 +1,145 @@ +[gd_scene load_steps=11 format=3 uid="uid://e0ebcv1n8jnq"] + +[ext_resource type="Script" path="res://Scripts/InventoryWindow.gd" id="1_7kqbx"] +[ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="2_alcyo"] +[ext_resource type="Resource" uid="uid://bvrl0obu5ejqq" path="res://ItemProtosets.tres" id="3_sqsc0"] +[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_grid_ex.gd" id="4_8j4xb"] +[ext_resource type="Texture2D" uid="uid://c5tbuxmrli7e4" path="res://Mods/Core/Items/steel_scrap.png" id="4_s2r2r"] +[ext_resource type="Texture2D" uid="uid://cwmsngeoc631h" path="res://Textures/Screenshot_167.png" id="5_wixd1"] +[ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="6_xpf2l"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bcjil"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2f0xd"] + +[sub_resource type="Theme" id="Theme_6v4rg"] +default_font = ExtResource("6_xpf2l") +default_font_size = 13 + +[node name="InventoryWindow" type="Control" node_paths=PackedStringArray("proximity_inventory", "proximity_inventory_control", "inventory_control", "inventory", "tooltip", "tooltip_item_name", "tooltip_item_description")] +layout_mode = 3 +anchors_preset = 0 +offset_top = 150.0 +offset_right = 470.0 +offset_bottom = 670.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource("1_7kqbx") +proximity_inventory = NodePath("InventoryGridStackedProx") +proximity_inventory_control = NodePath("HBoxContainer/Inventories/CtrlInventoryGridExProx") +inventory_control = NodePath("HBoxContainer/Inventories/CtrlInventoryGridEx") +inventory = NodePath("InventoryGridStacked") +tooltip = NodePath("Tooltip") +tooltip_item_name = NodePath("Tooltip/Panel/ItemName") +tooltip_item_description = NodePath("Tooltip/Panel2/Description") + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.129412, 0.14902, 0.180392, 1) + +[node name="InventoryGridStacked" type="Node" parent="."] +script = ExtResource("2_alcyo") +size = Vector2i(12, 8) +item_protoset = ExtResource("3_sqsc0") + +[node name="InventoryGridStackedProx" type="Node" parent="."] +script = ExtResource("2_alcyo") +size = Vector2i(12, 8) +item_protoset = ExtResource("3_sqsc0") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="ContainersList" type="VBoxContainer" parent="HBoxContainer"] +layout_mode = 2 + +[node name="TextureRect" type="TextureRect" parent="HBoxContainer/ContainersList"] +layout_mode = 2 +texture = ExtResource("4_s2r2r") + +[node name="Inventories" type="VBoxContainer" parent="HBoxContainer"] +layout_mode = 2 + +[node name="CtrlInventoryGridExProx" type="Control" parent="HBoxContainer/Inventories"] +custom_minimum_size = Vector2(384, 256) +layout_mode = 2 +size_flags_vertical = 3 +script = ExtResource("4_8j4xb") +field_style = SubResource("StyleBoxFlat_bcjil") +inventory_path = NodePath("../../../InventoryGridStackedProx") +default_item_texture = ExtResource("5_wixd1") + +[node name="CtrlInventoryGridEx" type="Control" parent="HBoxContainer/Inventories"] +custom_minimum_size = Vector2(384, 256) +layout_mode = 2 +size_flags_vertical = 3 +script = ExtResource("4_8j4xb") +field_style = SubResource("StyleBoxFlat_2f0xd") +selection_color = Color(0.745098, 0.745098, 0.745098, 0.941176) +inventory_path = NodePath("../../../InventoryGridStacked") +default_item_texture = ExtResource("5_wixd1") + +[node name="Tooltip" type="Control" parent="."] +visible = false +layout_mode = 3 +anchors_preset = 0 +offset_right = 242.0 +offset_bottom = 115.0 +pivot_offset = Vector2(0, 173) +size_flags_horizontal = 3 +size_flags_vertical = 3 +tooltip_text = "kjkgkjghkjjhkg" + +[node name="Panel" type="Panel" parent="Tooltip"] +layout_mode = 2 +offset_left = 1.0 +offset_top = 1.0 +offset_right = 241.0 +offset_bottom = 33.0 +size_flags_vertical = 3 + +[node name="ItemName" type="Label" parent="Tooltip/Panel"] +layout_mode = 0 +offset_right = 240.0 +offset_bottom = 32.0 +theme_override_colors/font_color = Color(0.921569, 0.596078, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 4 +theme_override_fonts/font = ExtResource("6_xpf2l") +theme_override_font_sizes/font_size = 20 +text = "Item name" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Panel2" type="Panel" parent="Tooltip"] +layout_mode = 2 +offset_left = 1.0 +offset_top = 35.0 +offset_right = 241.0 +offset_bottom = 115.0 +size_flags_vertical = 3 + +[node name="Description" type="Label" parent="Tooltip/Panel2"] +layout_mode = 0 +offset_right = 240.0 +offset_bottom = 32.0 +theme = SubResource("Theme_6v4rg") +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 4 +theme_override_fonts/font = ExtResource("6_xpf2l") +theme_override_font_sizes/font_size = 13 +text = "Item description" +autowrap_mode = 3 + +[connection signal="item_added" from="InventoryGridStacked" to="." method="_on_inventory_grid_stacked_item_added"] +[connection signal="item_mouse_entered" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_entered"] +[connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_exited"] +[connection signal="item_mouse_entered" from="HBoxContainer/Inventories/CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_entered"] +[connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_exited"] diff --git a/Scripts/InventoryWindow.gd b/Scripts/InventoryWindow.gd new file mode 100644 index 00000000..a780282d --- /dev/null +++ b/Scripts/InventoryWindow.gd @@ -0,0 +1,141 @@ +extends Control + +@export var proximity_inventory: InventoryGridStacked +@export var proximity_inventory_control: CtrlInventoryGridEx + +@export var inventory_control : CtrlInventoryGridEx +@export var inventory : InventoryGridStacked + + +@export var tooltip: Control +var is_showing_tooltip = false +@export var tooltip_item_name : Label +@export var tooltip_item_description : Label + + + +func test(): + print("TESTING 123 123!") + + +func _input(event): + if event.is_action_pressed("toggle_inventory"): + inventory_control.visible = !inventory_control.visible + proximity_inventory_control.visible = !proximity_inventory_control.visible + + +# Called when the node enters the scene tree for the first time. +func _ready(): + inventory.deserialize(General.player_inventory_dict) + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta): + if is_showing_tooltip: + tooltip.visible = true + tooltip.global_position = tooltip.get_global_mouse_position() + Vector2(0, -5 - tooltip.size.y) + else: + tooltip.visible = false + +# The parameter items isall the items from the inventory that has entered proximity +func _on_item_detector_add_to_proximity_inventory(items): + var duplicated_items = items + for item in duplicated_items: + var duplicated_item = item.duplicate() + # Store the original inventory + duplicated_item.set_meta("original_parent", item.get_inventory()) + duplicated_item.set_meta("original_item", item) + proximity_inventory.add_child(duplicated_item) + +# The parameter items is all the items from the inventory that has left proximity +func _on_item_detector_remove_from_proximity_inventory(items): + for prox_item in proximity_inventory.get_children(): + for item in items: + if item.get_property("assigned_id") == prox_item.get_property("assigned_id"): + prox_item.queue_free() + +#func _on_player_shooting_ammo_changed(current_ammo, max_ammo): +# get_node(ammo_HUD).text = str(current_ammo) + "/" + str(max_ammo) + + +func _on_inventory_item_mouse_entered(item): + is_showing_tooltip = true + tooltip_item_name.text = str(item.get_property("name", "")) + tooltip_item_description.text = item.get_property("description", "") + +func _on_inventory_item_mouse_exited(_item): + is_showing_tooltip = false + +func check_if_resources_are_available(item_id, amount_to_spend: int): + var inventory_node = inventory + print("checking if we have the item id in inv") + if inventory_node.get_item_by_id(item_id): + print("we have the item id") + var item_total_amount : int = 0 + var current_amount_to_spend = amount_to_spend + var items = inventory_node.get_items_by_id(item_id) + for item in items: + item_total_amount += inventory_node.get_item_stack_size(item) + if item_total_amount >= current_amount_to_spend: + return true + return false + +func try_to_spend_item(item_id, amount_to_spend : int): + var inventory_node = inventory + if inventory_node.get_item_by_id(item_id): + var item_total_amount : int = 0 + var current_amount_to_spend = amount_to_spend + var items = inventory_node.get_items_by_id(item_id) + + for item in items: + item_total_amount += inventory_node.get_item_stack_size(item) + + if item_total_amount >= amount_to_spend: + merge_items_to_total_amount(items, inventory_node, item_total_amount - current_amount_to_spend) + return true + else: + return false + else: + return false + +func merge_items_to_total_amount(items, inventory, total_amount : int): + var current_total_amount = total_amount + for item in items: + if inventory.get_item_stack_size(item) < current_total_amount: + if inventory.get_item_stack_size(item) == item.get_property("max_stack_size"): + current_total_amount -= inventory.get_item_stack_size(item) + elif inventory.get_item_stack_size(item) < item.get_property("max_stack_size"): + current_total_amount -= item.get_property("max_stack_size") - inventory.get_item_stack_size(item) + inventory.set_item_stack_size(item, item.get_property("max_stack_size")) + + elif inventory.get_item_stack_size(item) == current_total_amount: + current_total_amount = 0 + + elif inventory.get_item_stack_size(item) > current_total_amount: + inventory.set_item_stack_size(item, current_total_amount) + current_total_amount = 0 + + if inventory.get_item_stack_size(item) == 0: + inventory.remove_item(item) + +func _on_crafting_menu_start_craft(recipe): + + if recipe: + #first we need to use required resources for the recipe + for required_item in recipe["required_resource"]: + try_to_spend_item(required_item, recipe["required_resource"][required_item]) + + #adding a new item(s) to the inventory based on the recipe + var item + item = inventory.create_and_add_item(recipe["crafts"]) + inventory.set_item_stack_size(item, recipe["craft_amount"]) + + +# When an item is added to the player inventory +# We check where it came from and delete it from that inventory +# This happens when the player moves an item from $CtrlInventoryGridExProx +func _on_inventory_grid_stacked_item_added(item): + if item.has_meta("original_parent"): + var original_parent = item.get_meta("original_parent") + var original_item = item.get_meta("original_item") + if original_parent and original_parent.has_method("remove_item"): + original_parent.remove_item(original_item) # Remove from original parent diff --git a/hud.tscn b/hud.tscn index a23dd0c0..7346b17c 100644 --- a/hud.tscn +++ b/hud.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=24 format=3 uid="uid://clhj525tmme3k"] +[gd_scene load_steps=25 format=3 uid="uid://clhj525tmme3k"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="1_pxloi"] [ext_resource type="Script" path="res://Scripts/hud.gd" id="1_s3xoj"] @@ -19,6 +19,7 @@ [ext_resource type="PackedScene" uid="uid://cpcn3qq8okj12" path="res://item_craft_button.tscn" id="15_otw1a"] [ext_resource type="ButtonGroup" uid="uid://bcjuavqvre6mk" path="res://crafting_recipes_button_group.tres" id="16_2oloe"] [ext_resource type="PackedScene" uid="uid://bgswuol251m3u" path="res://Scenes/Overmap/Overmap.tscn" id="19_oomhy"] +[ext_resource type="PackedScene" uid="uid://e0ebcv1n8jnq" path="res://Scenes/InventoryWindow.tscn" id="20_0l505"] [ext_resource type="PackedScene" uid="uid://ckuh2s0nvwg0x" path="res://Scenes/GameOver.tscn" id="20_jlthm"] [sub_resource type="Theme" id="Theme_xn5t2"] @@ -422,7 +423,13 @@ text = "Required items autowrap_mode = 3 [node name="Overmap" parent="." instance=ExtResource("19_oomhy")] -visible = false + +[node name="InventoryWindow" parent="." instance=ExtResource("20_0l505")] +anchors_preset = 0 +anchor_right = 0.0 +anchor_bottom = 0.0 +grow_horizontal = 1 +grow_vertical = 1 [node name="GameOver" parent="." instance=ExtResource("20_jlthm")] visible = false From d92cb17f3a504c550c3fdd5047aa69a9e30d0419 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 21 Jan 2024 23:04:30 +0100 Subject: [PATCH 114/138] Inventory window basic functionality --- Scenes/InventoryWindow.tscn | 20 +++--- Scripts/InventoryWindow.gd | 47 ++++++------- Scripts/hud.gd | 76 +++++---------------- hud.tscn | 127 ++---------------------------------- 4 files changed, 52 insertions(+), 218 deletions(-) diff --git a/Scenes/InventoryWindow.tscn b/Scenes/InventoryWindow.tscn index 287096ce..575ed69e 100644 --- a/Scenes/InventoryWindow.tscn +++ b/Scenes/InventoryWindow.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://e0ebcv1n8jnq"] +[gd_scene load_steps=9 format=3 uid="uid://e0ebcv1n8jnq"] [ext_resource type="Script" path="res://Scripts/InventoryWindow.gd" id="1_7kqbx"] [ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="2_alcyo"] @@ -8,10 +8,6 @@ [ext_resource type="Texture2D" uid="uid://cwmsngeoc631h" path="res://Textures/Screenshot_167.png" id="5_wixd1"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="6_xpf2l"] -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bcjil"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2f0xd"] - [sub_resource type="Theme" id="Theme_6v4rg"] default_font = ExtResource("6_xpf2l") default_font_size = 13 @@ -20,8 +16,8 @@ default_font_size = 13 layout_mode = 3 anchors_preset = 0 offset_top = 150.0 -offset_right = 470.0 -offset_bottom = 670.0 +offset_right = 462.0 +offset_bottom = 719.0 size_flags_horizontal = 3 size_flags_vertical = 3 script = ExtResource("1_7kqbx") @@ -40,7 +36,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -color = Color(0.129412, 0.14902, 0.180392, 1) +color = Color(0.698039, 0.729412, 0.788235, 1) [node name="InventoryGridStacked" type="Node" parent="."] script = ExtResource("2_alcyo") @@ -72,16 +68,20 @@ custom_minimum_size = Vector2(384, 256) layout_mode = 2 size_flags_vertical = 3 script = ExtResource("4_8j4xb") -field_style = SubResource("StyleBoxFlat_bcjil") +grid_color = Color(0.305882, 0.305882, 0.305882, 1) inventory_path = NodePath("../../../InventoryGridStackedProx") default_item_texture = ExtResource("5_wixd1") +[node name="Label" type="Label" parent="HBoxContainer/Inventories"] +layout_mode = 2 +text = "Player inventory:" + [node name="CtrlInventoryGridEx" type="Control" parent="HBoxContainer/Inventories"] custom_minimum_size = Vector2(384, 256) layout_mode = 2 size_flags_vertical = 3 script = ExtResource("4_8j4xb") -field_style = SubResource("StyleBoxFlat_2f0xd") +grid_color = Color(0.309804, 0.309804, 0.309804, 1) selection_color = Color(0.745098, 0.745098, 0.745098, 0.941176) inventory_path = NodePath("../../../InventoryGridStacked") default_item_texture = ExtResource("5_wixd1") diff --git a/Scripts/InventoryWindow.gd b/Scripts/InventoryWindow.gd index a780282d..698dd195 100644 --- a/Scripts/InventoryWindow.gd +++ b/Scripts/InventoryWindow.gd @@ -14,15 +14,6 @@ var is_showing_tooltip = false -func test(): - print("TESTING 123 123!") - - -func _input(event): - if event.is_action_pressed("toggle_inventory"): - inventory_control.visible = !inventory_control.visible - proximity_inventory_control.visible = !proximity_inventory_control.visible - # Called when the node enters the scene tree for the first time. func _ready(): @@ -53,9 +44,6 @@ func _on_item_detector_remove_from_proximity_inventory(items): if item.get_property("assigned_id") == prox_item.get_property("assigned_id"): prox_item.queue_free() -#func _on_player_shooting_ammo_changed(current_ammo, max_ammo): -# get_node(ammo_HUD).text = str(current_ammo) + "/" + str(max_ammo) - func _on_inventory_item_mouse_entered(item): is_showing_tooltip = true @@ -74,7 +62,7 @@ func check_if_resources_are_available(item_id, amount_to_spend: int): var current_amount_to_spend = amount_to_spend var items = inventory_node.get_items_by_id(item_id) for item in items: - item_total_amount += inventory_node.get_item_stack_size(item) + item_total_amount += InventoryGridStacked.get_item_stack_size(item) if item_total_amount >= current_amount_to_spend: return true return false @@ -87,7 +75,7 @@ func try_to_spend_item(item_id, amount_to_spend : int): var items = inventory_node.get_items_by_id(item_id) for item in items: - item_total_amount += inventory_node.get_item_stack_size(item) + item_total_amount += InventoryGridStacked.get_item_stack_size(item) if item_total_amount >= amount_to_spend: merge_items_to_total_amount(items, inventory_node, item_total_amount - current_amount_to_spend) @@ -97,25 +85,25 @@ func try_to_spend_item(item_id, amount_to_spend : int): else: return false -func merge_items_to_total_amount(items, inventory, total_amount : int): +func merge_items_to_total_amount(items, inventory_node, total_amount : int): var current_total_amount = total_amount for item in items: - if inventory.get_item_stack_size(item) < current_total_amount: - if inventory.get_item_stack_size(item) == item.get_property("max_stack_size"): - current_total_amount -= inventory.get_item_stack_size(item) - elif inventory.get_item_stack_size(item) < item.get_property("max_stack_size"): - current_total_amount -= item.get_property("max_stack_size") - inventory.get_item_stack_size(item) - inventory.set_item_stack_size(item, item.get_property("max_stack_size")) - - elif inventory.get_item_stack_size(item) == current_total_amount: + if inventory_node.get_item_stack_size(item) < current_total_amount: + if inventory_node.get_item_stack_size(item) == item.get_property("max_stack_size"): + current_total_amount -= inventory_node.get_item_stack_size(item) + elif inventory_node.get_item_stack_size(item) < item.get_property("max_stack_size"): + current_total_amount -= item.get_property("max_stack_size") - inventory_node.get_item_stack_size(item) + inventory_node.set_item_stack_size(item, item.get_property("max_stack_size")) + + elif inventory_node.get_item_stack_size(item) == current_total_amount: current_total_amount = 0 - elif inventory.get_item_stack_size(item) > current_total_amount: - inventory.set_item_stack_size(item, current_total_amount) + elif inventory_node.get_item_stack_size(item) > current_total_amount: + inventory_node.set_item_stack_size(item, current_total_amount) current_total_amount = 0 - if inventory.get_item_stack_size(item) == 0: - inventory.remove_item(item) + if inventory_node.get_item_stack_size(item) == 0: + inventory_node.remove_item(item) func _on_crafting_menu_start_craft(recipe): @@ -127,7 +115,7 @@ func _on_crafting_menu_start_craft(recipe): #adding a new item(s) to the inventory based on the recipe var item item = inventory.create_and_add_item(recipe["crafts"]) - inventory.set_item_stack_size(item, recipe["craft_amount"]) + InventoryGridStacked.set_item_stack_size(item, recipe["craft_amount"]) # When an item is added to the player inventory @@ -139,3 +127,6 @@ func _on_inventory_grid_stacked_item_added(item): var original_item = item.get_meta("original_item") if original_parent and original_parent.has_method("remove_item"): original_parent.remove_item(original_item) # Remove from original parent + +func get_inventory() -> InventoryGridStacked: + return inventory diff --git a/Scripts/hud.gd b/Scripts/hud.gd index 26428868..8a9c969c 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -14,11 +14,8 @@ extends CanvasLayer @export var healthy_color: Color @export var damaged_color: Color -@export var proximity_inventory: NodePath -@export var proximity_inventory_control: NodePath - -@export var inventory_control : NodePath -@export var inventory : NodePath +# This window shows the inventory to the player +@export var inventoryWindow : Control @export var building_menu: NodePath @export var crafting_menu : NodePath @@ -26,11 +23,6 @@ extends CanvasLayer var is_building_menu_open = false -@export var tooltip: NodePath -var is_showing_tooltip = false -@export var tooltip_item_name : NodePath -@export var tooltip_item_description : NodePath - @export var progress_bar : NodePath @export var progress_bar_filling : NodePath @@ -60,8 +52,7 @@ func _input(event): get_node(building_menu).set_visible(true) if event.is_action_pressed("toggle_inventory"): - get_node(inventory_control).visible = !get_node(inventory_control).visible - get_node(proximity_inventory_control).visible = !get_node(proximity_inventory_control).visible + inventoryWindow.visible = !inventoryWindow.visible if event.is_action_pressed("crafting_menu"): get_node(crafting_menu).visible = !get_node(crafting_menu).visible @@ -71,17 +62,7 @@ func _input(event): else: overmap.show() -# Called when the node enters the scene tree for the first time. -func _ready(): - get_node(inventory).deserialize(General.player_inventory_dict) -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(_delta): - if is_showing_tooltip: - get_node(tooltip).visible = true - get_node(tooltip).global_position = get_node(tooltip).get_global_mouse_position() + Vector2(0, -5 - get_node(tooltip).size.y) - else: - get_node(tooltip).visible = false if is_progress_bar_well_progressing_i_guess: get_node(progress_bar_filling).scale.x = lerp(1, 0, get_node(progress_bar_timer).time_left / progress_bar_timer_max_time) @@ -98,22 +79,6 @@ func _on_player_update_doll(head, right_arm, left_arm, torso, right_leg, left_le func _on_player_update_stamina_hud(stamina): get_node(stamina_HUD).text = str(round(stamina)) + "%" -# The parameter items isall the items from the inventory that has entered proximity -func _on_item_detector_add_to_proximity_inventory(items): - var duplicated_items = items - for item in duplicated_items: - var duplicated_item = item.duplicate() - # Store the original inventory - duplicated_item.set_meta("original_parent", item.get_inventory()) - duplicated_item.set_meta("original_item", item) - get_node(proximity_inventory).add_child(duplicated_item) - -# The parameter items is all the items from the inventory that has left proximity -func _on_item_detector_remove_from_proximity_inventory(items): - for prox_item in get_node(proximity_inventory).get_children(): - for item in items: - if item.get_property("assigned_id") == prox_item.get_property("assigned_id"): - prox_item.queue_free() func _on_concrete_button_down(): construction_chosen.emit("concrete_wall") @@ -123,16 +88,9 @@ func _on_concrete_button_down(): # get_node(ammo_HUD).text = str(current_ammo) + "/" + str(max_ammo) -func _on_inventory_item_mouse_entered(item): - is_showing_tooltip = true - get_node(tooltip_item_name).text = str(item.get_property("name", "")) - get_node(tooltip_item_description).text = item.get_property("description", "") - -func _on_inventory_item_mouse_exited(_item): - is_showing_tooltip = false func check_if_resources_are_available(item_id, amount_to_spend: int): - var inventory_node = get_node(inventory) + var inventory_node: InventoryGridStacked = inventoryWindow.get_inventory() print("checking if we have the item id in inv") if inventory_node.get_item_by_id(item_id): print("we have the item id") @@ -146,7 +104,7 @@ func check_if_resources_are_available(item_id, amount_to_spend: int): return false func try_to_spend_item(item_id, amount_to_spend : int): - var inventory_node = get_node(inventory) + var inventory_node = inventoryWindow.get_inventory() if inventory_node.get_item_by_id(item_id): var item_total_amount : int = 0 var current_amount_to_spend = amount_to_spend @@ -192,8 +150,8 @@ func _on_crafting_menu_start_craft(recipe): #adding a new item(s) to the inventory based on the recipe var item - item = get_node(inventory).create_and_add_item(recipe["crafts"]) - get_node(inventory).set_item_stack_size(item, recipe["craft_amount"]) + item = inventoryWindow.get_inventory().create_and_add_item(recipe["crafts"]) + inventoryWindow.get_inventory().set_item_stack_size(item, recipe["craft_amount"]) func start_progress_bar(time : float): get_node(progress_bar).visible = true @@ -218,14 +176,12 @@ func _on_shooting_ammo_changed(current_ammo, max_ammo): # Called when the users presses the travel button on the overmap # We save the player inventory to a autoload singleton so we can load it on the next map func _on_overmap_change_level_pressed(): - General.player_inventory_dict = get_node(inventory).serialize() - -# When an item is added to the player inventory -# We check where it came from and delete it from that inventory -# This happens when the player moves an item from $CtrlInventoryGridExProx -func _on_inventory_grid_stacked_item_added(item): - if item.has_meta("original_parent"): - var original_parent = item.get_meta("original_parent") - var original_item = item.get_meta("original_item") - if original_parent and original_parent.has_method("remove_item"): - original_parent.remove_item(original_item) # Remove from original parent + General.player_inventory_dict = inventoryWindow.get_inventory().serialize() + +# The parameter items isall the items from the inventory that has entered proximity +func _on_item_detector_add_to_proximity_inventory(items): + inventoryWindow._on_item_detector_add_to_proximity_inventory(items) + +# The parameter items is all the items from the inventory that has left proximity +func _on_item_detector_remove_from_proximity_inventory(items): + inventoryWindow._on_item_detector_remove_from_proximity_inventory(items) diff --git a/hud.tscn b/hud.tscn index 7346b17c..a77122ae 100644 --- a/hud.tscn +++ b/hud.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=25 format=3 uid="uid://clhj525tmme3k"] +[gd_scene load_steps=21 format=3 uid="uid://clhj525tmme3k"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="1_pxloi"] [ext_resource type="Script" path="res://Scripts/hud.gd" id="1_s3xoj"] [ext_resource type="Script" path="res://Scripts/NonHUDclick.gd" id="2_kpbhl"] -[ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="2_pq7em"] [ext_resource type="Texture2D" uid="uid://7hppy1l45loq" path="res://Textures/bar_progress.png" id="3_83uwt"] [ext_resource type="Resource" uid="uid://bvrl0obu5ejqq" path="res://ItemProtosets.tres" id="3_jmlkb"] [ext_resource type="Texture2D" uid="uid://dcgwgmsmi7mjn" path="res://Textures/bar_border.png" id="3_y43f5"] @@ -13,8 +12,6 @@ [ext_resource type="Texture2D" uid="uid://1alnt17qsyd7" path="res://Textures/rightarm.png" id="7_td8gu"] [ext_resource type="Texture2D" uid="uid://t7ny2gtgqll8" path="res://Textures/head.png" id="8_vb8fm"] [ext_resource type="Texture2D" uid="uid://c1begynwustlp" path="res://Textures/torso.png" id="9_4u4ej"] -[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_grid_ex.gd" id="11_m0x1l"] -[ext_resource type="Texture2D" uid="uid://cwmsngeoc631h" path="res://Textures/Screenshot_167.png" id="13_hab4t"] [ext_resource type="Script" path="res://Scripts/CraftingMenu.gd" id="14_g3fif"] [ext_resource type="PackedScene" uid="uid://cpcn3qq8okj12" path="res://item_craft_button.tscn" id="15_otw1a"] [ext_resource type="ButtonGroup" uid="uid://bcjuavqvre6mk" path="res://crafting_recipes_button_group.tres" id="16_2oloe"] @@ -26,14 +23,10 @@ default_font = ExtResource("1_pxloi") default_font_size = 0 -[sub_resource type="Theme" id="Theme_1as7c"] -default_font = ExtResource("1_pxloi") -default_font_size = 13 - [sub_resource type="StyleBoxLine" id="StyleBoxLine_xekk0"] color = Color(1, 1, 1, 1) -[node name="HUD" type="CanvasLayer" node_paths=PackedStringArray("overmap")] +[node name="HUD" type="CanvasLayer" node_paths=PackedStringArray("inventoryWindow", "overmap")] script = ExtResource("1_s3xoj") head_health = NodePath("Doll/Head") right_arm_health = NodePath("Doll/Rightarm") @@ -45,16 +38,10 @@ stamina_HUD = NodePath("StaminaLevel") ammo_HUD = NodePath("Ammo") healthy_color = Color(0, 0.635294, 0, 1) damaged_color = Color(0.635294, 0, 0, 1) -proximity_inventory = NodePath("InventoryGridStackedProx") -proximity_inventory_control = NodePath("CtrlInventoryGridExProx") -inventory_control = NodePath("CtrlInventoryGridEx") -inventory = NodePath("InventoryGridStacked") +inventoryWindow = NodePath("InventoryWindow") building_menu = NodePath("BuildingMenu") crafting_menu = NodePath("CraftingMenu") overmap = NodePath("Overmap") -tooltip = NodePath("Tooltip") -tooltip_item_name = NodePath("Tooltip/Panel/ItemName") -tooltip_item_description = NodePath("Tooltip/Panel2/Description") progress_bar = NodePath("ProgressBar") progress_bar_filling = NodePath("ProgressBar/Node2D/Filling") progress_bar_timer = NodePath("ProgressBar/ProgressBarTimer") @@ -209,48 +196,6 @@ position = Vector2(85.25, -113.375) scale = Vector2(0.75, 0.75) texture = ExtResource("9_4u4ej") -[node name="InventoryGridStacked" type="Node" parent="."] -script = ExtResource("2_pq7em") -item_protoset = ExtResource("3_jmlkb") - -[node name="InventoryGridStackedProx" type="Node" parent="."] -script = ExtResource("2_pq7em") -size = Vector2i(30, 10) -item_protoset = ExtResource("3_jmlkb") - -[node name="CtrlInventoryGridEx" type="Control" parent="."] -visible = false -custom_minimum_size = Vector2(320, 320) -layout_mode = 3 -anchors_preset = 2 -anchor_top = 1.0 -anchor_bottom = 1.0 -offset_left = 383.0 -offset_top = -322.0 -offset_right = 703.0 -offset_bottom = -2.0 -grow_vertical = 0 -script = ExtResource("11_m0x1l") -selection_color = Color(0.745098, 0.745098, 0.745098, 0.941176) -inventory_path = NodePath("../InventoryGridStacked") -default_item_texture = ExtResource("13_hab4t") - -[node name="CtrlInventoryGridExProx" type="Control" parent="."] -visible = false -custom_minimum_size = Vector2(240, 80) -layout_mode = 3 -anchors_preset = 2 -anchor_top = 1.0 -anchor_bottom = 1.0 -offset_left = 711.0 -offset_top = -80.0 -offset_right = 951.0 -grow_vertical = 0 -script = ExtResource("11_m0x1l") -field_dimensions = Vector2(8, 8) -inventory_path = NodePath("../InventoryGridStackedProx") -default_item_texture = ExtResource("13_hab4t") - [node name="BuildingMenu" type="GridContainer" parent="."] visible = false offset_right = 186.0 @@ -261,58 +206,6 @@ columns = 4 layout_mode = 2 text = "Concrete" -[node name="Tooltip" type="Control" parent="."] -visible = false -layout_mode = 3 -anchors_preset = 0 -offset_right = 242.0 -offset_bottom = 115.0 -pivot_offset = Vector2(0, 173) -size_flags_horizontal = 3 -size_flags_vertical = 3 -tooltip_text = "kjkgkjghkjjhkg" - -[node name="Panel" type="Panel" parent="Tooltip"] -layout_mode = 2 -offset_left = 1.0 -offset_top = 1.0 -offset_right = 241.0 -offset_bottom = 33.0 -size_flags_vertical = 3 - -[node name="ItemName" type="Label" parent="Tooltip/Panel"] -layout_mode = 0 -offset_right = 240.0 -offset_bottom = 32.0 -theme_override_colors/font_color = Color(0.921569, 0.596078, 0, 1) -theme_override_colors/font_outline_color = Color(0, 0, 0, 1) -theme_override_constants/outline_size = 4 -theme_override_fonts/font = ExtResource("1_pxloi") -theme_override_font_sizes/font_size = 20 -text = "Item name" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="Panel2" type="Panel" parent="Tooltip"] -layout_mode = 2 -offset_left = 1.0 -offset_top = 35.0 -offset_right = 241.0 -offset_bottom = 115.0 -size_flags_vertical = 3 - -[node name="Description" type="Label" parent="Tooltip/Panel2"] -layout_mode = 0 -offset_right = 240.0 -offset_bottom = 32.0 -theme = SubResource("Theme_1as7c") -theme_override_colors/font_outline_color = Color(0, 0, 0, 1) -theme_override_constants/outline_size = 4 -theme_override_fonts/font = ExtResource("1_pxloi") -theme_override_font_sizes/font_size = 13 -text = "Item description" -autowrap_mode = 3 - [node name="CraftingMenu" type="Panel" parent="." groups=["CraftingMenu"]] visible = false anchors_preset = 8 @@ -423,13 +316,12 @@ text = "Required items autowrap_mode = 3 [node name="Overmap" parent="." instance=ExtResource("19_oomhy")] +visible = false [node name="InventoryWindow" parent="." instance=ExtResource("20_0l505")] -anchors_preset = 0 -anchor_right = 0.0 -anchor_bottom = 0.0 -grow_horizontal = 1 -grow_vertical = 1 +visible = false +offset_top = 200.0 +offset_bottom = 720.0 [node name="GameOver" parent="." instance=ExtResource("20_jlthm")] visible = false @@ -437,11 +329,6 @@ visible = false [connection signal="timeout" from="ProgressBar/ProgressBarTimer" to="." method="_on_progress_bar_timer_timeout"] [connection signal="mouse_entered" from="OutsideOfHUD" to="OutsideOfHUD" method="_on_mouse_entered"] [connection signal="mouse_exited" from="OutsideOfHUD" to="OutsideOfHUD" method="_on_mouse_exited"] -[connection signal="item_added" from="InventoryGridStacked" to="." method="_on_inventory_grid_stacked_item_added"] -[connection signal="item_mouse_entered" from="CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_entered"] -[connection signal="item_mouse_exited" from="CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_exited"] -[connection signal="item_mouse_entered" from="CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_entered"] -[connection signal="item_mouse_exited" from="CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_exited"] [connection signal="button_down" from="BuildingMenu/Concrete" to="." method="_on_concrete_button_down"] [connection signal="start_craft" from="CraftingMenu" to="." method="_on_crafting_menu_start_craft"] [connection signal="pressed" from="CraftingMenu/Panel/StartCraftingButton" to="CraftingMenu" method="_on_start_crafting_button_pressed"] From a4bf510eb05d04a8ede71cca78af84895e246712 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 23 Jan 2024 00:29:03 +0100 Subject: [PATCH 115/138] Dynamic list of containers in proximity, inventory window --- Defaults/Mobs/mob_corpse.tscn | 1 + Scenes/InventoryContainerListItem.tscn | 24 ++++ Scenes/InventoryWindow.tscn | 32 ++--- Scripts/InventoryContainerListItem.gd | 24 ++++ Scripts/InventoryWindow.gd | 173 +++++++++++++++++++++---- Scripts/ItemDetector.gd | 4 +- Scripts/container.gd | 6 + Scripts/hud.gd | 12 +- 8 files changed, 230 insertions(+), 46 deletions(-) create mode 100644 Scenes/InventoryContainerListItem.tscn create mode 100644 Scripts/InventoryContainerListItem.gd diff --git a/Defaults/Mobs/mob_corpse.tscn b/Defaults/Mobs/mob_corpse.tscn index 8a40bdac..74addc8f 100644 --- a/Defaults/Mobs/mob_corpse.tscn +++ b/Defaults/Mobs/mob_corpse.tscn @@ -14,6 +14,7 @@ inventory = NodePath("InventoryGridStacked") [node name="InventoryGridStacked" type="Node" parent="."] script = ExtResource("3_131gg") +size = Vector2i(12, 8) item_protoset = ExtResource("4_ehn4b") [node name="Sprite3D" type="Sprite3D" parent="."] diff --git a/Scenes/InventoryContainerListItem.tscn b/Scenes/InventoryContainerListItem.tscn new file mode 100644 index 00000000..1fefd468 --- /dev/null +++ b/Scenes/InventoryContainerListItem.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=3 format=3 uid="uid://crck2fhgayxhn"] + +[ext_resource type="Script" path="res://Scripts/InventoryContainerListItem.gd" id="1_76xnu"] +[ext_resource type="Texture2D" uid="uid://ttmfel3ylg0w" path="res://Mods/Core/Tiles/arcstones1.png" id="2_qnss5"] + +[node name="ContainerListItem" type="Control"] +custom_minimum_size = Vector2(64, 64) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_76xnu") + +[node name="ContainerSprite" type="TextureRect" parent="."] +custom_minimum_size = Vector2(64, 64) +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 +texture = ExtResource("2_qnss5") +expand_mode = 3 + +[connection signal="gui_input" from="ContainerSprite" to="." method="_on_texture_rect_gui_input"] diff --git a/Scenes/InventoryWindow.tscn b/Scenes/InventoryWindow.tscn index 575ed69e..1bd476a6 100644 --- a/Scenes/InventoryWindow.tscn +++ b/Scenes/InventoryWindow.tscn @@ -2,9 +2,9 @@ [ext_resource type="Script" path="res://Scripts/InventoryWindow.gd" id="1_7kqbx"] [ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="2_alcyo"] +[ext_resource type="PackedScene" uid="uid://crck2fhgayxhn" path="res://Scenes/InventoryContainerListItem.tscn" id="2_xfgb3"] [ext_resource type="Resource" uid="uid://bvrl0obu5ejqq" path="res://ItemProtosets.tres" id="3_sqsc0"] [ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_grid_ex.gd" id="4_8j4xb"] -[ext_resource type="Texture2D" uid="uid://c5tbuxmrli7e4" path="res://Mods/Core/Items/steel_scrap.png" id="4_s2r2r"] [ext_resource type="Texture2D" uid="uid://cwmsngeoc631h" path="res://Textures/Screenshot_167.png" id="5_wixd1"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="6_xpf2l"] @@ -12,7 +12,7 @@ default_font = ExtResource("6_xpf2l") default_font_size = 13 -[node name="InventoryWindow" type="Control" node_paths=PackedStringArray("proximity_inventory", "proximity_inventory_control", "inventory_control", "inventory", "tooltip", "tooltip_item_name", "tooltip_item_description")] +[node name="InventoryWindow" type="Control" node_paths=PackedStringArray("proximity_inventory", "proximity_inventory_control", "inventory_control", "inventory", "containerList", "tooltip", "tooltip_item_name", "tooltip_item_description")] layout_mode = 3 anchors_preset = 0 offset_top = 150.0 @@ -25,6 +25,8 @@ proximity_inventory = NodePath("InventoryGridStackedProx") proximity_inventory_control = NodePath("HBoxContainer/Inventories/CtrlInventoryGridExProx") inventory_control = NodePath("HBoxContainer/Inventories/CtrlInventoryGridEx") inventory = NodePath("InventoryGridStacked") +containerList = NodePath("HBoxContainer/ContainersList") +containerListItem = ExtResource("2_xfgb3") tooltip = NodePath("Tooltip") tooltip_item_name = NodePath("Tooltip/Panel/ItemName") tooltip_item_description = NodePath("Tooltip/Panel2/Description") @@ -34,6 +36,7 @@ layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +offset_bottom = 29.0 grow_horizontal = 2 grow_vertical = 2 color = Color(0.698039, 0.729412, 0.788235, 1) @@ -54,36 +57,33 @@ offset_right = 40.0 offset_bottom = 40.0 [node name="ContainersList" type="VBoxContainer" parent="HBoxContainer"] +custom_minimum_size = Vector2(64, 0) layout_mode = 2 -[node name="TextureRect" type="TextureRect" parent="HBoxContainer/ContainersList"] -layout_mode = 2 -texture = ExtResource("4_s2r2r") - [node name="Inventories" type="VBoxContainer" parent="HBoxContainer"] layout_mode = 2 -[node name="CtrlInventoryGridExProx" type="Control" parent="HBoxContainer/Inventories"] +[node name="CtrlInventoryGridEx" type="Control" parent="HBoxContainer/Inventories"] custom_minimum_size = Vector2(384, 256) layout_mode = 2 size_flags_vertical = 3 script = ExtResource("4_8j4xb") -grid_color = Color(0.305882, 0.305882, 0.305882, 1) -inventory_path = NodePath("../../../InventoryGridStackedProx") +grid_color = Color(0.309804, 0.309804, 0.309804, 1) +selection_color = Color(0.745098, 0.745098, 0.745098, 0.941176) +inventory_path = NodePath("../../../InventoryGridStacked") default_item_texture = ExtResource("5_wixd1") [node name="Label" type="Label" parent="HBoxContainer/Inventories"] layout_mode = 2 -text = "Player inventory:" +text = "Nearby container:" -[node name="CtrlInventoryGridEx" type="Control" parent="HBoxContainer/Inventories"] +[node name="CtrlInventoryGridExProx" type="Control" parent="HBoxContainer/Inventories"] custom_minimum_size = Vector2(384, 256) layout_mode = 2 size_flags_vertical = 3 script = ExtResource("4_8j4xb") -grid_color = Color(0.309804, 0.309804, 0.309804, 1) -selection_color = Color(0.745098, 0.745098, 0.745098, 0.941176) -inventory_path = NodePath("../../../InventoryGridStacked") +grid_color = Color(0.305882, 0.305882, 0.305882, 1) +inventory_path = NodePath("../../../InventoryGridStackedProx") default_item_texture = ExtResource("5_wixd1") [node name="Tooltip" type="Control" parent="."] @@ -139,7 +139,7 @@ text = "Item description" autowrap_mode = 3 [connection signal="item_added" from="InventoryGridStacked" to="." method="_on_inventory_grid_stacked_item_added"] -[connection signal="item_mouse_entered" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_entered"] -[connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_exited"] [connection signal="item_mouse_entered" from="HBoxContainer/Inventories/CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_entered"] [connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_exited"] +[connection signal="item_mouse_entered" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_entered"] +[connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_exited"] diff --git a/Scripts/InventoryContainerListItem.gd b/Scripts/InventoryContainerListItem.gd new file mode 100644 index 00000000..a42ddd55 --- /dev/null +++ b/Scripts/InventoryContainerListItem.gd @@ -0,0 +1,24 @@ +extends Control + +signal containerlistitem_clicked(clicked_item: Control) +var containerInstance: Node3D = null +var selected: bool = false + +#When the event was a left mouse button press, signal it was clicked +func _on_texture_rect_gui_input(event): + if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: + containerlistitem_clicked.emit(self) + +func set_item_texture(res: Resource) -> void: + $ContainerSprite.texture = res + +func get_texture() -> Resource: + return $ContainerSprite.texture + +#Mark the clicked containerlistitem as selected +func set_selected(is_selected: bool) -> void: + selected = is_selected + if selected: + modulate = Color(0.227, 0.635, 0.757) + else: + modulate = Color(1,1,1) diff --git a/Scripts/InventoryWindow.gd b/Scripts/InventoryWindow.gd index 698dd195..376f225a 100644 --- a/Scripts/InventoryWindow.gd +++ b/Scripts/InventoryWindow.gd @@ -1,22 +1,29 @@ extends Control +# This node holds the data of the items in the container that is selected in the containerList @export var proximity_inventory: InventoryGridStacked +# This node visualizes the items in the container that is selected in the containerList @export var proximity_inventory_control: CtrlInventoryGridEx +# The node that visualizes the player inventory @export var inventory_control : CtrlInventoryGridEx +# The player inventory @export var inventory : InventoryGridStacked +# Holds a list of containers represented by their sprite +@export var containerList : VBoxContainer +@export var containerListItem : PackedScene - +# The tooltip will show when the player hovers over an item @export var tooltip: Control var is_showing_tooltip = false @export var tooltip_item_name : Label @export var tooltip_item_description : Label - - # Called when the node enters the scene tree for the first time. func _ready(): + # The items that were in the player inventory when they exited + # the previous level are loaded back into the inventory inventory.deserialize(General.player_inventory_dict) # Called every frame. 'delta' is the elapsed time since the previous frame. @@ -27,23 +34,6 @@ func _process(_delta): else: tooltip.visible = false -# The parameter items isall the items from the inventory that has entered proximity -func _on_item_detector_add_to_proximity_inventory(items): - var duplicated_items = items - for item in duplicated_items: - var duplicated_item = item.duplicate() - # Store the original inventory - duplicated_item.set_meta("original_parent", item.get_inventory()) - duplicated_item.set_meta("original_item", item) - proximity_inventory.add_child(duplicated_item) - -# The parameter items is all the items from the inventory that has left proximity -func _on_item_detector_remove_from_proximity_inventory(items): - for prox_item in proximity_inventory.get_children(): - for item in items: - if item.get_property("assigned_id") == prox_item.get_property("assigned_id"): - prox_item.queue_free() - func _on_inventory_item_mouse_entered(item): is_showing_tooltip = true @@ -106,12 +96,10 @@ func merge_items_to_total_amount(items, inventory_node, total_amount : int): inventory_node.remove_item(item) func _on_crafting_menu_start_craft(recipe): - if recipe: #first we need to use required resources for the recipe for required_item in recipe["required_resource"]: try_to_spend_item(required_item, recipe["required_resource"][required_item]) - #adding a new item(s) to the inventory based on the recipe var item item = inventory.create_and_add_item(recipe["crafts"]) @@ -130,3 +118,144 @@ func _on_inventory_grid_stacked_item_added(item): func get_inventory() -> InventoryGridStacked: return inventory +# +# +## The parameter container is the node3d that holds the inventory that has entered proximity +#func _on_item_detector_add_to_proximity_inventory(container: Node3D): + #var duplicated_items = container.get_items() + #for item in duplicated_items: + #var duplicated_item = item.duplicate() + ## Store the original inventory + #duplicated_item.set_meta("original_parent", item.get_inventory()) + #duplicated_item.set_meta("original_item", item) + #proximity_inventory.add_child(duplicated_item) +# +## The parameter container is the node3d that holds the inventory that has left proximity +#func _on_item_detector_remove_from_proximity_inventory(container: Node3D): + #for prox_item in proximity_inventory.get_children(): + #for item in container.get_items(): + #if item.get_property("assigned_id") == prox_item.get_property("assigned_id"): + #prox_item.queue_free() + + +# Signal handler for adding a container to the proximity +func _on_item_detector_add_to_proximity_inventory(container: Node3D): + add_container_to_list(container) + +# Signal handler for removing a container from the proximity +func _on_item_detector_remove_from_proximity_inventory(container: Node3D): + remove_container_from_list(container) +# +## Function to add a container to the containerList +#func add_container_to_list(container: Node3D): + ## Create a new instance of the containerlistitem node + #var containerListItemInstance = containerListItem.instantiate() + ## Assign the texture to the TextureRect + #containerListItemInstance.set_item_texture(container.get_sprite()) + ## We save a reference to the container + #containerListItemInstance.containerInstance = container + #containerListItemInstance.containerlistitem_clicked.connect(_on_container_clicked) + #containerList.add_child(containerListItemInstance) + +# Function to add a container to the containerList +func add_container_to_list(container: Node3D): + # Create a new instance of the containerlistitem node + var containerListItemInstance = containerListItem.instantiate() + # Assign the texture to the TextureRect + containerListItemInstance.set_item_texture(container.get_sprite()) + # We save a reference to the container + containerListItemInstance.containerInstance = container + containerListItemInstance.containerlistitem_clicked.connect(_on_container_clicked) + containerList.add_child(containerListItemInstance) + + # Check if this is the only container in the list + if containerList.get_child_count() == 1: + # Set the inventory of the proximity inventory control to this container's inventory + var container_inventory = containerListItemInstance.containerInstance.get_inventory() + if container_inventory: + proximity_inventory_control.inventory = container_inventory + # Make the proximity inventory control visible + proximity_inventory_control.visible = true + + +# Function to update the proximity inventory control when a container is selected +func _on_container_clicked(containerListItemInstance: Control): + if containerListItemInstance and containerListItemInstance.containerInstance: + var container_inventory = containerListItemInstance.containerInstance.get_inventory() + if container_inventory: + proximity_inventory_control.inventory = container_inventory + +# +## Function to remove a container from the containerList +#func remove_container_from_list(container: Node3D): + #for child in containerList.get_children(): + #if child.containerInstance == container: + #child.queue_free() + #break +# + ## Check if containerList has no more children + #if containerList.get_child_count() == 0: + ## Set proximity_inventory_control.inventory to proximity_inventory + #proximity_inventory_control.inventory = proximity_inventory + ## Hide the proximity_inventory_control + #proximity_inventory_control.visible = false +# +# +## Function to remove a container from the containerList +#func remove_container_from_list(container: Node3D): + #var was_selected = false + #var first_container = null +# + ## Check if the container being removed is the currently selected one + #if proximity_inventory_control.inventory == container.get_inventory(): + #was_selected = true +# + ## Remove the container from the list + #for child in containerList.get_children(): + #if child.containerInstance == container: + #child.queue_free() + #break +# + ## Check if there are any containers left in the list + #if containerList.get_child_count() > 0: + #first_container = containerList.get_child(0).containerInstance +# + ## If the removed container was selected, update the inventory to the first container's inventory + #if was_selected and first_container: + #var first_container_inventory = first_container.get_inventory() + #if first_container_inventory: + #proximity_inventory_control.inventory = first_container_inventory + #elif was_selected or containerList.get_child_count() == 0: + ## Reset the inventory to proximity_inventory and hide the control + #proximity_inventory_control.inventory = proximity_inventory + #proximity_inventory_control.visible = false +# + +# Function to remove a container from the containerList +func remove_container_from_list(container: Node3D): + var was_selected = false + var first_container = null + + # Check if the container being removed is the currently selected one + if proximity_inventory_control.inventory == container.get_inventory(): + was_selected = true + + # Remove the container from the list and count remaining containers + var remaining_containers = 0 + for child in containerList.get_children(): + if child.containerInstance == container: + child.queue_free() + elif not child.is_queued_for_deletion(): # Only count children not queued for deletion + remaining_containers += 1 + if first_container == null: + first_container = child.containerInstance + + # If the removed container was selected, update the inventory to the first remaining container's inventory + if was_selected and remaining_containers > 0: + var first_container_inventory = first_container.get_inventory() + if first_container_inventory: + proximity_inventory_control.inventory = first_container_inventory + elif was_selected or remaining_containers == 0: + # Reset the inventory to proximity_inventory and hide the control + proximity_inventory_control.inventory = proximity_inventory + proximity_inventory_control.visible = false diff --git a/Scripts/ItemDetector.gd b/Scripts/ItemDetector.gd index 69317036..7cf9280c 100644 --- a/Scripts/ItemDetector.gd +++ b/Scripts/ItemDetector.gd @@ -7,11 +7,11 @@ signal remove_from_proximity_inventory func _on_area_entered(area): if area.get_owner().is_in_group("Containers"): - add_to_proximity_inventory.emit(area.get_owner().get_items()) + add_to_proximity_inventory.emit(area.get_owner()) #print(area.get_owner().get_items()) func _on_area_exited(area): if area.get_owner().is_in_group("Containers"): - remove_from_proximity_inventory.emit(area.get_owner().get_items()) + remove_from_proximity_inventory.emit(area.get_owner()) diff --git a/Scripts/container.gd b/Scripts/container.gd index 9c8301e1..fdfd2ff8 100644 --- a/Scripts/container.gd +++ b/Scripts/container.gd @@ -17,3 +17,9 @@ func create_random_loot(): func get_items(): return get_node(inventory).get_children() + +func get_sprite(): + return $Sprite3D.texture + +func get_inventory(): + return get_node(inventory) diff --git a/Scripts/hud.gd b/Scripts/hud.gd index 8a9c969c..d1a0e9c7 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -178,10 +178,10 @@ func _on_shooting_ammo_changed(current_ammo, max_ammo): func _on_overmap_change_level_pressed(): General.player_inventory_dict = inventoryWindow.get_inventory().serialize() -# The parameter items isall the items from the inventory that has entered proximity -func _on_item_detector_add_to_proximity_inventory(items): - inventoryWindow._on_item_detector_add_to_proximity_inventory(items) +# The parameter container the inventory that has entered proximity +func _on_item_detector_add_to_proximity_inventory(container): + inventoryWindow._on_item_detector_add_to_proximity_inventory(container) -# The parameter items is all the items from the inventory that has left proximity -func _on_item_detector_remove_from_proximity_inventory(items): - inventoryWindow._on_item_detector_remove_from_proximity_inventory(items) +# The parameter container the inventory that has left proximity +func _on_item_detector_remove_from_proximity_inventory(container): + inventoryWindow._on_item_detector_remove_from_proximity_inventory(container) From 61c24b9d30b173fa2481397ca2f64725f9cfdfd7 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 23 Jan 2024 02:28:38 +0100 Subject: [PATCH 116/138] Update gloot --- .../core/constraints/constraint_manager.gd | 32 +- .../gloot/core/constraints/grid_constraint.gd | 32 +- .../core/constraints/inventory_constraint.gd | 7 + addons/gloot/core/constraints/item_map.gd | 10 + .../core/constraints/stacks_constraint.gd | 42 +- .../core/constraints/weight_constraint.gd | 7 + addons/gloot/core/inventory.gd | 34 +- addons/gloot/core/inventory_grid.gd | 11 +- addons/gloot/core/inventory_grid_stacked.gd | 39 +- .../gloot/core/inventory_grid_transfer.tscn | 141 ---- addons/gloot/core/inventory_item.gd | 79 +- addons/gloot/core/inventory_stacked.gd | 75 +- addons/gloot/core/item_count.gd | 132 ++-- addons/gloot/core/item_protoset.gd | 161 +++-- addons/gloot/core/item_ref_slot.gd | 193 +++++ addons/gloot/core/item_slot.gd | 205 ++---- addons/gloot/core/item_slot_base.gd | 42 ++ addons/gloot/core/verify.gd | 2 +- addons/gloot/editor/common/choice_filter.gd | 8 +- addons/gloot/editor/common/dict_editor.gd | 8 +- addons/gloot/editor/common/editor_icons.gd | 11 +- .../gloot/editor/common/multivalue_editor.gd | 4 +- addons/gloot/editor/common/value_editor.gd | 34 +- addons/gloot/editor/gloot_undo_redo.gd | 144 ++-- .../inventory_editor/inventory_editor.gd | 172 ++--- .../inventory_editor/inventory_inspector.gd | 26 +- .../editor/inventory_inspector_plugin.gd | 47 +- .../item_editor/edit_properties_button.gd | 13 +- .../item_editor/edit_prototype_id_button.gd | 17 +- .../editor/item_editor/properties_editor.gd | 22 +- .../editor/item_editor/prototype_id_editor.gd | 16 +- .../edit_equipped_item_button.gd | 77 -- .../item_slot_editor/item_ref_slot_button.gd | 67 ++ .../item_slot_editor/item_slot_editor.gd | 108 +++ .../item_slot_editor/item_slot_editor.tscn | 103 +++ .../item_slot_editor/item_slot_inspector.gd | 40 + .../item_slot_editor/item_slot_inspector.tscn | 66 ++ .../protoset_editor/edit_protoset_button.gd | 33 +- .../protoset_editor/edit_protoset_button.tscn | 23 +- .../editor/protoset_editor/protoset_editor.gd | 68 +- .../protoset_editor/protoset_editor.tscn | 78 +- addons/gloot/gloot.gd | 74 +- addons/gloot/images/icon_inventory.svg.import | 13 +- addons/gloot/images/icon_item.svg.import | 13 +- addons/gloot/images/icon_item_ref_slot.svg | 77 ++ .../images/icon_item_ref_slot.svg.import | 37 + addons/gloot/plugin.cfg | 2 +- addons/gloot/ui/ctrl_dragable.gd | 111 +++ addons/gloot/ui/ctrl_drop_zone.gd | 64 ++ addons/gloot/ui/ctrl_inventory.gd | 187 ++--- addons/gloot/ui/ctrl_inventory_grid.gd | 682 ++++++++---------- addons/gloot/ui/ctrl_inventory_grid_ex.gd | 43 +- addons/gloot/ui/ctrl_inventory_item_rect.gd | 112 ++- addons/gloot/ui/ctrl_inventory_stacked.gd | 101 +-- addons/gloot/ui/ctrl_item_slot.gd | 182 +++-- addons/gloot/ui/ctrl_item_slot_ex.gd | 9 + 56 files changed, 2483 insertions(+), 1653 deletions(-) delete mode 100644 addons/gloot/core/inventory_grid_transfer.tscn create mode 100644 addons/gloot/core/item_ref_slot.gd create mode 100644 addons/gloot/core/item_slot_base.gd delete mode 100644 addons/gloot/editor/item_slot_editor/edit_equipped_item_button.gd create mode 100644 addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd create mode 100644 addons/gloot/editor/item_slot_editor/item_slot_editor.gd create mode 100644 addons/gloot/editor/item_slot_editor/item_slot_editor.tscn create mode 100644 addons/gloot/editor/item_slot_editor/item_slot_inspector.gd create mode 100644 addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn create mode 100644 addons/gloot/images/icon_item_ref_slot.svg create mode 100644 addons/gloot/images/icon_item_ref_slot.svg.import create mode 100644 addons/gloot/ui/ctrl_dragable.gd create mode 100644 addons/gloot/ui/ctrl_drop_zone.gd diff --git a/addons/gloot/core/constraints/constraint_manager.gd b/addons/gloot/core/constraints/constraint_manager.gd index 66b6d5f8..05dcc27a 100644 --- a/addons/gloot/core/constraints/constraint_manager.gd +++ b/addons/gloot/core/constraints/constraint_manager.gd @@ -1,3 +1,5 @@ +extends RefCounted + const KEY_WEIGHT_CONSTRAINT = "weight_constraint" const KEY_STACKS_CONSTRAINT = "stacks_constraint" const KEY_GRID_CONSTRAINT = "grid_constraint" @@ -139,16 +141,40 @@ func _sg_get_space_for(item: InventoryItem) -> ItemCount: func has_space_for(item: InventoryItem) -> bool: - return not get_space_for(item).less(ItemCount.new(1)) + match get_configuration(): + Configuration.W: + return _weight_constraint.has_space_for(item) + Configuration.S: + return _stacks_constraint.has_space_for(item) + Configuration.G: + return _grid_constraint.has_space_for(item) + Configuration.WS: + return _weight_constraint.has_space_for(item) + Configuration.WG: + return _weight_constraint.has_space_for(item) && _grid_constraint.has_space_for(item) + Configuration.SG: + return _sg_has_space_for(item) + Configuration.WSG: + return _sg_has_space_for(item) && _weight_constraint.has_space_for(item) + + return true + + +func _sg_has_space_for(item: InventoryItem) -> bool: + if _grid_constraint.has_space_for(item): + return true + var stack_size := ItemCount.new(_stacks_constraint.get_item_stack_size(item)) + var free_stacks_space := _stacks_constraint.get_free_stack_space_for(item) + return free_stacks_space.ge(stack_size) -func enable_weight_constraint_(capacity: float = 0.0) -> void: +func enable_weight_constraint(capacity: float = 0.0) -> void: assert(_weight_constraint == null, "Weight constraint is already enabled") _weight_constraint = WeightConstraint.new(inventory) _weight_constraint.capacity = capacity -func enable_stacks_constraint_() -> void: +func enable_stacks_constraint() -> void: assert(_stacks_constraint == null, "Stacks constraint is already enabled") _stacks_constraint = StacksConstraint.new(inventory) diff --git a/addons/gloot/core/constraints/grid_constraint.gd b/addons/gloot/core/constraints/grid_constraint.gd index daa3fe72..fecb3ac0 100644 --- a/addons/gloot/core/constraints/grid_constraint.gd +++ b/addons/gloot/core/constraints/grid_constraint.gd @@ -45,9 +45,20 @@ func _fill_item_map() -> void: func _on_inventory_set() -> void: _refresh_item_map() - inventory.item_added.connect(func(item: InventoryItem): _item_map.fill_rect(get_item_rect(item), item)) - inventory.item_removed.connect(func(item: InventoryItem): _item_map.clear_rect(get_item_rect(item))) - inventory.item_modified.connect(func(_item: InventoryItem): _refresh_item_map()) + + +func _on_item_added(item: InventoryItem) -> void: + if item == null: + return + _item_map.fill_rect(get_item_rect(item), item) + + +func _on_item_removed(item: InventoryItem) -> void: + _item_map.clear_rect(get_item_rect(item)) + + +func _on_item_modified(item: InventoryItem) -> void: + _refresh_item_map() func _bounds_broken() -> bool: @@ -116,7 +127,7 @@ func _get_prototype_size(prototype_id: String) -> Vector2i: assert(inventory != null, "Inventory not set!") assert(inventory.item_protoset != null, "Inventory protoset is null!") var width: int = inventory.item_protoset.get_item_property(prototype_id, KEY_WIDTH, 1) - var height: int = inventory.item_protoset.get_item_property(prototype_id, KEY_WIDTH, 1) + var height: int = inventory.item_protoset.get_item_property(prototype_id, KEY_HEIGHT, 1) return Vector2i(width, height) @@ -304,7 +315,7 @@ func sort() -> bool: var item_array: Array[InventoryItem] for item in inventory.get_items(): item_array.append(item) - item_array.sort_custom(Callable(self, "_compare_items")) + item_array.sort_custom(_compare_items) for item in item_array: _move_item_to_unsafe(item, -get_item_size(item)) @@ -326,6 +337,9 @@ func _sort_if_needed() -> void: func get_space_for(item: InventoryItem) -> ItemCount: var occupied_rects: Array[Rect2i] var item_size = get_item_size(item) + if item_size == Vector2i.ONE: + return ItemCount.new(_item_map.free_fields) + var free_space := find_free_space(item_size, occupied_rects) while free_space.success: occupied_rects.append(Rect2i(free_space.position, item_size)) @@ -333,6 +347,14 @@ func get_space_for(item: InventoryItem) -> ItemCount: return ItemCount.new(occupied_rects.size()) +func has_space_for(item: InventoryItem) -> bool: + var item_size = get_item_size(item) + if item_size == Vector2i.ONE: + return _item_map.free_fields > 0 + + return find_free_space(item_size).success + + # TODO: Check if find_free_place is needed func find_free_space(item_size: Vector2i, occupied_rects: Array[Rect2i] = []) -> Dictionary: var result := {success = false, position = Vector2i(-1, -1)} diff --git a/addons/gloot/core/constraints/inventory_constraint.gd b/addons/gloot/core/constraints/inventory_constraint.gd index cfaff6ac..54e4cf85 100644 --- a/addons/gloot/core/constraints/inventory_constraint.gd +++ b/addons/gloot/core/constraints/inventory_constraint.gd @@ -1,3 +1,5 @@ +extends Object + var inventory: Inventory = null : get: return inventory @@ -17,6 +19,11 @@ func get_space_for(item: InventoryItem) -> ItemCount: return ItemCount.zero() +# Override this +func has_space_for(item:InventoryItem) -> bool: + return false + + # Override this func reset() -> void: pass diff --git a/addons/gloot/core/constraints/item_map.gd b/addons/gloot/core/constraints/item_map.gd index 73493222..27ed977b 100644 --- a/addons/gloot/core/constraints/item_map.gd +++ b/addons/gloot/core/constraints/item_map.gd @@ -1,4 +1,10 @@ var map: Array +var _free_fields: int +var free_fields : + get: + return _free_fields + set(new_free_fields): + assert(false, "free_fields is read-only!") func _init(size: Vector2i) -> void: @@ -11,6 +17,7 @@ func resize(size: Vector2i) -> void: for i in map.size(): map[i] = [] map[i].resize(size.y) + _free_fields = size.x * size.y func fill_rect(rect: Rect2i, value) -> void: @@ -20,6 +27,7 @@ func fill_rect(rect: Rect2i, value) -> void: if !contains(map_coords): continue map[map_coords.x][map_coords.y] = value + _free_fields -= 1 func clear_rect(rect: Rect2i) -> void: @@ -44,6 +52,8 @@ func print() -> void: func clear() -> void: for column in map: column.fill(null) + var size = get_size() + _free_fields = size.x * size.y func contains(position: Vector2i) -> bool: diff --git a/addons/gloot/core/constraints/stacks_constraint.gd b/addons/gloot/core/constraints/stacks_constraint.gd index ee1307d7..31568b3b 100644 --- a/addons/gloot/core/constraints/stacks_constraint.gd +++ b/addons/gloot/core/constraints/stacks_constraint.gd @@ -35,13 +35,24 @@ static func get_item_max_stack_size(item: InventoryItem) -> int: return item.get_property(KEY_MAX_STACK_SIZE, DEFAULT_MAX_STACK_SIZE) -static func set_item_stack_size(item: InventoryItem, stack_size: int) -> void: +static func set_item_stack_size(item: InventoryItem, stack_size: int) -> bool: assert(item != null, "item is null!") + assert(stack_size >= 0, "stack_size can't be negative!") + if stack_size > get_item_max_stack_size(item): + return false + if stack_size == 0: + var inventory: Inventory = item.get_inventory() + if inventory != null: + inventory.remove_item(item) + item.queue_free() + return true item.set_property(KEY_STACK_SIZE, stack_size) + return true static func set_item_max_stack_size(item: InventoryItem, max_stack_size: int) -> void: assert(item != null, "item is null!") + assert(max_stack_size > 0, "max_stack_size can't be less than 1!") item.set_property(KEY_MAX_STACK_SIZE, max_stack_size) @@ -115,22 +126,13 @@ func add_item_automerge( var target_items = get_mergable_items(item) for target_item in target_items: - if _merge_stacks_autodelete(target_item, item) == MergeResult.SUCCESS: + if _merge_stacks(target_item, item) == MergeResult.SUCCESS: return true assert(inventory.add_item(item)) return true -static func _merge_stacks_autodelete(item_dst: InventoryItem, item_src: InventoryItem) -> int: - var result := _merge_stacks(item_dst, item_src) - if result == MergeResult.SUCCESS: - if item_src.get_inventory(): - item_src.get_inventory().remove_item(item_src) - item_src.queue_free() - return result - - static func _merge_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> int: assert(item_dst != null, "item_dst is null!") assert(item_src != null, "item_src is null!") @@ -144,8 +146,8 @@ static func _merge_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> i if free_dst_stack_space <= 0: return MergeResult.FAIL - set_item_stack_size(item_src, max(src_size - free_dst_stack_space, 0)) - set_item_stack_size(item_dst, min(dst_size + src_size, dst_max_size)) + assert(set_item_stack_size(item_src, max(src_size - free_dst_stack_space, 0))) + assert(set_item_stack_size(item_dst, min(dst_size + src_size, dst_max_size))) if free_dst_stack_space >= src_size: return MergeResult.SUCCESS @@ -168,8 +170,8 @@ static func split_stack(item: InventoryItem, new_stack_size: int) -> InventoryIt if new_item.get_parent(): new_item.get_parent().remove_child(new_item) - set_item_stack_size(new_item, new_stack_size) - set_item_stack_size(item, stack_size - new_stack_size) + assert(set_item_stack_size(new_item, new_stack_size)) + assert(set_item_stack_size(item, stack_size - new_stack_size)) return new_item @@ -192,7 +194,7 @@ func join_stacks( return false # TODO: Check if this can be an assertion - _merge_stacks_autodelete(item_dst, item_src) + _merge_stacks(item_dst, item_src) return true @@ -218,6 +220,10 @@ func get_space_for(item: InventoryItem) -> ItemCount: return ItemCount.inf() +func has_space_for(item: InventoryItem) -> bool: + return true + + func get_free_stack_space_for(item: InventoryItem) -> ItemCount: assert(inventory != null, "Inventory not set!") @@ -239,7 +245,7 @@ func pack_item(item: InventoryItem) -> void: var mergable_items = get_mergable_items(item) for mergable_item in mergable_items: - var merge_result := _merge_stacks_autodelete(mergable_item, item) + var merge_result := _merge_stacks(mergable_item, item) if merge_result == MergeResult.SUCCESS: return @@ -268,7 +274,7 @@ func transfer_autosplit(item: InventoryItem, destination: Inventory) -> Inventor func _get_space_for_single_item(inventory: Inventory, item: InventoryItem) -> ItemCount: var single_item := item.duplicate() - set_item_stack_size(single_item, 1) + assert(set_item_stack_size(single_item, 1)) var count := inventory._constraint_manager.get_space_for(single_item) single_item.free() return count diff --git a/addons/gloot/core/constraints/weight_constraint.gd b/addons/gloot/core/constraints/weight_constraint.gd index 6dd701b7..9ca9b58e 100644 --- a/addons/gloot/core/constraints/weight_constraint.gd +++ b/addons/gloot/core/constraints/weight_constraint.gd @@ -102,6 +102,13 @@ func get_space_for(item: InventoryItem) -> ItemCount: return ItemCount.new(floor(get_free_space() / unit_weight)) +func has_space_for(item: InventoryItem) -> bool: + if has_unlimited_capacity(): + return true + var item_weight := get_item_weight(item) + return get_free_space() >= item_weight + + func reset() -> void: capacity = 0.0 diff --git a/addons/gloot/core/inventory.gd b/addons/gloot/core/inventory.gd index e1628044..6c926c43 100644 --- a/addons/gloot/core/inventory.gd +++ b/addons/gloot/core/inventory.gd @@ -1,4 +1,5 @@ @tool +@icon("res://addons/gloot/images/icon_inventory.svg") extends Node class_name Inventory @@ -16,6 +17,7 @@ const ConstraintManager = preload("res://addons/gloot/core/constraints/constrain set(new_item_protoset): if new_item_protoset == item_protoset: return + # TODO: Maybe the inventory should be cleared here? if not _items.is_empty(): return item_protoset = new_item_protoset @@ -53,7 +55,7 @@ func _enter_tree(): func _exit_tree(): - _items.clear() + _items.clear() func _init() -> void: @@ -69,7 +71,8 @@ func _on_item_added(item: InventoryItem) -> void: _items.append(item) contents_changed.emit() _connect_item_signals(item) - _constraint_manager._on_item_added(item) + if _constraint_manager: + _constraint_manager._on_item_added(item) item_added.emit(item) @@ -77,7 +80,8 @@ func _on_item_removed(item: InventoryItem) -> void: _items.erase(item) contents_changed.emit() _disconnect_item_signals(item) - _constraint_manager._on_item_removed(item) + if _constraint_manager: + _constraint_manager._on_item_removed(item) item_removed.emit(item) @@ -105,21 +109,21 @@ func get_item_count() -> int: func _connect_item_signals(item: InventoryItem) -> void: - if !item.protoset_changed.is_connected(Callable(self, "_emit_item_modified")): - item.protoset_changed.connect(Callable(self, "_emit_item_modified").bind(item)) - if !item.prototype_id_changed.is_connected(Callable(self, "_emit_item_modified")): - item.prototype_id_changed.connect(Callable(self, "_emit_item_modified").bind(item)) - if !item.properties_changed.is_connected(Callable(self, "_emit_item_modified")): - item.properties_changed.connect(Callable(self, "_emit_item_modified").bind(item)) + if !item.protoset_changed.is_connected(_emit_item_modified): + item.protoset_changed.connect(_emit_item_modified.bind(item)) + if !item.prototype_id_changed.is_connected(_emit_item_modified): + item.prototype_id_changed.connect(_emit_item_modified.bind(item)) + if !item.properties_changed.is_connected(_emit_item_modified): + item.properties_changed.connect(_emit_item_modified.bind(item)) func _disconnect_item_signals(item:InventoryItem) -> void: - if item.protoset_changed.is_connected(Callable(self, "_emit_item_modified")): - item.protoset_changed.disconnect(Callable(self, "_emit_item_modified")) - if item.prototype_id_changed.is_connected(Callable(self, "_emit_item_modified")): - item.prototype_id_changed.disconnect(Callable(self, "_emit_item_modified")) - if item.properties_changed.is_connected(Callable(self, "_emit_item_modified")): - item.properties_changed.disconnect(Callable(self, "_emit_item_modified")) + if item.protoset_changed.is_connected(_emit_item_modified): + item.protoset_changed.disconnect(_emit_item_modified) + if item.prototype_id_changed.is_connected(_emit_item_modified): + item.prototype_id_changed.disconnect(_emit_item_modified) + if item.properties_changed.is_connected(_emit_item_modified): + item.properties_changed.disconnect(_emit_item_modified) func _emit_item_modified(item: InventoryItem) -> void: diff --git a/addons/gloot/core/inventory_grid.gd b/addons/gloot/core/inventory_grid.gd index a28e94a3..8581cd5f 100644 --- a/addons/gloot/core/inventory_grid.gd +++ b/addons/gloot/core/inventory_grid.gd @@ -1,4 +1,5 @@ @tool +@icon("res://addons/gloot/images/icon_inventory_grid.svg") extends Inventory class_name InventoryGrid @@ -8,6 +9,10 @@ const DEFAULT_SIZE: Vector2i = Vector2i(10, 10) @export var size: Vector2i = DEFAULT_SIZE : get: + if _constraint_manager == null: + return DEFAULT_SIZE + if _constraint_manager.get_grid_constraint() == null: + return DEFAULT_SIZE return _constraint_manager.get_grid_constraint().size set(new_size): _constraint_manager.get_grid_constraint().size = new_size @@ -16,11 +21,7 @@ const DEFAULT_SIZE: Vector2i = Vector2i(10, 10) func _init() -> void: super._init() _constraint_manager.enable_grid_constraint() - _constraint_manager.get_grid_constraint().size_changed.connect(Callable(self, "_on_size_changed")) - - -func _on_size_changed() -> void: - size_changed.emit() + _constraint_manager.get_grid_constraint().size_changed.connect(func(): size_changed.emit()) func get_item_position(item: InventoryItem) -> Vector2i: diff --git a/addons/gloot/core/inventory_grid_stacked.gd b/addons/gloot/core/inventory_grid_stacked.gd index 640e4a13..d5091597 100644 --- a/addons/gloot/core/inventory_grid_stacked.gd +++ b/addons/gloot/core/inventory_grid_stacked.gd @@ -1,4 +1,5 @@ @tool +@icon("res://addons/gloot/images/icon_inventory_grid_stacked.svg") extends InventoryGrid class_name InventoryGridStacked @@ -6,62 +7,62 @@ const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_con func _init() -> void: - super._init() - _constraint_manager.enable_stacks_constraint_() + super._init() + _constraint_manager.enable_stacks_constraint() func has_place_for(item: InventoryItem) -> bool: - return _constraint_manager.has_space_for(item) + return _constraint_manager.has_space_for(item) func add_item_automerge(item: InventoryItem) -> bool: - return _constraint_manager.get_stacks_constraint().add_item_automerge(item) - - + return _constraint_manager.get_stacks_constraint().add_item_automerge(item) + + func split(item: InventoryItem, new_stack_size: int) -> InventoryItem: - return _constraint_manager.get_stacks_constraint().split_stack_safe(item, new_stack_size) + return _constraint_manager.get_stacks_constraint().split_stack_safe(item, new_stack_size) func join(item_dst: InventoryItem, item_src: InventoryItem) -> bool: - return _constraint_manager.get_stacks_constraint().join_stacks(item_dst, item_src) + return _constraint_manager.get_stacks_constraint().join_stacks(item_dst, item_src) static func get_item_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_stack_size(item) + return StacksConstraint.get_item_stack_size(item) -static func set_item_stack_size(item: InventoryItem, new_stack_size: int) -> void: - StacksConstraint.set_item_stack_size(item, new_stack_size) +static func set_item_stack_size(item: InventoryItem, new_stack_size: int) -> bool: + return StacksConstraint.set_item_stack_size(item, new_stack_size) static func get_item_max_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_max_stack_size(item) + return StacksConstraint.get_item_max_stack_size(item) static func set_item_max_stack_size(item: InventoryItem, new_stack_size: int) -> void: - StacksConstraint.set_item_max_stack_size(item, new_stack_size) + StacksConstraint.set_item_max_stack_size(item, new_stack_size) func get_prototype_stack_size(prototype_id: String) -> int: - return _constraint_manager.get_stacks_constraint().get_prototype_stack_size(item_protoset, prototype_id) + return _constraint_manager.get_stacks_constraint().get_prototype_stack_size(item_protoset, prototype_id) func get_prototype_max_stack_size(prototype_id: String) -> int: - return _constraint_manager.get_stacks_constraint().get_prototype_max_stack_size(item_protoset, prototype_id) + return _constraint_manager.get_stacks_constraint().get_prototype_max_stack_size(item_protoset, prototype_id) func transfer_automerge(item: InventoryItem, destination: Inventory) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_automerge(item, destination) + return _constraint_manager.get_stacks_constraint().transfer_automerge(item, destination) func transfer_autosplitmerge(item: InventoryItem, destination: Inventory) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_autosplitmerge(item, destination) + return _constraint_manager.get_stacks_constraint().transfer_autosplitmerge(item, destination) func transfer_to(item: InventoryItem, destination: Inventory, position: Vector2i) -> bool: - return _constraint_manager.get_grid_constraint().transfer_to(item, destination._constraint_manager.get_grid_constraint(), position) + return _constraint_manager.get_grid_constraint().transfer_to(item, destination._constraint_manager.get_grid_constraint(), position) func _get_mergable_item_at(item: InventoryItem, position: Vector2i) -> InventoryItem: - return _constraint_manager.get_grid_constraint()._get_mergable_item_at(item, position) + return _constraint_manager.get_grid_constraint()._get_mergable_item_at(item, position) diff --git a/addons/gloot/core/inventory_grid_transfer.tscn b/addons/gloot/core/inventory_grid_transfer.tscn deleted file mode 100644 index 37da785e..00000000 --- a/addons/gloot/core/inventory_grid_transfer.tscn +++ /dev/null @@ -1,141 +0,0 @@ -[gd_scene load_steps=9 format=3 uid="uid://jopigw4xplp4"] - -[ext_resource type="Resource" uid="uid://ddrmqwl3guset" path="res://tests/data/item_definitions_grid.tres" id="1"] -[ext_resource type="Script" path="res://addons/gloot/core/inventory_grid.gd" id="2"] -[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_grid.gd" id="3"] -[ext_resource type="Script" path="res://examples/inventory_grid_transfer.gd" id="4"] -[ext_resource type="Texture2D" uid="uid://b2hkcwwq10cut" path="res://icon.png" id="5"] -[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_item_slot.gd" id="6"] -[ext_resource type="Script" path="res://addons/gloot/core/item_slot.gd" id="7"] -[ext_resource type="Script" path="res://addons/gloot/core/inventory_item.gd" id="8"] - -[node name="InventoryGridTransfer" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("4") - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] -layout_mode = 2 - -[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/HBoxContainer/VBoxContainer"] -layout_mode = 2 - -[node name="CtrlInventoryGridLeft" type="Container" parent="VBoxContainer/HBoxContainer/VBoxContainer/PanelContainer"] -texture_filter = 1 -custom_minimum_size = Vector2(160, 160) -layout_mode = 2 -script = ExtResource("3") -inventory_path = NodePath("../../../../../InventoryGridLeft") -default_item_texture = ExtResource("5") - -[node name="BtnSortLeft" type="Button" parent="VBoxContainer/HBoxContainer/VBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Sort" - -[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] -layout_mode = 2 - -[node name="PanelContainer2" type="PanelContainer" parent="VBoxContainer/HBoxContainer/VBoxContainer2"] -layout_mode = 2 - -[node name="CtrlInventoryGridRight" type="Container" parent="VBoxContainer/HBoxContainer/VBoxContainer2/PanelContainer2"] -texture_filter = 1 -custom_minimum_size = Vector2(160, 160) -layout_mode = 2 -script = ExtResource("3") -inventory_path = NodePath("../../../../../InventoryGridRight") -default_item_texture = ExtResource("5") - -[node name="BtnSortRight" type="Button" parent="VBoxContainer/HBoxContainer/VBoxContainer2"] -layout_mode = 2 -size_flags_horizontal = 3 -text = "Sort" - -[node name="VBoxContainer3" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer/VBoxContainer3"] -layout_mode = 2 -text = "Item Slot:" - -[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/HBoxContainer/VBoxContainer3"] -layout_mode = 2 - -[node name="CtrlItemSlot" type="HBoxContainer" parent="VBoxContainer/HBoxContainer/VBoxContainer3/PanelContainer"] -custom_minimum_size = Vector2(32, 32) -layout_mode = 2 -script = ExtResource("6") -item_slot_path = NodePath("../../../../../ItemSlot") -label_visible = false - -[node name="BtnUnequip" type="Button" parent="VBoxContainer/HBoxContainer/VBoxContainer3"] -layout_mode = 2 -text = "Unequip" - -[node name="Label" type="Label" parent="VBoxContainer"] -layout_mode = 2 -text = "Drag and drop items to transfer them from one inventory to the other. -Press the 'Sort' buttons to sort the inventories. -Drag items from the right inventory onto the item slot to equip it. -Use the 'Unequip' button to unequip it." - -[node name="InventoryGridLeft" type="Node" parent="."] -script = ExtResource("2") -size = Vector2i(5, 5) -item_protoset = ExtResource("1") - -[node name="L_item_2x2" type="Node" parent="InventoryGridLeft"] -script = ExtResource("8") -protoset = ExtResource("1") -prototype_id = "item_2x2" - -[node name="L_item_2x2_2" type="Node" parent="InventoryGridLeft"] -script = ExtResource("8") -protoset = ExtResource("1") -prototype_id = "item_2x2" -properties = { -"grid_position": Vector2i(0, 2) -} - -[node name="InventoryGridRight" type="Node" parent="."] -script = ExtResource("2") -size = Vector2i(5, 5) -item_protoset = ExtResource("1") - -[node name="R_item_2x2" type="Node" parent="InventoryGridRight"] -script = ExtResource("8") -protoset = ExtResource("1") -prototype_id = "item_2x2" - -[node name="R_item_1x1" type="Node" parent="InventoryGridRight"] -script = ExtResource("8") -protoset = ExtResource("1") -prototype_id = "item_1x1" -properties = { -"grid_position": Vector2i(0, 2) -} - -[node name="ItemSlot" type="Node" parent="."] -script = ExtResource("7") -inventory_path = NodePath("../InventoryGridRight") - -[node name="LblInfo" type="Label" parent="."] -visible = false -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 14.0 diff --git a/addons/gloot/core/inventory_item.gd b/addons/gloot/core/inventory_item.gd index aec3a313..a23a6624 100644 --- a/addons/gloot/core/inventory_item.gd +++ b/addons/gloot/core/inventory_item.gd @@ -1,10 +1,15 @@ @tool +@icon("res://addons/gloot/images/icon_item.svg") extends Node class_name InventoryItem signal protoset_changed signal prototype_id_changed signal properties_changed +signal added_to_inventory(inventory) +signal removed_from_inventory(inventory) +signal equipped_in_slot(item_slot) +signal removed_from_slot(item_slot) @export var protoset: Resource : get: @@ -18,7 +23,7 @@ signal properties_changed if new_protoset && new_protoset._prototypes && new_protoset._prototypes.keys().size() > 0: self.prototype_id = new_protoset._prototypes.keys()[0] - new_protoset.changed.connect(Callable(self, "_on_protoset_modified")) + new_protoset.changed.connect(func(): update_configuration_warnings()) protoset = new_protoset protoset_changed.emit() @@ -43,7 +48,8 @@ signal properties_changed properties_changed.emit() update_configuration_warnings() -var _inventory: Node +var _inventory: Inventory +var _item_slot: ItemSlot const KEY_PROTOSET: String = "protoset" const KEY_PROTOTYE_ID: String = "prototype_id" @@ -68,10 +74,6 @@ func _get_configuration_warnings() -> PackedStringArray: return PackedStringArray() -func _on_protoset_modified() -> void: - update_configuration_warnings() - - func reset_properties() -> void: if !protoset || prototype_id.is_empty(): properties = {} @@ -87,30 +89,63 @@ func reset_properties() -> void: func _notification(what): if what == NOTIFICATION_PARENTED: - if !(get_parent() is Inventory): - _inventory = null - return - _inventory = get_parent() - var inv_item_protoset = get_parent().get("item_protoset") - if inv_item_protoset: - protoset = inv_item_protoset - _on_item_added(get_parent()) + _on_parented(get_parent()) elif what == NOTIFICATION_UNPARENTED: - _on_item_removed(_inventory) + _on_unparented() + + +func _on_parented(parent: Node) -> void: + if parent is Inventory: + _on_added_to_inventory(parent as Inventory) + else: _inventory = null + if parent is ItemSlot: + _link_to_slot(parent as ItemSlot) + else: + _unlink_from_slot() + + +func _on_added_to_inventory(inventory: Inventory) -> void: + assert(inventory != null) + _inventory = inventory + if _inventory.item_protoset: + protoset = _inventory.item_protoset + + added_to_inventory.emit(_inventory) + _inventory._on_item_added(self) -func _on_item_removed(obj: Object): - if obj && obj.has_method("_on_item_removed"): - obj._on_item_removed(self) +func _on_unparented() -> void: + if _inventory: + _on_removed_from_inventory(_inventory) + _inventory = null -func _on_item_added(obj: Object): - if obj && obj.has_method("_on_item_added"): - obj._on_item_added(self) + _unlink_from_slot() + + +func _on_removed_from_inventory(inventory: Inventory) -> void: + if inventory: + removed_from_inventory.emit(inventory) + inventory._on_item_removed(self) + + +func _link_to_slot(item_slot: ItemSlot) -> void: + _item_slot = item_slot + _item_slot._on_item_added(self) + equipped_in_slot.emit(item_slot) + + +func _unlink_from_slot() -> void: + if _item_slot == null: + return + var temp_slot := _item_slot + _item_slot = null + temp_slot._on_item_removed() + removed_from_slot.emit(temp_slot) -func get_inventory() -> Node: +func get_inventory() -> Inventory: return _inventory diff --git a/addons/gloot/core/inventory_stacked.gd b/addons/gloot/core/inventory_stacked.gd index 137c3f55..92dae13f 100644 --- a/addons/gloot/core/inventory_stacked.gd +++ b/addons/gloot/core/inventory_stacked.gd @@ -1,4 +1,5 @@ @tool +@icon("res://addons/gloot/images/icon_inventory_stacked.svg") extends Inventory class_name InventoryStacked @@ -8,88 +9,88 @@ signal capacity_changed signal occupied_space_changed @export var capacity: float : - get: - return _constraint_manager.get_weight_constraint().capacity - set(new_capacity): - _constraint_manager.get_weight_constraint().capacity = new_capacity + get: + if _constraint_manager == null: + return 0.0 + if _constraint_manager.get_weight_constraint() == null: + return 0.0 + return _constraint_manager.get_weight_constraint().capacity + set(new_capacity): + _constraint_manager.get_weight_constraint().capacity = new_capacity var occupied_space: float : - get: - return _constraint_manager.get_weight_constraint().occupied_space - set(new_occupied_space): - assert(false, "occupied_space is read-only!") + get: + if _constraint_manager == null: + return 0.0 + if _constraint_manager.get_weight_constraint() == null: + return 0.0 + return _constraint_manager.get_weight_constraint().occupied_space + set(new_occupied_space): + assert(false, "occupied_space is read-only!") func _init() -> void: - super._init() - _constraint_manager.enable_weight_constraint_() - _constraint_manager.enable_stacks_constraint_() - _constraint_manager.get_weight_constraint().capacity_changed.connect(Callable(self, "_on_capacity_changed")) - _constraint_manager.get_weight_constraint().occupied_space_changed.connect(Callable(self, "_on_occupied_space_changed")) - - -func _on_capacity_changed() -> void: - capacity_changed.emit() - - -func _on_occupied_space_changed() -> void: - occupied_space_changed.emit() + super._init() + _constraint_manager.enable_weight_constraint() + _constraint_manager.enable_stacks_constraint() + _constraint_manager.get_weight_constraint().capacity_changed.connect(func(): capacity_changed.emit()) + _constraint_manager.get_weight_constraint().occupied_space_changed.connect(func(): occupied_space_changed.emit()) func has_unlimited_capacity() -> bool: - return _constraint_manager.get_weight_constraint().has_unlimited_capacity() + return _constraint_manager.get_weight_constraint().has_unlimited_capacity() func get_free_space() -> float: - return _constraint_manager.get_weight_constraint().get_free_space() + return _constraint_manager.get_weight_constraint().get_free_space() func has_place_for(item: InventoryItem) -> bool: - return _constraint_manager.has_space_for(item) + return _constraint_manager.has_space_for(item) func add_item_automerge(item: InventoryItem) -> bool: - return _constraint_manager.get_stacks_constraint().add_item_automerge(item) + return _constraint_manager.get_stacks_constraint().add_item_automerge(item) func split(item: InventoryItem, new_stack_size: int) -> InventoryItem: - return _constraint_manager.get_stacks_constraint().split_stack_safe(item, new_stack_size) + return _constraint_manager.get_stacks_constraint().split_stack_safe(item, new_stack_size) func join(item_dst: InventoryItem, item_src: InventoryItem) -> bool: - return _constraint_manager.get_stacks_constraint().join_stacks(item_dst, item_src) + return _constraint_manager.get_stacks_constraint().join_stacks(item_dst, item_src) static func get_item_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_stack_size(item) + return StacksConstraint.get_item_stack_size(item) -static func set_item_stack_size(item: InventoryItem, new_stack_size: int) -> void: - return StacksConstraint.set_item_stack_size(item, new_stack_size) +static func set_item_stack_size(item: InventoryItem, new_stack_size: int) -> bool: + return StacksConstraint.set_item_stack_size(item, new_stack_size) static func get_item_max_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_max_stack_size(item) + return StacksConstraint.get_item_max_stack_size(item) static func set_item_max_stack_size(item: InventoryItem, new_stack_size: int) -> void: - return StacksConstraint.set_item_max_stack_size(item, new_stack_size) + StacksConstraint.set_item_max_stack_size(item, new_stack_size) func get_prototype_stack_size(prototype_id: String) -> int: - return StacksConstraint.get_prototype_stack_size(item_protoset, prototype_id) + return StacksConstraint.get_prototype_stack_size(item_protoset, prototype_id) func get_prototype_max_stack_size(prototype_id: String) -> int: - return StacksConstraint.get_prototype_max_stack_size(item_protoset, prototype_id) + return StacksConstraint.get_prototype_max_stack_size(item_protoset, prototype_id) func transfer_autosplit(item: InventoryItem, destination: InventoryStacked) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_autosplit(item, destination) != null + return _constraint_manager.get_stacks_constraint().transfer_autosplit(item, destination) != null func transfer_automerge(item: InventoryItem, destination: InventoryStacked) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_automerge(item, destination) + return _constraint_manager.get_stacks_constraint().transfer_automerge(item, destination) func transfer_autosplitmerge(item: InventoryItem, destination: InventoryStacked) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_autosplitmerge(item, destination) + return _constraint_manager.get_stacks_constraint().transfer_autosplitmerge(item, destination) diff --git a/addons/gloot/core/item_count.gd b/addons/gloot/core/item_count.gd index 1829991c..28a0fc9d 100644 --- a/addons/gloot/core/item_count.gd +++ b/addons/gloot/core/item_count.gd @@ -3,108 +3,114 @@ class_name ItemCount const Inf: int = -1 @export var count: int = 0 : - get: - return count - set(new_count): - if new_count < 0: - new_count = -1 - count = new_count + get: + return count + set(new_count): + if new_count < 0: + new_count = -1 + count = new_count func _init(count_: int = 0) -> void: - if count_ < 0: - count_ = -1 - count = count_ + if count_ < 0: + count_ = -1 + count = count_ func is_inf() -> bool: - return count < 0 + return count < 0 func add(item_count_: ItemCount) -> ItemCount: - if item_count_.is_inf(): - count = Inf - elif !self.is_inf(): - count += item_count_.count + if item_count_.is_inf(): + count = Inf + elif !self.is_inf(): + count += item_count_.count - return self + return self func mul(item_count_: ItemCount) -> ItemCount: - if (count == 0): - return self - if item_count_.is_inf(): - count = Inf - return self - if item_count_.count == 0: - count = 0 - return self - if self.is_inf(): - return self + if (count == 0): + return self + if item_count_.is_inf(): + count = Inf + return self + if item_count_.count == 0: + count = 0 + return self + if self.is_inf(): + return self - count *= item_count_.count - return self + count *= item_count_.count + return self func div(item_count_: ItemCount) -> ItemCount: - assert(item_count_.count > 0 || item_count_.is_inf(), "Can't devide by zero!") - if (count == 0): - return self - if item_count_.is_inf() && self.is_inf(): - count = 1 - return self - if self.is_inf(): - return self - if item_count_.is_inf(): - count = 0 - return self - - count /= item_count_.count - return self + assert(item_count_.count > 0 || item_count_.is_inf(), "Can't devide by zero!") + if (count == 0): + return self + if item_count_.is_inf() && self.is_inf(): + count = 1 + return self + if self.is_inf(): + return self + if item_count_.is_inf(): + count = 0 + return self + + count /= item_count_.count + return self func eq(item_count_: ItemCount) -> bool: - return item_count_.count == count + return item_count_.count == count func less(item_count_: ItemCount) -> bool: - if item_count_.is_inf(): - if self.is_inf(): - return false - return true + if item_count_.is_inf(): + if self.is_inf(): + return false + return true - if self.is_inf(): - return false + if self.is_inf(): + return false - return count < item_count_.count + return count < item_count_.count + + +func le(item_count_: ItemCount) -> bool: + return self.less(item_count_) || self.eq(item_count_) func gt(item_count_: ItemCount) -> bool: - if item_count_.is_inf(): - if self.is_inf(): - return false - return false + if item_count_.is_inf(): + if self.is_inf(): + return false + return false + + if self.is_inf(): + return true + + return count > item_count_.count - if self.is_inf(): - return true - return count > item_count_.count +func ge(item_count_: ItemCount) -> bool: + return self.gt(item_count_) || self.eq(item_count_) static func min(item_count_l: ItemCount, item_count_r: ItemCount) -> ItemCount: - if item_count_l.less(item_count_r): - return item_count_l - return item_count_r + if item_count_l.less(item_count_r): + return item_count_l + return item_count_r static func inf() -> ItemCount: - return ItemCount.new(Inf) + return ItemCount.new(Inf) static func zero() -> ItemCount: - return ItemCount.new(0) + return ItemCount.new(0) -# TODO: Implement le() -# TODO: Implement ge() # TODO: Implement max() diff --git a/addons/gloot/core/item_protoset.gd b/addons/gloot/core/item_protoset.gd index 14ac2a0d..bf6c48ad 100644 --- a/addons/gloot/core/item_protoset.gd +++ b/addons/gloot/core/item_protoset.gd @@ -1,128 +1,139 @@ @tool +@icon("res://addons/gloot/images/icon_item_protoset.svg") class_name ItemProtoset extends Resource const KEY_ID: String = "id" @export_multiline var json_data : - get: - return json_data - set(new_json_data): - json_data = new_json_data - if !json_data.is_empty(): - parse(json_data) - _save() + get: + return json_data + set(new_json_data): + json_data = new_json_data + if !json_data.is_empty(): + parse(json_data) + _save() var _prototypes: Dictionary = {} : - get: - return _prototypes - set(new_prototypes): - _prototypes = new_prototypes - _update_json_data() - _save() + get: + return _prototypes + set(new_prototypes): + _prototypes = new_prototypes + _update_json_data() + _save() func parse(json: String) -> void: - _prototypes.clear() + _prototypes.clear() - var test_json_conv: JSON = JSON.new() - assert(test_json_conv.parse(json) == OK, "Failed to parse JSON!") - var parse_result = test_json_conv.data - assert(parse_result is Array, "JSON file must contain an array!") + var test_json_conv: JSON = JSON.new() + assert(test_json_conv.parse(json) == OK, "Failed to parse JSON!") + var parse_result = test_json_conv.data + assert(parse_result is Array, "JSON file must contain an array!") - for prototype in parse_result: - assert(prototype is Dictionary, "Item definition must be a dictionary!") - assert(prototype.has(KEY_ID), "Item definition must have an '%s' property!" % KEY_ID) - assert(prototype[KEY_ID] is String, "'%s' property must be a string!" % KEY_ID) + for prototype in parse_result: + assert(prototype is Dictionary, "Item prototype must be a dictionary!") + assert(prototype.has(KEY_ID), "Item prototype must have an '%s' property!" % KEY_ID) + assert(prototype[KEY_ID] is String, "'%s' property must be a string!" % KEY_ID) - var id = prototype[KEY_ID] - assert(!_prototypes.has(id), "Item definition ID '%s' already in use!") - _prototypes[id] = prototype - _unstringify_prototype(_prototypes[id]) + var id = prototype[KEY_ID] + assert(!_prototypes.has(id), "Item prototype ID '%s' already in use!" % id) + _prototypes[id] = prototype + _unstringify_prototype(_prototypes[id]) func _to_json() -> String: - var result: Array[Dictionary] - for prototype_id in _prototypes.keys(): - result.append(get_prototype(prototype_id)) + var result: Array[Dictionary] + for prototype_id in _prototypes.keys(): + result.append(get_prototype(prototype_id)) - for prototype in result: - _stringify_prototype(prototype) + for prototype in result: + _stringify_prototype(prototype) - # TODO: Add plugin settings for this - return JSON.stringify(result, " ") + # TODO: Add plugin settings for this + return JSON.stringify(result, " ") func _stringify_prototype(prototype: Dictionary) -> void: - for key in prototype.keys(): - var type = typeof(prototype[key]) - if (type != TYPE_STRING) and (type != TYPE_FLOAT): - prototype[key] = var_to_str(prototype[key]) + for key in prototype.keys(): + var type = typeof(prototype[key]) + if (type != TYPE_STRING) and (type != TYPE_FLOAT): + prototype[key] = var_to_str(prototype[key]) func _unstringify_prototype(prototype: Dictionary) -> void: - for key in prototype.keys(): - var type = typeof(prototype[key]) - if type == TYPE_STRING: - var variant = str_to_var(prototype[key]) - if variant != null: - prototype[key] = variant + for key in prototype.keys(): + var type = typeof(prototype[key]) + if type == TYPE_STRING: + var variant = str_to_var(prototype[key]) + if variant != null: + prototype[key] = variant func _update_json_data() -> void: - json_data = _to_json() + json_data = _to_json() func _save() -> void: - emit_changed() - if !resource_path.is_empty(): - ResourceSaver.save(self) + emit_changed() + if !resource_path.is_empty(): + ResourceSaver.save(self) func get_prototype(id: StringName) -> Variant: - assert(has_prototype(id), "No prototype") - return _prototypes[id] + assert(has_prototype(id), "No prototype") + return _prototypes[id] func add_prototype(id: String) -> void: - assert(!has_prototype(id), "Prototype with ID already exists") - _prototypes[id] = {KEY_ID: id} - _update_json_data() - _save() + assert(!has_prototype(id), "Prototype with ID already exists") + _prototypes[id] = {KEY_ID: id} + _update_json_data() + _save() func remove_prototype(id: String) -> void: - assert(has_prototype(id), "No prototype for ID") - _prototypes.erase(id) - _update_json_data() - _save() + assert(has_prototype(id), "No prototype for ID") + _prototypes.erase(id) + _update_json_data() + _save() + + +func duplicate_prototype(id: String) -> void: + assert(has_prototype(id), "No prototype for ID") + var new_id = "%s_duplicate" % id + var new_dict = _prototypes[id].duplicate() + new_dict[KEY_ID] = new_id + _prototypes[new_id] = new_dict + _update_json_data() + _save() func rename_prototype(id: String, new_id: String) -> void: - assert(has_prototype(id), "No prototype for ID") - assert(!has_prototype(new_id), "Prototype with ID already exists") - add_prototype(new_id) - _prototypes[new_id] = _prototypes[id].duplicate() - _prototypes[new_id][KEY_ID] = new_id - remove_prototype(id) - _update_json_data() - _save() + assert(has_prototype(id), "No prototype for ID") + assert(!has_prototype(new_id), "Prototype with ID already exists") + add_prototype(new_id) + _prototypes[new_id] = _prototypes[id].duplicate() + _prototypes[new_id][KEY_ID] = new_id + remove_prototype(id) + _update_json_data() + _save() func set_prototype_properties(id: String, new_properties: Dictionary) -> void: - _prototypes[id] = new_properties - _update_json_data() - _save() + _prototypes[id] = new_properties + _update_json_data() + _save() func has_prototype(id: String) -> bool: - return _prototypes.has(id) + return _prototypes.has(id) func get_item_property(id: String, property_name: String, default_value = null) -> Variant: - if has_prototype(id): - var prototype = get_prototype(id) - if !prototype.is_empty() && prototype.has(property_name): - return prototype[property_name] - - return default_value + if has_prototype(id): + var prototype = get_prototype(id) + if !prototype.is_empty() && prototype.has(property_name): + return prototype[property_name] + + return default_value diff --git a/addons/gloot/core/item_ref_slot.gd b/addons/gloot/core/item_ref_slot.gd new file mode 100644 index 00000000..71f7880e --- /dev/null +++ b/addons/gloot/core/item_ref_slot.gd @@ -0,0 +1,193 @@ +@tool +@icon("res://addons/gloot/images/icon_item_ref_slot.svg") +class_name ItemRefSlot +extends "res://addons/gloot/core/item_slot_base.gd" + +signal inventory_changed + +const Verify = preload("res://addons/gloot/core/verify.gd") +const KEY_ITEM_INDEX: String = "item_index" +const EMPTY_SLOT = -1 + +@export var inventory_path: NodePath : + get: + return inventory_path + set(new_inv_path): + if inventory_path == new_inv_path: + return + inventory_path = new_inv_path + update_configuration_warnings() + _set_inventory_from_path(inventory_path) + +var _wr_item: WeakRef = weakref(null) +var _wr_inventory: WeakRef = weakref(null) +@export var _equipped_item: int = EMPTY_SLOT : + get = _get_equipped_item_index, set = _set_equipped_item_index +var inventory: Inventory = null : + get = _get_inventory, set = _set_inventory + + +func _get_configuration_warnings() -> PackedStringArray: + if inventory_path.is_empty(): + return PackedStringArray([ + "Inventory path not set! Inventory path needs to point to an inventory node, so " +\ + "items from that inventory can be equipped in the slot."]) + return PackedStringArray() + + +func _get_equipped_item_index() -> int: + return _equipped_item + + +func _set_equipped_item_index(new_value: int) -> void: + _equipped_item = new_value + equip_by_index(new_value) + + +func _ready() -> void: + _set_inventory_from_path(inventory_path) + equip_by_index(_equipped_item) + + +func _set_inventory_from_path(path: NodePath) -> bool: + if path.is_empty(): + return false + + var node: Node = null + + if is_inside_tree(): + node = get_node_or_null(inventory_path) + + if node == null || !(node is Inventory): + return false + + clear() + _set_inventory(node) + return true + + +func _set_inventory(inventory: Inventory) -> void: + if inventory == _wr_inventory.get_ref(): + return + + if _get_inventory() != null: + _disconnect_inventory_signals() + + clear() + _wr_inventory = weakref(inventory) + inventory_changed.emit() + + if _get_inventory() != null: + _connect_inventory_signals() + + +func _connect_inventory_signals() -> void: + if _get_inventory() == null: + return + + if !_get_inventory().item_removed.is_connected(_on_item_removed): + _get_inventory().item_removed.connect(_on_item_removed) + + +func _disconnect_inventory_signals() -> void: + if _get_inventory() == null: + return + + if _get_inventory().item_removed.is_connected(_on_item_removed): + _get_inventory().item_removed.disconnect(_on_item_removed) + + +func _on_item_removed(item: InventoryItem) -> void: + clear() + + +func _get_inventory() -> Inventory: + return _wr_inventory.get_ref() + + +func equip(item: InventoryItem) -> bool: + if !can_hold_item(item): + return false + + if _wr_item.get_ref() == item: + return false + + if get_item() != null && !clear(): + return false + + _wr_item = weakref(item) + _equipped_item = _get_inventory().get_item_index(item) + item_equipped.emit() + return true + + +func equip_by_index(index: int) -> bool: + if _get_inventory() == null: + return false + if index < 0: + return false + if index >= _get_inventory().get_item_count(): + return false + return equip(_get_inventory().get_items()[index]) + + +func clear() -> bool: + if get_item() == null: + return false + + _wr_item = weakref(null) + _equipped_item = EMPTY_SLOT + cleared.emit() + return true + + +func get_item() -> InventoryItem: + return _wr_item.get_ref() + + +func can_hold_item(item: InventoryItem) -> bool: + if item == null: + return false + + if _get_inventory() == null || !_get_inventory().has_item(item): + return false + + return true + + +func reset() -> void: + clear() + + +func serialize() -> Dictionary: + var result: Dictionary = {} + var item : InventoryItem = _wr_item.get_ref() + + if item != null && item.get_inventory() != null: + result[KEY_ITEM_INDEX] = item.get_inventory().get_item_index(item) + + return result + + +func deserialize(source: Dictionary) -> bool: + if !Verify.dict(source, false, KEY_ITEM_INDEX, [TYPE_INT, TYPE_FLOAT]): + return false + + reset() + + if source.has(KEY_ITEM_INDEX): + var item_index: int = source[KEY_ITEM_INDEX] + if !_equip_item_with_index(item_index): + return false + + return true + + +func _equip_item_with_index(item_index: int) -> bool: + if _get_inventory() == null: + return false + if item_index >= _get_inventory().get_item_count(): + return false + equip(_get_inventory().get_items()[item_index]) + return true + diff --git a/addons/gloot/core/item_slot.gd b/addons/gloot/core/item_slot.gd index 730274f6..e297681a 100644 --- a/addons/gloot/core/item_slot.gd +++ b/addons/gloot/core/item_slot.gd @@ -1,181 +1,132 @@ @tool -extends Node +@icon("res://addons/gloot/images/icon_item_slot.svg") class_name ItemSlot +extends "res://addons/gloot/core/item_slot_base.gd" -signal item_set(item) -signal item_cleared -signal inventory_changed(inventory) +signal protoset_changed +const Verify = preload("res://addons/gloot/core/verify.gd") +const KEY_ITEM: String = "item" -@export var inventory_path: NodePath : - get: - return inventory_path - set(new_inv_path): - inventory_path = new_inv_path - update_configuration_warnings() - var node: Node = get_node_or_null(inventory_path) - - if is_inside_tree() && node: - assert(node is Inventory) - - if node == null: - return - - self.inventory = node - -@export var equipped_item: int = -1 : - get: - return equipped_item - set(new_equipped_item): - equipped_item = new_equipped_item - if equipped_item < 0: - self.item = null - return - if inventory: - var items = inventory.get_items() - if equipped_item < items.size() && can_hold_item(items[equipped_item]): - self.item = items[equipped_item] - -var _inventory -var inventory : +@export var item_protoset: ItemProtoset: get: - if !_inventory && !inventory_path.is_empty(): - self._inventory = get_node_or_null(inventory_path) - - return _inventory - set(new_inv): - if new_inv == _inventory: + return item_protoset + set(new_item_protoset): + if new_item_protoset == item_protoset: return + if _item: + _item = null + item_protoset = new_item_protoset + protoset_changed.emit() + update_configuration_warnings() +@export var remember_source_inventory: bool = true - _disconnect_inventory_signals() - self.item = null - _inventory = new_inv - _connect_inventory_signals() +var _wr_source_inventory: WeakRef = weakref(null) +var _item: InventoryItem - inventory_changed.emit(inventory) - -var item: InventoryItem : - get: - return item - set(new_item): - assert(can_hold_item(new_item)) - if inventory == null: - return - if new_item && !inventory.has_item(new_item): - return +func _get_configuration_warnings() -> PackedStringArray: + if item_protoset == null: + return PackedStringArray([ + "This item slot has no protoset. Set the 'item_protoset' field to be able to equip items."]) + return PackedStringArray() - if item != null: - item.tree_exiting.disconnect(Callable(self, "_on_item_tree_exiting")) - item = new_item - if item != null: - item.tree_exiting.connect(Callable(self, "_on_item_tree_exiting")) - item_set.emit(item) - else: - item_cleared.emit() +func equip(item: InventoryItem) -> bool: + if !can_hold_item(item): + return false -const KEY_INVENTORY: String = "inventory" -const KEY_ITEM: String = "item" -const Verify = preload("res://addons/gloot/core/verify.gd") + if item.get_parent() == self: + return false + if get_item() != null && !clear(): + return false -func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "Inventory path not set! Inventory path needs to point to an inventory node, so " +\ - "items from that inventory can be equipped in the slot."]) - return PackedStringArray() + _wr_source_inventory = weakref(item.get_inventory()) + if item.get_parent(): + item.get_parent().remove_child(item) -func _connect_inventory_signals() -> void: - if !inventory: - return + add_child(item) + if Engine.is_editor_hint(): + item.owner = get_tree().edited_scene_root + return true - if !inventory.tree_exiting.is_connected(Callable(self, "_on_inventory_tree_exiting")): - inventory.tree_exiting.connect(Callable(self, "_on_inventory_tree_exiting")) - if !inventory.item_removed.is_connected(Callable(self, "_on_item_removed")): - inventory.item_removed.connect(Callable(self, "_on_item_removed")) +func _on_item_added(item: InventoryItem) -> void: + _item = item + item_equipped.emit() -func _disconnect_inventory_signals() -> void: - if !inventory: - return - if inventory.tree_exiting.is_connected(Callable(self, "_on_inventory_tree_exiting")): - inventory.tree_exiting.disconnect(Callable(self, "_on_inventory_tree_exiting")) - if inventory.item_removed.is_connected(Callable(self, "_on_item_removed")): - inventory.item_removed.disconnect(Callable(self, "_on_item_removed")) +func clear() -> bool: + return _clear_impl(remember_source_inventory) -func can_hold_item(new_item: InventoryItem) -> bool: - if new_item == null: - return true - if inventory == null: +func _clear_impl(return_item: bool) -> bool: + if get_item() == null: return false - if !inventory.has_item(new_item): - return false - + + if return_item: + _return_item_to_source_inventory() + + remove_child(get_item()) return true -func _ready(): - self.inventory = get_node_or_null(inventory_path) - if equipped_item >= 0 && inventory: - var items = inventory.get_items() - if equipped_item < items.size() && can_hold_item(items[equipped_item]): - self.item = items[equipped_item] +func _return_item_to_source_inventory() -> bool: + var inventory: Inventory = (_wr_source_inventory.get_ref() as Inventory) + if inventory != null: + if inventory.add_item(get_item()): + return true + return false + +func _on_item_removed() -> void: + _item = null + _wr_source_inventory = weakref(null) + cleared.emit() -func _on_inventory_tree_exiting(): - inventory = null - self.item = null +func get_item() -> InventoryItem: + return _item -func _on_item_removed(pItem: InventoryItem) -> void: - if pItem == item: - self.item = null +func can_hold_item(item: InventoryItem) -> bool: + assert(item_protoset != null, "Item protoset not set!") + if item == null: + return false + if item_protoset != item.protoset: + return false -func _on_item_tree_exiting(): - self.item = null + return true -func reset(): - self.inventory = null - self.item = null +func reset() -> void: + if _item: + _item.queue_free() + _clear_impl(false) func serialize() -> Dictionary: var result: Dictionary = {} - # TODO: Find a better way to serialize inventory and item references - if inventory: - result[KEY_INVENTORY] = inventory.get_instance_id() - if item: - result[KEY_ITEM] = item.get_instance_id() + if _item != null: + result[KEY_ITEM] = _item.serialize() return result func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, false, KEY_INVENTORY, [TYPE_INT, TYPE_FLOAT]): - return false - if !Verify.dict(source, false, KEY_ITEM, [TYPE_INT, TYPE_FLOAT]): + if !Verify.dict(source, false, KEY_ITEM, [TYPE_DICTIONARY]): return false reset() - if source.has(KEY_INVENTORY): - inventory = instance_from_id(source[KEY_INVENTORY]) - if inventory == null: - print("Warning: Node not found (%s)!" % source[KEY_INVENTORY]) - return false if source.has(KEY_ITEM): - item = instance_from_id(source[KEY_ITEM]) - if item == null: - print("Warning: Node not found (%s)!" % source[KEY_ITEM]) + var item := InventoryItem.new() + if !item.deserialize(source[KEY_ITEM]): return false + equip(item) return true diff --git a/addons/gloot/core/item_slot_base.gd b/addons/gloot/core/item_slot_base.gd new file mode 100644 index 00000000..0c9679ed --- /dev/null +++ b/addons/gloot/core/item_slot_base.gd @@ -0,0 +1,42 @@ +@tool +@icon("res://addons/gloot/images/icon_item_slot.svg") +class_name ItemSlotBase +extends Node + +signal item_equipped +signal cleared + + +# Override this +func equip(item: InventoryItem) -> bool: + return false + + +# Override this +func clear() -> bool: + return false + + +# Override this +func get_item() -> InventoryItem: + return null + + +# Override this +func can_hold_item(item: InventoryItem) -> bool: + return false + + +# Override this +func reset() -> void: + pass + + +# Override this +func serialize() -> Dictionary: + return {} + + +# Override this +func deserialize(source: Dictionary) -> bool: + return false \ No newline at end of file diff --git a/addons/gloot/core/verify.gd b/addons/gloot/core/verify.gd index cbf8a770..db6679d4 100644 --- a/addons/gloot/core/verify.gd +++ b/addons/gloot/core/verify.gd @@ -90,7 +90,7 @@ static func create_var(type: int): TYPE_RID: return RID() TYPE_OBJECT: - return Object() + return Object.new() TYPE_DICTIONARY: return {} TYPE_ARRAY: diff --git a/addons/gloot/editor/common/choice_filter.gd b/addons/gloot/editor/common/choice_filter.gd index bc0168f7..de8b0a81 100644 --- a/addons/gloot/editor/common/choice_filter.gd +++ b/addons/gloot/editor/common/choice_filter.gd @@ -76,10 +76,10 @@ func _populate() -> void: func _ready() -> void: - btn_pick.pressed.connect(Callable(self, "_on_btn_pick")) - line_edit.text_changed.connect(Callable(self, "_on_filter_text_changed")) - item_list.item_activated.connect(Callable(self, "_on_item_activated")) - item_list.item_selected.connect(Callable(self, "_on_item_selected")) + btn_pick.pressed.connect(_on_btn_pick) + line_edit.text_changed.connect(_on_filter_text_changed) + item_list.item_activated.connect(_on_item_activated) + item_list.item_selected.connect(_on_item_selected) refresh() if btn_pick: btn_pick.text = pick_text diff --git a/addons/gloot/editor/common/dict_editor.gd b/addons/gloot/editor/common/dict_editor.gd index 706ee2a1..d2f4d733 100644 --- a/addons/gloot/editor/common/dict_editor.gd +++ b/addons/gloot/editor/common/dict_editor.gd @@ -65,8 +65,8 @@ const supported_types: Array[int] = [ func _ready() -> void: - btn_add.pressed.connect(Callable(self, "_on_btn_add")) - edt_property_name.text_submitted.connect(Callable(self, "_on_text_entered")) + btn_add.pressed.connect(_on_btn_add) + edt_property_name.text_submitted.connect(_on_text_entered) refresh() @@ -150,7 +150,7 @@ func _add_value_editor(key: String) -> void: value_editor.value = dictionary[key] value_editor.size_flags_horizontal = SIZE_EXPAND_FILL value_editor.enabled = (not key in immutable_keys) - value_editor.value_changed.connect(Callable(self, "_on_value_changed").bind(key, value_editor)) + value_editor.value_changed.connect(_on_value_changed.bind(key, value_editor)) grid_container.add_child(value_editor) @@ -166,7 +166,7 @@ func _add_remove_button(key: String) -> void: button.text = remove_button_map[key].text button.disabled = remove_button_map[key].disabled button.icon = remove_button_map[key].icon - button.pressed.connect(Callable(self, "_on_remove_button").bind(key)) + button.pressed.connect(_on_remove_button.bind(key)) grid_container.add_child(button) diff --git a/addons/gloot/editor/common/editor_icons.gd b/addons/gloot/editor/common/editor_icons.gd index bd5a66a8..faed61e3 100644 --- a/addons/gloot/editor/common/editor_icons.gd +++ b/addons/gloot/editor/common/editor_icons.gd @@ -1,7 +1,6 @@ -static func get_icon(editor_interface: EditorInterface, icon_name: String) -> Texture2D: - if editor_interface: - var gui = editor_interface.get_base_control() - var icon = gui.get_theme_icon(icon_name, "EditorIcons") - return icon +@tool - return null +static func get_icon(icon_name: String) -> Texture2D: + var gui = EditorInterface.get_base_control() + var icon = gui.get_theme_icon(icon_name, "EditorIcons") + return icon diff --git a/addons/gloot/editor/common/multivalue_editor.gd b/addons/gloot/editor/common/multivalue_editor.gd index 66112da8..6df449fb 100644 --- a/addons/gloot/editor/common/multivalue_editor.gd +++ b/addons/gloot/editor/common/multivalue_editor.gd @@ -35,8 +35,8 @@ func _ready() -> void: var line_edit: LineEdit = LineEdit.new() line_edit.text = var_to_str(values[i]) line_edit.size_flags_horizontal = SIZE_EXPAND_FILL - line_edit.text_submitted.connect(Callable(self, "_on_line_edit_value_entered").bind(line_edit, i)) - line_edit.focus_exited.connect(Callable(self, "_on_line_edit_focus_exited").bind(line_edit, i)) + line_edit.text_submitted.connect(_on_line_edit_value_entered.bind(line_edit, i)) + line_edit.focus_exited.connect(_on_line_edit_focus_exited.bind(line_edit, i)) line_edit.editable = enabled hbox.add_child(line_edit) diff --git a/addons/gloot/editor/common/value_editor.gd b/addons/gloot/editor/common/value_editor.gd index 6efe66f1..bf14bda1 100644 --- a/addons/gloot/editor/common/value_editor.gd +++ b/addons/gloot/editor/common/value_editor.gd @@ -65,8 +65,8 @@ func _create_line_edit() -> LineEdit: line_edit.text = var_to_str(value) line_edit.editable = enabled _expand_control(line_edit) - line_edit.text_submitted.connect(Callable(self, "_on_line_edit_value_entered").bind(line_edit)) - line_edit.focus_exited.connect(Callable(self, "_on_line_edit_focus_exited").bind(line_edit)) + line_edit.text_submitted.connect(_on_line_edit_value_entered.bind(line_edit)) + line_edit.focus_exited.connect(_on_line_edit_focus_exited.bind(line_edit)) return line_edit @@ -88,7 +88,7 @@ func _create_color_picker() -> ColorPickerButton: picker.color = value picker.disabled = !enabled _expand_control(picker) - picker.popup_closed.connect(Callable(self, "_on_color_picked").bind(picker)) + picker.popup_closed.connect(_on_color_picked.bind(picker)) return picker @@ -102,7 +102,7 @@ func _create_checkbox() -> CheckButton: checkbox.button_pressed = value checkbox.disabled = !enabled _expand_control(checkbox) - checkbox.pressed.connect(Callable(self, "_on_checkbox").bind(checkbox)) + checkbox.pressed.connect(_on_checkbox.bind(checkbox)) return checkbox @@ -114,14 +114,14 @@ func _on_checkbox(checkbox: CheckButton) -> void: func _create_v2_editor() -> Control: var values = [value.x, value.y] var titles = ["X", "Y"] - var v2_editor = _create_multifloat_editor(2, enabled, values, titles, "_on_v2_value_changed") + var v2_editor = _create_multifloat_editor(2, enabled, values, titles, _on_v2_value_changed) return v2_editor func _create_v2i_editor() -> Control: var values = [value.x, value.y] var titles = ["X", "Y"] - var v2_editor = _create_multiint_editor(2, enabled, values, titles, "_on_v2_value_changed") + var v2_editor = _create_multiint_editor(2, enabled, values, titles, _on_v2_value_changed) return v2_editor @@ -134,14 +134,14 @@ func _on_v2_value_changed(_idx: int, v2_editor: Control) -> void: func _create_v3_editor() -> Control: var values = [value.x, value.y, value.z] var titles = ["X", "Y", "Z"] - var v3_editor = _create_multifloat_editor(3, enabled, values, titles, "_on_v3_value_changed") + var v3_editor = _create_multifloat_editor(3, enabled, values, titles, _on_v3_value_changed) return v3_editor func _create_v3i_editor() -> Control: var values = [value.x, value.y, value.z] var titles = ["X", "Y", "Z"] - var v3_editor = _create_multiint_editor(3, enabled, values, titles, "_on_v3_value_changed") + var v3_editor = _create_multiint_editor(3, enabled, values, titles, _on_v3_value_changed) return v3_editor @@ -155,14 +155,14 @@ func _on_v3_value_changed(_idx: int, v3_editor: Control) -> void: func _create_r2_editor() -> Control: var values = [value.position.x, value.position.y, value.size.x, value.size.y] var titles = ["Position X", "Position Y", "Size X", "Size Y"] - var r2_editor = _create_multifloat_editor(2, enabled, values, titles, "_on_r2_value_changed") + var r2_editor = _create_multifloat_editor(2, enabled, values, titles, _on_r2_value_changed) return r2_editor func _create_r2i_editor() -> Control: var values = [value.position.x, value.position.y, value.size.x, value.size.y] var titles = ["Position X", "Position Y", "Size X", "Size Y"] - var r2_editor = _create_multiint_editor(2, enabled, values, titles, "_on_r2_value_changed") + var r2_editor = _create_multiint_editor(2, enabled, values, titles, _on_r2_value_changed) return r2_editor @@ -177,7 +177,7 @@ func _on_r2_value_changed(_idx: int, r2_editor: Control) -> void: func _create_plane_editor() -> Control: var values = [value.x, value.y, value.z, value.d] var titles = ["X", "Y", "Z", "D"] - var editor = _create_multifloat_editor(2, enabled, values, titles, "_on_plane_value_changed") + var editor = _create_multifloat_editor(2, enabled, values, titles, _on_plane_value_changed) return editor @@ -192,7 +192,7 @@ func _on_plane_value_changed(_idx: int, plane_editor: Control) -> void: func _create_quat_editor() -> Control: var values = [value.x, value.y, value.z, value.w] var titles = ["X", "Y", "Z", "W"] - var editor = _create_multifloat_editor(2, enabled, values, titles, "_on_quat_value_changed") + var editor = _create_multifloat_editor(2, enabled, values, titles, _on_quat_value_changed) return editor @@ -208,7 +208,7 @@ func _create_aabb_editor() -> Control: var values = [value.position.x, value.position.y, value.position.z, \ value.size.x, value.size.y, value.size.z] var titles = ["Position X", "Position Y", "Position Z", "Size X", "Size Y", "Size Z"] - var editor = _create_multifloat_editor(3, enabled, values, titles, "_on_aabb_value_changed") + var editor = _create_multifloat_editor(3, enabled, values, titles, _on_aabb_value_changed) return editor @@ -227,7 +227,7 @@ func _create_multifloat_editor( enabled: bool, values: Array, titles: Array, - value_changed_handler: String) -> Control: + value_changed_handler: Callable) -> Control: return _create_multivalue_editor(columns, enabled, TYPE_FLOAT, values, titles, value_changed_handler) @@ -236,7 +236,7 @@ func _create_multiint_editor( enabled: bool, values: Array, titles: Array, - value_changed_handler: String) -> Control: + value_changed_handler: Callable) -> Control: return _create_multivalue_editor(columns, enabled, TYPE_INT, values, titles, value_changed_handler) @@ -246,7 +246,7 @@ func _create_multivalue_editor( type: int, values: Array, titles: Array, - value_changed_handler: String) -> Control: + value_changed_handler: Callable) -> Control: var multivalue_editor = MultivalueEditor.new() multivalue_editor.columns = columns multivalue_editor.enabled = enabled @@ -254,7 +254,7 @@ func _create_multivalue_editor( multivalue_editor.values = values multivalue_editor.titles = titles _expand_control(multivalue_editor) - multivalue_editor.value_changed.connect(Callable(self, value_changed_handler).bind(multivalue_editor)) + multivalue_editor.value_changed.connect(value_changed_handler.bind(multivalue_editor)) return multivalue_editor diff --git a/addons/gloot/editor/gloot_undo_redo.gd b/addons/gloot/editor/gloot_undo_redo.gd index cfffc675..3f036003 100644 --- a/addons/gloot/editor/gloot_undo_redo.gd +++ b/addons/gloot/editor/gloot_undo_redo.gd @@ -1,9 +1,19 @@ +@tool extends Object -var undo_redo_manager: EditorUndoRedoManager +const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -func add_inventory_item(inventory: Inventory, prototype_id: String) -> void: + +static func _get_undo_redo_manager() -> EditorUndoRedoManager: + var gloot = load("res://addons/gloot/gloot.gd") + assert(gloot.instance()) + var undo_redo_manager = gloot.instance().get_undo_redo() assert(undo_redo_manager) + return undo_redo_manager + + +static func add_inventory_item(inventory: Inventory, prototype_id: String) -> void: + var undo_redo_manager = _get_undo_redo_manager() var old_inv_state := inventory.serialize() if inventory.create_and_add_item(prototype_id) == null: @@ -11,13 +21,13 @@ func add_inventory_item(inventory: Inventory, prototype_id: String) -> void: var new_inv_state := inventory.serialize() undo_redo_manager.create_action("Add Inventory Item") - undo_redo_manager.add_do_method(self, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(self, "_set_inventory", inventory, old_inv_state) + undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) undo_redo_manager.commit_action() -func remove_inventory_item(inventory: Inventory, item: InventoryItem) -> void: - assert(undo_redo_manager) +static func remove_inventory_item(inventory: Inventory, item: InventoryItem) -> void: + var undo_redo_manager = _get_undo_redo_manager() var old_inv_state := inventory.serialize() if !inventory.remove_item(item): @@ -25,13 +35,13 @@ func remove_inventory_item(inventory: Inventory, item: InventoryItem) -> void: var new_inv_state := inventory.serialize() undo_redo_manager.create_action("Remove Inventory Item") - undo_redo_manager.add_do_method(self, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(self, "_set_inventory", inventory, old_inv_state) + undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) undo_redo_manager.commit_action() -func remove_inventory_items(inventory: Inventory, items: Array[InventoryItem]) -> void: - assert(undo_redo_manager) +static func remove_inventory_items(inventory: Inventory, items: Array[InventoryItem]) -> void: + var undo_redo_manager = _get_undo_redo_manager() var old_inv_state := inventory.serialize() for item in items: @@ -39,19 +49,19 @@ func remove_inventory_items(inventory: Inventory, items: Array[InventoryItem]) - var new_inv_state := inventory.serialize() undo_redo_manager.create_action("Remove Inventory Items") - undo_redo_manager.add_do_method(self, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(self, "_set_inventory", inventory, old_inv_state) + undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) undo_redo_manager.commit_action() -func set_item_properties(item: InventoryItem, new_properties: Dictionary) -> void: - assert(undo_redo_manager) +static func set_item_properties(item: InventoryItem, new_properties: Dictionary) -> void: + var undo_redo_manager = _get_undo_redo_manager() var inventory: Inventory = item.get_inventory() if inventory: undo_redo_manager.create_action("Set item properties") - undo_redo_manager.add_do_method(self, "_set_item_properties", inventory, inventory.get_item_index(item), new_properties) - undo_redo_manager.add_undo_method(self, "_set_item_properties", inventory, inventory.get_item_index(item), item.properties) + undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_properties", inventory, inventory.get_item_index(item), new_properties) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_properties", inventory, inventory.get_item_index(item), item.properties) undo_redo_manager.commit_action() else: undo_redo_manager.create_action("Set item properties") @@ -60,14 +70,14 @@ func set_item_properties(item: InventoryItem, new_properties: Dictionary) -> voi undo_redo_manager.commit_action() -func set_item_prototype_id(item: InventoryItem, new_prototype_id: String) -> void: - assert(undo_redo_manager) +static func set_item_prototype_id(item: InventoryItem, new_prototype_id: String) -> void: + var undo_redo_manager = _get_undo_redo_manager() var inventory: Inventory = item.get_inventory() if inventory: undo_redo_manager.create_action("Set prototype_id") - undo_redo_manager.add_do_method(self, "_set_item_prototype_id", inventory, inventory.get_item_index(item), new_prototype_id) - undo_redo_manager.add_undo_method(self, "_set_item_prototype_id", inventory, inventory.get_item_index(item), item.prototype_id) + undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_prototype_id", inventory, inventory.get_item_index(item), new_prototype_id) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_prototype_id", inventory, inventory.get_item_index(item), item.prototype_id) undo_redo_manager.commit_action() else: undo_redo_manager.create_action("Set prototype_id") @@ -76,31 +86,54 @@ func set_item_prototype_id(item: InventoryItem, new_prototype_id: String) -> voi undo_redo_manager.commit_action() -func _set_inventory(inventory: Inventory, inventory_data: Dictionary) -> void: +static func _set_inventory(inventory: Inventory, inventory_data: Dictionary) -> void: inventory.deserialize(inventory_data) -func _set_item_prototype_id(inventory: Inventory, item_index: int, new_prototype_id: String): +static func _set_item_prototype_id(inventory: Inventory, item_index: int, new_prototype_id: String): assert(item_index < inventory.get_item_count()) inventory.get_items()[item_index].prototype_id = new_prototype_id -func _set_item_properties(inventory: Inventory, item_index: int, new_properties: Dictionary): +static func _set_item_properties(inventory: Inventory, item_index: int, new_properties: Dictionary): assert(item_index < inventory.get_item_count()) inventory.get_items()[item_index].properties = new_properties.duplicate() -func set_item_slot_equipped_item(item_slot: ItemSlot, new_equipped_item: int) -> void: - assert(undo_redo_manager) +static func equip_item_in_item_slot(item_slot: ItemSlotBase, item: InventoryItem) -> void: + var undo_redo_manager = _get_undo_redo_manager() + + var old_slot_state := item_slot.serialize() + if !item_slot.equip(item): + return + var new_slot_state := item_slot.serialize() + + undo_redo_manager.create_action("Equip Inventory Item") + undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_slot", item_slot, new_slot_state) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_slot", item_slot, old_slot_state) + undo_redo_manager.commit_action() + + +static func clear_item_slot(item_slot: ItemSlotBase) -> void: + var undo_redo_manager = _get_undo_redo_manager() + + var old_slot_state := item_slot.serialize() + if !item_slot.clear(): + return + var new_slot_state := item_slot.serialize() - undo_redo_manager.create_action("Set equipped_item") - undo_redo_manager.add_undo_property(item_slot, "equipped_item", item_slot.equipped_item) - undo_redo_manager.add_do_property(item_slot, "equipped_item", new_equipped_item) + undo_redo_manager.create_action("Clear Inventory Item") + undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_slot", item_slot, new_slot_state) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_slot", item_slot, old_slot_state) undo_redo_manager.commit_action() -func move_inventory_item(inventory: InventoryGrid, item: InventoryItem, to: Vector2i) -> void: - assert(undo_redo_manager) +static func _set_item_slot(item_slot: ItemSlotBase, item_slot_data: Dictionary) -> void: + item_slot.deserialize(item_slot_data) + + +static func move_inventory_item(inventory: InventoryGrid, item: InventoryItem, to: Vector2i) -> void: + var undo_redo_manager = _get_undo_redo_manager() var old_position := inventory.get_item_position(item) if old_position == to: @@ -108,23 +141,23 @@ func move_inventory_item(inventory: InventoryGrid, item: InventoryItem, to: Vect var item_index := inventory.get_item_index(item) undo_redo_manager.create_action("Move Inventory Item") - undo_redo_manager.add_do_method(self, "_move_item", inventory, item_index, to) - undo_redo_manager.add_undo_method(self, "_move_item", inventory, item_index, old_position) + undo_redo_manager.add_do_method(GlootUndoRedo, "_move_item", inventory, item_index, to) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_move_item", inventory, item_index, old_position) undo_redo_manager.commit_action() -func _move_item(inventory: InventoryGrid, item_index: int, to: Vector2i) -> void: +static func _move_item(inventory: InventoryGrid, item_index: int, to: Vector2i) -> void: assert(item_index >= 0 && item_index < inventory.get_item_count()) var item = inventory.get_items()[item_index] inventory.move_item_to(item, to) -func join_inventory_items( +static func join_inventory_items( inventory: InventoryGridStacked, item_dst: InventoryItem, item_src: InventoryItem ) -> void: - assert(undo_redo_manager) + var undo_redo_manager = _get_undo_redo_manager() var old_inv_state := inventory.serialize() if !inventory.join(item_dst, item_src): @@ -132,59 +165,70 @@ func join_inventory_items( var new_inv_state := inventory.serialize() undo_redo_manager.create_action("Join Inventory Items") - undo_redo_manager.add_do_method(self, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(self, "_set_inventory", inventory, old_inv_state) + undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) undo_redo_manager.commit_action() -func rename_prototype(protoset: ItemProtoset, id: String, new_id: String) -> void: - assert(undo_redo_manager) +static func rename_prototype(protoset: ItemProtoset, id: String, new_id: String) -> void: + var undo_redo_manager = _get_undo_redo_manager() var old_prototypes = _prototypes_deep_copy(protoset) undo_redo_manager.create_action("Rename Prototype") - undo_redo_manager.add_undo_method(self, "_set_prototypes", protoset, old_prototypes) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) undo_redo_manager.add_do_method(protoset, "rename_prototype", id, new_id) undo_redo_manager.commit_action() -func add_prototype(protoset: ItemProtoset, id: String) -> void: - assert(undo_redo_manager) +static func add_prototype(protoset: ItemProtoset, id: String) -> void: + var undo_redo_manager = _get_undo_redo_manager() var old_prototypes = _prototypes_deep_copy(protoset) undo_redo_manager.create_action("Add Prototype") - undo_redo_manager.add_undo_method(self, "_set_prototypes", protoset, old_prototypes) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) undo_redo_manager.add_do_method(protoset, "add_prototype", id) undo_redo_manager.commit_action() -func remove_prototype(protoset: ItemProtoset, id: String) -> void: - assert(undo_redo_manager) +static func remove_prototype(protoset: ItemProtoset, id: String) -> void: + var undo_redo_manager = _get_undo_redo_manager() var old_prototypes = _prototypes_deep_copy(protoset) undo_redo_manager.create_action("Remove Prototype") - undo_redo_manager.add_undo_method(self, "_set_prototypes", protoset, old_prototypes) + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) undo_redo_manager.add_do_method(protoset, "remove_prototype", id) undo_redo_manager.commit_action() -func _prototypes_deep_copy(protoset: ItemProtoset) -> Dictionary: +static func duplicate_prototype(protoset: ItemProtoset, id: String) -> void: + var undo_redo_manager = _get_undo_redo_manager() + + var old_prototypes = _prototypes_deep_copy(protoset) + + undo_redo_manager.create_action("Duplicate Prototype") + undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) + undo_redo_manager.add_do_method(protoset, "duplicate_prototype", id) + undo_redo_manager.commit_action() + + +static func _prototypes_deep_copy(protoset: ItemProtoset) -> Dictionary: var result = protoset._prototypes.duplicate() for prototype_id in result.keys(): result[prototype_id] = protoset._prototypes[prototype_id].duplicate() return result -func _set_prototypes(protoset: ItemProtoset, prototypes: Dictionary) -> void: +static func _set_prototypes(protoset: ItemProtoset, prototypes: Dictionary) -> void: protoset._prototypes = prototypes -func set_prototype_properties(protoset: ItemProtoset, +static func set_prototype_properties(protoset: ItemProtoset, prototype_id: String, new_properties: Dictionary) -> void: - assert(undo_redo_manager) + var undo_redo_manager = _get_undo_redo_manager() assert(protoset.has_prototype(prototype_id)) var old_properties = protoset.get_prototype(prototype_id).duplicate() diff --git a/addons/gloot/editor/inventory_editor/inventory_editor.gd b/addons/gloot/editor/inventory_editor/inventory_editor.gd index a4c85eb1..56c5e266 100644 --- a/addons/gloot/editor/inventory_editor/inventory_editor.gd +++ b/addons/gloot/editor/inventory_editor/inventory_editor.gd @@ -1,6 +1,7 @@ @tool extends Control +const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") @onready var hsplit_container = $HSplitContainer @@ -10,126 +11,113 @@ const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") @onready var btn_remove = $HSplitContainer/VBoxContainer/HBoxContainer/BtnRemove @onready var scroll_container = $HSplitContainer/VBoxContainer/ScrollContainer var inventory: Inventory : - get: - return inventory - set(new_inventory): - disconnect_inventory_signals() - inventory = new_inventory - connect_inventory_signals() - - _refresh() -var editor_interface: EditorInterface -var gloot_undo_redo : - get: - return gloot_undo_redo - set(new_gloot_undo_redo): - gloot_undo_redo = new_gloot_undo_redo - if _inventory_control is CtrlInventoryGrid: - _inventory_control._gloot_undo_redo = gloot_undo_redo + get: + return inventory + set(new_inventory): + disconnect_inventory_signals() + inventory = new_inventory + connect_inventory_signals() + + _refresh() var _inventory_control: Control func connect_inventory_signals(): - if !inventory: - return + if !inventory: + return - if inventory is InventoryStacked: - inventory.capacity_changed.connect(Callable(self, "_refresh")) - if inventory is InventoryGrid: - inventory.size_changed.connect(Callable(self, "_refresh")) - inventory.protoset_changed.connect(Callable(self, "_refresh")) + if inventory is InventoryStacked: + inventory.capacity_changed.connect(_refresh) + if inventory is InventoryGrid: + inventory.size_changed.connect(_refresh) + inventory.protoset_changed.connect(_refresh) - if !inventory.item_protoset: - return - inventory.item_protoset.changed.connect(Callable(self, "_refresh")) + if !inventory.item_protoset: + return + inventory.item_protoset.changed.connect(_refresh) func disconnect_inventory_signals(): - if !inventory: - return - - if inventory is InventoryStacked: - inventory.capacity_changed.disconnect(Callable(self, "_refresh")) - if inventory is InventoryGrid: - inventory.size_changed.disconnect(Callable(self, "_refresh")) - inventory.protoset_changed.disconnect(Callable(self, "_refresh")) + if !inventory: + return + + if inventory is InventoryStacked: + inventory.capacity_changed.disconnect(_refresh) + if inventory is InventoryGrid: + inventory.size_changed.disconnect(_refresh) + inventory.protoset_changed.disconnect(_refresh) - if !inventory.item_protoset: - return - inventory.item_protoset.changed.disconnect(Callable(self, "_refresh")) + if !inventory.item_protoset: + return + inventory.item_protoset.changed.disconnect(_refresh) func _refresh() -> void: - if !is_inside_tree() || inventory == null || inventory.item_protoset == null: - return - - # Remove the inventory control, if present - if _inventory_control: - scroll_container.remove_child(_inventory_control) - _inventory_control.queue_free() - _inventory_control = null - - # Create the appropriate inventory control and populate it - if inventory is InventoryGrid: - _inventory_control = CtrlInventoryGrid.new() - _inventory_control.grid_color = Color.GRAY - _inventory_control.draw_selections = true - # TODO: Find a better way for undoing/redoing item movements: - _inventory_control._gloot_undo_redo = gloot_undo_redo - elif inventory is InventoryStacked: - _inventory_control = CtrlInventoryStacked.new() - elif inventory is Inventory: - _inventory_control = CtrlInventory.new() - _inventory_control.size_flags_horizontal = SIZE_EXPAND_FILL - _inventory_control.size_flags_vertical = SIZE_EXPAND_FILL - _inventory_control.inventory = inventory - _inventory_control.inventory_item_activated.connect(Callable(self, "_on_inventory_item_activated")) - - scroll_container.add_child(_inventory_control) - - # Set prototype_id_filter values - prototype_id_filter.set_values(inventory.item_protoset._prototypes.keys()) + if !is_inside_tree() || inventory == null || inventory.item_protoset == null: + return + + # Remove the inventory control, if present + if _inventory_control: + scroll_container.remove_child(_inventory_control) + _inventory_control.queue_free() + _inventory_control = null + + # Create the appropriate inventory control and populate it + if inventory is InventoryGrid: + _inventory_control = CtrlInventoryGrid.new() + _inventory_control.grid_color = Color.GRAY + _inventory_control.draw_selections = true + elif inventory is InventoryStacked: + _inventory_control = CtrlInventoryStacked.new() + elif inventory is Inventory: + _inventory_control = CtrlInventory.new() + _inventory_control.size_flags_horizontal = SIZE_EXPAND_FILL + _inventory_control.size_flags_vertical = SIZE_EXPAND_FILL + _inventory_control.inventory = inventory + _inventory_control.inventory_item_activated.connect(_on_inventory_item_activated) + + scroll_container.add_child(_inventory_control) + + # Set prototype_id_filter values + prototype_id_filter.set_values(inventory.item_protoset._prototypes.keys()) func _on_inventory_item_activated(item: InventoryItem) -> void: - assert(gloot_undo_redo) - gloot_undo_redo.remove_inventory_item(inventory, item) + GlootUndoRedo.remove_inventory_item(inventory, item) func _ready() -> void: - prototype_id_filter.pick_icon = EditorIcons.get_icon(editor_interface, "Add") - prototype_id_filter.filter_icon = EditorIcons.get_icon(editor_interface, "Search") - btn_edit.icon = EditorIcons.get_icon(editor_interface, "Edit") - btn_remove.icon = EditorIcons.get_icon(editor_interface, "Remove") + prototype_id_filter.pick_icon = EditorIcons.get_icon("Add") + prototype_id_filter.filter_icon = EditorIcons.get_icon("Search") + btn_edit.icon = EditorIcons.get_icon("Edit") + btn_remove.icon = EditorIcons.get_icon("Remove") - prototype_id_filter.choice_picked.connect(Callable(self, "_on_prototype_id_picked")) - btn_edit.pressed.connect(Callable(self, "_on_btn_edit")) - btn_remove.pressed.connect(Callable(self, "_on_btn_remove")) - _refresh() + prototype_id_filter.choice_picked.connect(_on_prototype_id_picked) + btn_edit.pressed.connect(_on_btn_edit) + btn_remove.pressed.connect(_on_btn_remove) + _refresh() func _on_prototype_id_picked(index: int) -> void: - assert(gloot_undo_redo) - var prototype_id = prototype_id_filter.values[index] - gloot_undo_redo.add_inventory_item(inventory, prototype_id) - + var prototype_id = prototype_id_filter.values[index] + GlootUndoRedo.add_inventory_item(inventory, prototype_id) + func _on_btn_edit() -> void: - var selected_item: InventoryItem = _inventory_control.get_selected_inventory_item() - if selected_item != null: - # Call it deferred, so that the control can clean up - call_deferred("_select_node", editor_interface, selected_item) + var selected_item: InventoryItem = _inventory_control.get_selected_inventory_item() + if selected_item != null: + # Call it deferred, so that the control can clean up + call_deferred("_select_node", selected_item) func _on_btn_remove() -> void: - assert(gloot_undo_redo) - var selected_item: InventoryItem = _inventory_control.get_selected_inventory_item() - if selected_item != null: - gloot_undo_redo.remove_inventory_item(inventory, selected_item) + var selected_item: InventoryItem = _inventory_control.get_selected_inventory_item() + if selected_item != null: + GlootUndoRedo.remove_inventory_item(inventory, selected_item) -static func _select_node(editor_interface: EditorInterface, node: Node) -> void: - editor_interface.get_selection().clear() - editor_interface.get_selection().add_node(node) - editor_interface.edit_node(node) +static func _select_node(node: Node) -> void: + EditorInterface.get_selection().clear() + EditorInterface.get_selection().add_node(node) + EditorInterface.edit_node(node) diff --git a/addons/gloot/editor/inventory_editor/inventory_inspector.gd b/addons/gloot/editor/inventory_editor/inventory_inspector.gd index f43ed124..f2e572a1 100644 --- a/addons/gloot/editor/inventory_editor/inventory_inspector.gd +++ b/addons/gloot/editor/inventory_editor/inventory_inspector.gd @@ -15,43 +15,23 @@ var inventory: Inventory : inventory = new_inventory if inventory_editor: inventory_editor.inventory = inventory -var editor_interface: EditorInterface : - get: - return editor_interface - set(new_editor_interface): - editor_interface = new_editor_interface - if inventory_editor: - inventory_editor.editor_interface = editor_interface -var gloot_undo_redo : - get: - return gloot_undo_redo - set(new_gloot_undo_redo): - gloot_undo_redo = new_gloot_undo_redo - if inventory_editor: - inventory_editor.gloot_undo_redo = gloot_undo_redo -func init(inventory_: Inventory, gloot_undo_redo_, editor_interface_: EditorInterface) -> void: +func init(inventory_: Inventory) -> void: inventory = inventory_ - gloot_undo_redo = gloot_undo_redo_ - editor_interface = editor_interface_ func _ready() -> void: if inventory_editor: inventory_editor.inventory = inventory - inventory_editor.editor_interface = editor_interface - inventory_editor.gloot_undo_redo = gloot_undo_redo _apply_editor_settings() - btn_expand.icon = EditorIcons.get_icon(editor_interface, "DistractionFree") - btn_expand.pressed.connect(Callable(self, "on_btn_expand")) + btn_expand.icon = EditorIcons.get_icon("DistractionFree") + btn_expand.pressed.connect(on_btn_expand) _window_dialog.close_requested.connect(func(): _window_dialog.hide()) func on_btn_expand() -> void: _inventory_editor.inventory = inventory - _inventory_editor.gloot_undo_redo = gloot_undo_redo - _inventory_editor.editor_interface = editor_interface _window_dialog.popup_centered() diff --git a/addons/gloot/editor/inventory_inspector_plugin.gd b/addons/gloot/editor/inventory_inspector_plugin.gd index d6dacb64..fa09e9f7 100644 --- a/addons/gloot/editor/inventory_inspector_plugin.gd +++ b/addons/gloot/editor/inventory_inspector_plugin.gd @@ -1,42 +1,33 @@ extends EditorInspectorPlugin -var EditProtosetButton = preload("res://addons/gloot/editor/protoset_editor/edit_protoset_button.tscn") -var InventoryInspector = preload("res://addons/gloot/editor/inventory_editor/inventory_inspector.tscn") -var EditPropertiesButton = preload("res://addons/gloot/editor/item_editor/edit_properties_button.gd") -var EditPrototypeIdButton = preload("res://addons/gloot/editor/item_editor/edit_prototype_id_button.gd") -var EditEquippedItemButton = preload("res://addons/gloot/editor/item_slot_editor/edit_equipped_item_button.gd") -var GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -var editor_interface: EditorInterface = null -var undo_redo_manager: EditorUndoRedoManager = null : - get: - return undo_redo_manager - set(new_undo_redo): - undo_redo_manager = new_undo_redo - if gloot_undo_redo: - gloot_undo_redo.undo_redo_manager = undo_redo_manager -var gloot_undo_redo = null - - -func _init(): - gloot_undo_redo = GlootUndoRedo.new() - gloot_undo_redo.undo_redo_manager = undo_redo_manager +const EditProtosetButton = preload("res://addons/gloot/editor/protoset_editor/edit_protoset_button.tscn") +const InventoryInspector = preload("res://addons/gloot/editor/inventory_editor/inventory_inspector.tscn") +const ItemSlotInspector = preload("res://addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn") +const ItemRefSlotButton = preload("res://addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd") +const EditPropertiesButton = preload("res://addons/gloot/editor/item_editor/edit_properties_button.gd") +const EditPrototypeIdButton = preload("res://addons/gloot/editor/item_editor/edit_prototype_id_button.gd") func _can_handle(object: Object) -> bool: return (object is Inventory) || \ (object is InventoryItem) || \ (object is ItemSlot) || \ + (object is ItemRefSlot) || \ (object is ItemProtoset) func _parse_begin(object: Object) -> void: if object is Inventory: var inventory_inspector := InventoryInspector.instantiate() - inventory_inspector.init(object as Inventory, gloot_undo_redo, editor_interface) + inventory_inspector.init(object as Inventory) add_custom_control(inventory_inspector) + if object is ItemSlot: + var item_slot_inspector := ItemSlotInspector.instantiate() + item_slot_inspector.init(object as ItemSlot) + add_custom_control(item_slot_inspector) if object is ItemProtoset: var edit_protoset_button := EditProtosetButton.instantiate() - edit_protoset_button.init(object as ItemProtoset, gloot_undo_redo, editor_interface) + edit_protoset_button.init(object as ItemProtoset) add_custom_control(edit_protoset_button) @@ -48,17 +39,13 @@ func _parse_property(object: Object, usage: int, wide: bool) -> bool: if (object is InventoryItem) && name == "properties": - var item_property_editor = EditPropertiesButton.new(gloot_undo_redo, editor_interface) - add_property_editor(name, item_property_editor) + add_property_editor(name, EditPropertiesButton.new()) return true if (object is InventoryItem) && name == "prototype_id": - var item_prototype_id_editor = EditPrototypeIdButton.new(gloot_undo_redo, editor_interface) - add_property_editor(name, item_prototype_id_editor) + add_property_editor(name, EditPrototypeIdButton.new()) return true - if (object is ItemSlot) && name == "equipped_item": - var item_slot_equipped_item_editor = EditEquippedItemButton.new() - item_slot_equipped_item_editor.gloot_undo_redo = gloot_undo_redo - add_property_editor(name, item_slot_equipped_item_editor) + if (object is ItemRefSlot) && name == "_equipped_item": + add_property_editor(name, ItemRefSlotButton.new()) return true return false diff --git a/addons/gloot/editor/item_editor/edit_properties_button.gd b/addons/gloot/editor/item_editor/edit_properties_button.gd index f1a89581..e0d53423 100644 --- a/addons/gloot/editor/item_editor/edit_properties_button.gd +++ b/addons/gloot/editor/item_editor/edit_properties_button.gd @@ -6,34 +6,31 @@ const POPUP_SIZE = Vector2i(800, 300) var current_value: Dictionary var updating: bool = false -var editor_interface: EditorInterface var _btn_prototype_id: Button var _properties_editor: Window -func _init(gloot_undo_redo_, editor_interface_: EditorInterface): +func _init(): _properties_editor = PropertiesEditor.instantiate() - _properties_editor.init(gloot_undo_redo_, editor_interface_) add_child(_properties_editor) _btn_prototype_id = Button.new() _btn_prototype_id.text = "Edit Properties" - _btn_prototype_id.pressed.connect(Callable(self, "_on_btn_edit")) + _btn_prototype_id.pressed.connect(_on_btn_edit) + _btn_prototype_id.icon = EditorIcons.get_icon("Edit") add_child(_btn_prototype_id) func _ready() -> void: - _btn_prototype_id.icon = EditorIcons.get_icon(editor_interface, "Edit") - var item: InventoryItem = get_edited_object() if !item: return _properties_editor.item = item - item.properties_changed.connect(Callable(self, "update_property")) + item.properties_changed.connect(update_property) if !item.protoset: return - item.protoset.changed.connect(Callable(self, "_on_protoset_changed")) + item.protoset.changed.connect(_on_protoset_changed) _refresh_button() diff --git a/addons/gloot/editor/item_editor/edit_prototype_id_button.gd b/addons/gloot/editor/item_editor/edit_prototype_id_button.gd index 7e2a806f..1ac4e696 100644 --- a/addons/gloot/editor/item_editor/edit_prototype_id_button.gd +++ b/addons/gloot/editor/item_editor/edit_prototype_id_button.gd @@ -10,23 +10,22 @@ var _prototype_id_editor: Window var _btn_prototype_id: Button -func _init(gloot_undo_redo_, editor_interface_: EditorInterface): +func _init(): _prototype_id_editor = PrototypeIdEditor.instantiate() - _prototype_id_editor.init(gloot_undo_redo_, editor_interface_) add_child(_prototype_id_editor) _btn_prototype_id = Button.new() _btn_prototype_id.text = "Prototype ID" - _btn_prototype_id.pressed.connect(Callable(self, "_on_btn_prototype_id")) + _btn_prototype_id.pressed.connect(_on_btn_prototype_id) add_child(_btn_prototype_id) func _ready() -> void: var item: InventoryItem = get_edited_object() _prototype_id_editor.item = item - item.prototype_id_changed.connect(Callable(self, "_on_prototype_id_changed")) + item.prototype_id_changed.connect(_refresh_button) if item.protoset: - item.protoset.changed.connect(Callable(self, "_on_protoset_changed")) + item.protoset.changed.connect(_refresh_button) _refresh_button() @@ -50,14 +49,6 @@ func _get_popup_at_mouse_position(size: Vector2i) -> Vector2i: return popup_pos -func _on_prototype_id_changed() -> void: - _refresh_button() - - -func _on_protoset_changed() -> void: - _refresh_button() - - func update_property() -> void: var new_value = get_edited_object()[get_edited_property()] if new_value == current_value: diff --git a/addons/gloot/editor/item_editor/properties_editor.gd b/addons/gloot/editor/item_editor/properties_editor.gd index 04b575f8..60a6e45f 100644 --- a/addons/gloot/editor/item_editor/properties_editor.gd +++ b/addons/gloot/editor/item_editor/properties_editor.gd @@ -1,6 +1,7 @@ @tool extends Window +const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") const DictEditor = preload("res://addons/gloot/editor/common/dict_editor.tscn") const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") @@ -10,8 +11,6 @@ var IMMUTABLE_KEYS: Array[String] = [ItemProtoset.KEY_ID, GridConstraint.KEY_GRI @onready var _margin_container: MarginContainer = $"MarginContainer" @onready var _dict_editor: Control = $"MarginContainer/DictEditor" -var gloot_undo_redo = null -var editor_interface: EditorInterface var item: InventoryItem = null : get: return item @@ -21,17 +20,10 @@ var item: InventoryItem = null : assert(item == null, "Item already set!") item = new_item if item.protoset: - item.protoset.changed.connect(Callable(self, "_refresh")) + item.protoset.changed.connect(_refresh) _refresh() -func init(gloot_undo_redo_, editor_interface_: EditorInterface) -> void: - assert(gloot_undo_redo_, "gloot_undo_redo_ is null!") - assert(editor_interface_, "editor_interface_ is null!") - gloot_undo_redo = gloot_undo_redo_ - editor_interface = editor_interface_ - - func _ready() -> void: about_to_popup.connect(func(): _refresh()) close_requested.connect(func(): hide()) @@ -51,7 +43,7 @@ func _on_value_changed(key: String, new_value) -> void: if new_properties.hash() == item.properties.hash(): return - gloot_undo_redo.set_item_properties(item, new_properties) + GlootUndoRedo.set_item_properties(item, new_properties) _refresh() @@ -62,13 +54,13 @@ func _on_value_removed(key: String) -> void: if new_properties.hash() == item.properties.hash(): return - gloot_undo_redo.set_item_properties(item, new_properties) + GlootUndoRedo.set_item_properties(item, new_properties) _refresh() func _refresh() -> void: if _dict_editor.btn_add: - _dict_editor.btn_add.icon = EditorIcons.get_icon(editor_interface, "Add") + _dict_editor.btn_add.icon = EditorIcons.get_icon("Add") _dict_editor.dictionary = _get_dictionary() _dict_editor.color_map = _get_color_map() _dict_editor.remove_button_map = _get_remove_button_map() @@ -123,10 +115,10 @@ func _get_remove_button_map() -> Dictionary: result[key] = {} if item.protoset.get_prototype(item.prototype_id).has(key): result[key]["text"] = "" - result[key]["icon"] = EditorIcons.get_icon(editor_interface, "Reload") + result[key]["icon"] = EditorIcons.get_icon("Reload") else: result[key]["text"] = "" - result[key]["icon"] = EditorIcons.get_icon(editor_interface, "Remove") + result[key]["icon"] = EditorIcons.get_icon("Remove") result[key]["disabled"] = (not key in item.properties) or (key in IMMUTABLE_KEYS) return result diff --git a/addons/gloot/editor/item_editor/prototype_id_editor.gd b/addons/gloot/editor/item_editor/prototype_id_editor.gd index 8ccd860f..b6168d94 100644 --- a/addons/gloot/editor/item_editor/prototype_id_editor.gd +++ b/addons/gloot/editor/item_editor/prototype_id_editor.gd @@ -1,14 +1,13 @@ @tool extends Window +const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") const ChoiceFilter = preload("res://addons/gloot/editor/common/choice_filter.tscn") const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") const POPUP_MARGIN = 10 @onready var _margin_container: MarginContainer = $"MarginContainer" @onready var _choice_filter: Control = $"MarginContainer/ChoiceFilter" -var gloot_undo_redo = null -var editor_interface: EditorInterface var item: InventoryItem = null : get: return item @@ -18,19 +17,12 @@ var item: InventoryItem = null : assert(item == null, "Item already set!") item = new_item if item.protoset: - item.protoset.changed.connect(Callable(self, "_refresh")) + item.protoset.changed.connect(_refresh) _refresh() -func init(gloot_undo_redo_, editor_interface_: EditorInterface) -> void: - assert(gloot_undo_redo_, "gloot_undo_redo_ is null!") - assert(editor_interface_, "editor_interface_ is null!") - gloot_undo_redo = gloot_undo_redo_ - editor_interface = editor_interface_ - - func _ready() -> void: - _choice_filter.filter_icon = EditorIcons.get_icon(editor_interface, "Search") + _choice_filter.filter_icon = EditorIcons.get_icon("Search") about_to_popup.connect(func(): _refresh()) close_requested.connect(func(): hide()) _choice_filter.choice_picked.connect(func(value_index: int): _on_choice_picked(value_index)) @@ -41,7 +33,7 @@ func _on_choice_picked(value_index: int) -> void: assert(item, "Item not set!") var new_prototype_id = _choice_filter.values[value_index] if new_prototype_id != item.prototype_id: - gloot_undo_redo.set_item_prototype_id(item, new_prototype_id) + GlootUndoRedo.set_item_prototype_id(item, new_prototype_id) hide() diff --git a/addons/gloot/editor/item_slot_editor/edit_equipped_item_button.gd b/addons/gloot/editor/item_slot_editor/edit_equipped_item_button.gd deleted file mode 100644 index f1db473f..00000000 --- a/addons/gloot/editor/item_slot_editor/edit_equipped_item_button.gd +++ /dev/null @@ -1,77 +0,0 @@ -extends EditorProperty - -var updating: bool = false -var _option_button: OptionButton -var gloot_undo_redo = null - - -func _init(): - _option_button = OptionButton.new() - add_child(_option_button) - add_focusable(_option_button) - _option_button.item_selected.connect(Callable(self, "_on_item_selected")) - - -func _ready() -> void: - var item_slot: ItemSlot = get_edited_object() - item_slot.inventory_changed.connect(Callable(self, "_on_inventory_changed")) - item_slot.item_set.connect(Callable(self, "_on_item_set")) - item_slot.item_cleared.connect(Callable(self, "_on_item_cleared")) - _refresh_option_button() - - -func _on_inventory_changed(inventory: Inventory) -> void: - _refresh_option_button() - - -func _on_item_set(item: InventoryItem) -> void: - _refresh_option_button() - - -func _on_item_cleared() -> void: - _refresh_option_button() - - -func _refresh_option_button() -> void: - _clear_option_button() - _populate_option_button() - - -func _clear_option_button() -> void: - _option_button.clear() - _option_button.add_item("NONE") - _option_button.set_item_metadata(0, -1) - _option_button.select(0) - - -func _populate_option_button() -> void: - if !get_edited_object(): - return - - var item_slot: ItemSlot = get_edited_object() - if !item_slot.inventory: - return - - var selected_item_index = 0 - for inventory_item_index in range(item_slot.inventory.get_item_count()): - var item = item_slot.inventory.get_items()[inventory_item_index] - _option_button.add_icon_item(item.get_texture(), item.get_title()) - var current_item_index = _option_button.get_item_count() - 1 - _option_button.set_item_metadata(current_item_index, inventory_item_index) - if item == item_slot.item: - selected_item_index = current_item_index - - _option_button.select(selected_item_index) - - -func _on_item_selected(item_index: int) -> void: - if !get_edited_object() || updating: - return - - updating = true - var item_slot: ItemSlot = get_edited_object() - var new_equipped_item = _option_button.get_item_metadata(item_index) - if item_slot.equipped_item != new_equipped_item: - gloot_undo_redo.set_item_slot_equipped_item(item_slot, new_equipped_item) - updating = false - diff --git a/addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd b/addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd new file mode 100644 index 00000000..0e1abfea --- /dev/null +++ b/addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd @@ -0,0 +1,67 @@ +extends EditorProperty + +const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") + +var updating: bool = false +var _option_button: OptionButton + + +func _init(): + _option_button = OptionButton.new() + add_child(_option_button) + add_focusable(_option_button) + _option_button.item_selected.connect(_on_item_selected) + + +func _ready() -> void: + var item_ref_slot: ItemRefSlot = get_edited_object() + item_ref_slot.inventory_changed.connect(_refresh_option_button) + item_ref_slot.item_equipped.connect(_refresh_option_button) + item_ref_slot.cleared.connect(_refresh_option_button) + _refresh_option_button() + + +func _refresh_option_button() -> void: + _clear_option_button() + _populate_option_button() + + +func _clear_option_button() -> void: + _option_button.clear() + _option_button.add_item("None") + _option_button.set_item_metadata(0, null) + _option_button.select(0) + + +func _populate_option_button() -> void: + if !get_edited_object(): + return + + var item_ref_slot: ItemRefSlot = get_edited_object() + if !item_ref_slot.inventory: + return + + var equipped_item_index := 0 + for item in item_ref_slot.inventory.get_items(): + _option_button.add_icon_item(item.get_texture(), item.get_title()) + var option_item_index = _option_button.get_item_count() - 1 + _option_button.set_item_metadata(option_item_index, item) + if item == item_ref_slot.get_item(): + equipped_item_index = option_item_index + + _option_button.select(equipped_item_index) + + +func _on_item_selected(item_index: int) -> void: + if !get_edited_object() || updating: + return + + updating = true + var item_ref_slot: ItemRefSlot = get_edited_object() + var selected_item: InventoryItem = _option_button.get_item_metadata(item_index) + if item_ref_slot.get_item() != selected_item: + if selected_item == null: + GlootUndoRedo.clear_item_slot(item_ref_slot) + else: + GlootUndoRedo.equip_item_in_item_slot(item_ref_slot, selected_item) + updating = false diff --git a/addons/gloot/editor/item_slot_editor/item_slot_editor.gd b/addons/gloot/editor/item_slot_editor/item_slot_editor.gd new file mode 100644 index 00000000..8c640523 --- /dev/null +++ b/addons/gloot/editor/item_slot_editor/item_slot_editor.gd @@ -0,0 +1,108 @@ +@tool +extends Control + +const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") +const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") + +@onready var hsplit_container = $HSplitContainer +@onready var prototype_id_filter = $HSplitContainer/ChoiceFilter +@onready var btn_edit = $HSplitContainer/VBoxContainer/HBoxContainer/BtnEdit +@onready var btn_clear = $HSplitContainer/VBoxContainer/HBoxContainer/BtnClear +@onready var ctrl_item_slot = $HSplitContainer/VBoxContainer/CtrlItemSlot + +var item_slot: ItemSlot : + get: + return item_slot + set(new_item_slot): + disconnect_item_slot_signals() + item_slot = new_item_slot + ctrl_item_slot.item_slot = item_slot + connect_item_slot_signals() + + _refresh() + + +func connect_item_slot_signals(): + if !item_slot: + return + + item_slot.item_equipped.connect(_refresh) + item_slot.cleared.connect(_refresh) + + if !item_slot.item_protoset: + return + item_slot.item_protoset.changed.connect(_refresh) + item_slot.protoset_changed.connect(_refresh) + + +func disconnect_item_slot_signals(): + if !item_slot: + return + + item_slot.item_equipped.disconnect(_refresh) + item_slot.cleared.disconnect(_refresh) + + if !item_slot.item_protoset: + return + item_slot.item_protoset.changed.disconnect(_refresh) + item_slot.protoset_changed.disconnect(_refresh) + + +func init(item_slot_: ItemSlot) -> void: + item_slot = item_slot_ + + +func _refresh() -> void: + if !is_inside_tree() || item_slot == null || item_slot.item_protoset == null: + return + prototype_id_filter.set_values(item_slot.item_protoset._prototypes.keys()) + + +func _ready() -> void: + _apply_editor_settings() + + prototype_id_filter.pick_icon = EditorIcons.get_icon("Add") + prototype_id_filter.filter_icon = EditorIcons.get_icon("Search") + btn_edit.icon = EditorIcons.get_icon("Edit") + btn_clear.icon = EditorIcons.get_icon("Remove") + + prototype_id_filter.choice_picked.connect(_on_prototype_id_picked) + btn_edit.pressed.connect(_on_btn_edit) + btn_clear.pressed.connect(_on_btn_clear) + + ctrl_item_slot.item_slot = item_slot + _refresh() + + +func _apply_editor_settings() -> void: + var control_height: int = ProjectSettings.get_setting("gloot/inspector_control_height") + custom_minimum_size.y = control_height + + +func _on_prototype_id_picked(index: int) -> void: + var prototype_id = prototype_id_filter.values[index] + var item := InventoryItem.new() + if item_slot.get_item() != null: + item_slot.get_item().queue_free() + item.protoset = item_slot.item_protoset + item.prototype_id = prototype_id + GlootUndoRedo.equip_item_in_item_slot(item_slot, item) + + +func _on_btn_edit() -> void: + if item_slot.get_item() != null: + # Call it deferred, so that the control can clean up + call_deferred("_select_node", item_slot.get_item()) + + +func _on_btn_clear() -> void: + if item_slot.get_item() != null: + item_slot.get_item().queue_free() + GlootUndoRedo.clear_item_slot(item_slot) + + +static func _select_node(node: Node) -> void: + EditorInterface.get_selection().clear() + EditorInterface.get_selection().add_node(node) + EditorInterface.edit_node(node) + diff --git a/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn b/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn new file mode 100644 index 00000000..67a00ff3 --- /dev/null +++ b/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn @@ -0,0 +1,103 @@ +[gd_scene load_steps=12 format=3 uid="uid://bgs0xwufm4k6k"] + +[ext_resource type="Script" path="res://addons/gloot/editor/item_slot_editor/item_slot_editor.gd" id="1_d7a2m"] +[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="2_lcnj8"] +[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_item_slot.gd" id="3_421wi"] + +[sub_resource type="Image" id="Image_ktvjb"] +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_t45ni"] +image = SubResource("Image_ktvjb") + +[sub_resource type="Image" id="Image_rhg3a"] +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, 225, 225, 225, 68, 224, 224, 224, 184, 224, 224, 224, 240, 224, 224, 224, 232, 224, 224, 224, 186, 227, 227, 227, 62, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 129, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 122, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 68, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 123, 224, 224, 224, 32, 224, 224, 224, 33, 225, 225, 225, 125, 224, 224, 224, 254, 224, 224, 224, 254, 226, 226, 226, 69, 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, 184, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 125, 224, 224, 224, 255, 225, 225, 225, 174, 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, 240, 224, 224, 224, 255, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 35, 224, 224, 224, 255, 224, 224, 224, 233, 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, 232, 224, 224, 224, 255, 224, 224, 224, 32, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 228, 228, 228, 37, 224, 224, 224, 255, 224, 224, 224, 228, 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, 186, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 130, 224, 224, 224, 255, 224, 224, 224, 173, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 62, 224, 224, 224, 255, 224, 224, 224, 254, 225, 225, 225, 126, 225, 225, 225, 34, 227, 227, 227, 36, 224, 224, 224, 131, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 77, 255, 255, 255, 0, 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, 122, 224, 224, 224, 254, 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, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 69, 225, 225, 225, 174, 224, 224, 224, 233, 224, 224, 224, 228, 224, 224, 224, 173, 226, 226, 226, 77, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 227, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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_3hnnf"] +image = SubResource("Image_rhg3a") + +[sub_resource type="Image" id="Image_8ww1c"] +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, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 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, 224, 224, 224, 255, 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, 224, 224, 224, 255, 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, 224, 224, 224, 255, 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, 224, 224, 224, 255, 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, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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_yqex5"] +image = SubResource("Image_8ww1c") + +[sub_resource type="Image" id="Image_240jw"] +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, 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, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 227, 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, 225, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 73, 224, 224, 224, 226, 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, 225, 226, 226, 226, 70, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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_ip6wh"] +image = SubResource("Image_240jw") + +[node name="ItemSlotEditor" type="Control"] +custom_minimum_size = Vector2(0, 200) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_d7a2m") + +[node name="HSplitContainer" type="HSplitContainer" parent="."] +layout_mode = 0 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ChoiceFilter" parent="HSplitContainer" instance=ExtResource("2_lcnj8")] +layout_mode = 2 +pick_text = "Equip" +pick_icon = SubResource("ImageTexture_t45ni") +filter_text = "Filter Prototypes:" +filter_icon = SubResource("ImageTexture_3hnnf") + +[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="CtrlItemSlot" type="Control" parent="HSplitContainer/VBoxContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_vertical = 3 +script = ExtResource("3_421wi") + +[node name="HBoxContainer" type="HBoxContainer" parent="HSplitContainer/VBoxContainer"] +layout_mode = 2 + +[node name="BtnEdit" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Edit" +icon = SubResource("ImageTexture_yqex5") + +[node name="BtnClear" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Clear" +icon = SubResource("ImageTexture_ip6wh") diff --git a/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd b/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd new file mode 100644 index 00000000..7cdee922 --- /dev/null +++ b/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd @@ -0,0 +1,40 @@ +@tool +extends Control + +const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") + +@onready var item_slot_editor: Control = $HBoxContainer/ItemSlotEditor +@onready var btn_expand: Button = $HBoxContainer/BtnExpand +@onready var _window_dialog: Window = $Window +@onready var _item_slot_editor: Control = $Window/MarginContainer/ItemSlotEditor + +var item_slot: ItemSlot : + get: + return item_slot + set(new_item_slot): + item_slot = new_item_slot + if item_slot_editor: + item_slot_editor.item_slot = item_slot + + +func init(item_slot_: ItemSlot) -> void: + item_slot = item_slot_ + + +func _ready() -> void: + if item_slot_editor: + item_slot_editor.item_slot = item_slot + _apply_editor_settings() + btn_expand.icon = EditorIcons.get_icon("DistractionFree") + btn_expand.pressed.connect(on_btn_expand) + _window_dialog.close_requested.connect(func(): _window_dialog.hide()) + + +func on_btn_expand() -> void: + _item_slot_editor.item_slot = item_slot + _window_dialog.popup_centered() + + +func _apply_editor_settings() -> void: + var control_height: int = ProjectSettings.get_setting("gloot/inspector_control_height") + custom_minimum_size.y = control_height diff --git a/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn b/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn new file mode 100644 index 00000000..d5fcc8f1 --- /dev/null +++ b/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn @@ -0,0 +1,66 @@ +[gd_scene load_steps=5 format=3 uid="uid://b8bv63d2djwv3"] + +[ext_resource type="Script" path="res://addons/gloot/editor/item_slot_editor/item_slot_inspector.gd" id="1_4gsgr"] +[ext_resource type="PackedScene" uid="uid://bgs0xwufm4k6k" path="res://addons/gloot/editor/item_slot_editor/item_slot_editor.tscn" id="2_ysqy6"] + +[sub_resource type="Image" id="Image_ump51"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 127, 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, 225, 225, 225, 135, 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, 140, 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, 213, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 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, 136, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 138, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 126, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 226, 226, 226, 103, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 107, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 226, 226, 226, 103, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 105, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 24, 224, 224, 224, 107, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 109, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 105, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 109, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 224, 224, 224, 129, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 140, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 213, 225, 225, 225, 142, 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, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 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, 138, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 142, 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, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 129, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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_eojh7"] +image = SubResource("Image_ump51") + +[node name="ItemSlotInspector" type="Control"] +custom_minimum_size = Vector2(0, 200) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_4gsgr") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 0 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ItemSlotEditor" parent="HBoxContainer" instance=ExtResource("2_ysqy6")] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="BtnExpand" type="Button" parent="HBoxContainer"] +layout_mode = 2 +icon = SubResource("ImageTexture_eojh7") + +[node name="Window" type="Window" parent="."] +title = "Edit Item Slot" +size = Vector2i(800, 600) +visible = false +exclusive = true +min_size = Vector2i(400, 300) + +[node name="MarginContainer" type="MarginContainer" parent="Window"] +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 +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="ItemSlotEditor" parent="Window/MarginContainer" instance=ExtResource("2_ysqy6")] +layout_mode = 2 diff --git a/addons/gloot/editor/protoset_editor/edit_protoset_button.gd b/addons/gloot/editor/protoset_editor/edit_protoset_button.gd index 5fffc7e3..71990bbc 100644 --- a/addons/gloot/editor/protoset_editor/edit_protoset_button.gd +++ b/addons/gloot/editor/protoset_editor/edit_protoset_button.gd @@ -13,40 +13,15 @@ var protoset: ItemProtoset : protoset = new_protoset if protoset_editor: protoset_editor.protoset = protoset -var gloot_undo_redo = null : - get: - return gloot_undo_redo - set(new_gloot_undo_redo): - gloot_undo_redo = new_gloot_undo_redo - if protoset_editor: - protoset_editor.gloot_undo_redo = gloot_undo_redo -var editor_interface: EditorInterface : - get: - return editor_interface - set(new_editor_interface): - editor_interface = new_editor_interface - if protoset_editor: - protoset_editor.editor_interface = editor_interface -func init(protoset_: ItemProtoset, gloot_undo_redo_, editor_interface_: EditorInterface) -> void: +func init(protoset_: ItemProtoset) -> void: protoset = protoset_ - gloot_undo_redo = gloot_undo_redo_ - editor_interface = editor_interface_ func _ready() -> void: - icon = EditorIcons.get_icon(editor_interface, "Edit") - window_dialog.close_requested.connect(Callable(self, "_on_close_requested")) + icon = EditorIcons.get_icon("Edit") + window_dialog.close_requested.connect(func(): protoset.notify_property_list_changed()) protoset_editor.protoset = protoset - protoset_editor.gloot_undo_redo = gloot_undo_redo - protoset_editor.editor_interface = editor_interface - pressed.connect(Callable(self, "_on_pressed")) - - -func _on_close_requested() -> void: - protoset.notify_property_list_changed() - + pressed.connect(func(): window_dialog.popup_centered(window_dialog.size)) -func _on_pressed() -> void: - window_dialog.popup_centered(window_dialog.size) diff --git a/addons/gloot/editor/protoset_editor/edit_protoset_button.tscn b/addons/gloot/editor/protoset_editor/edit_protoset_button.tscn index 721f40d6..57d03d32 100644 --- a/addons/gloot/editor/protoset_editor/edit_protoset_button.tscn +++ b/addons/gloot/editor/protoset_editor/edit_protoset_button.tscn @@ -1,8 +1,20 @@ -[gd_scene load_steps=3 format=3 uid="uid://bjme7iuv3j6yb"] +[gd_scene load_steps=5 format=3 uid="uid://bjme7iuv3j6yb"] [ext_resource type="PackedScene" uid="uid://cyj0avrwjowl" path="res://addons/gloot/editor/protoset_editor/protoset_editor.tscn" id="1"] [ext_resource type="Script" path="res://addons/gloot/editor/protoset_editor/edit_protoset_button.gd" id="2"] +[sub_resource type="Image" id="Image_tnk37"] +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, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 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, 224, 224, 224, 255, 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, 224, 224, 224, 255, 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, 224, 224, 224, 255, 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, 224, 224, 224, 255, 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, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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_18gso"] +image = SubResource("Image_tnk37") + [node name="EditProtosetButton" type="Button"] anchors_preset = 15 anchor_right = 1.0 @@ -10,19 +22,16 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 text = "Edit Protoset" +icon = SubResource("ImageTexture_18gso") script = ExtResource("2") [node name="Window" type="Window" parent="."] unique_name_in_owner = true title = "Edit Protoset" -size = Vector2i(800, 600) +size = Vector2i(1000, 600) visible = false exclusive = true -min_size = Vector2i(600, 200) +min_size = Vector2i(800, 200) [node name="ProtosetEditor" parent="Window" instance=ExtResource("1")] unique_name_in_owner = true -layout_mode = 3 -anchors_preset = 15 -grow_horizontal = 2 -grow_vertical = 2 diff --git a/addons/gloot/editor/protoset_editor/protoset_editor.gd b/addons/gloot/editor/protoset_editor/protoset_editor.gd index 231025d5..0cfca1c5 100644 --- a/addons/gloot/editor/protoset_editor/protoset_editor.gd +++ b/addons/gloot/editor/protoset_editor/protoset_editor.gd @@ -1,12 +1,14 @@ @tool extends Control +const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") @onready var prototype_filter = $"%PrototypeFilter" @onready var property_editor = $"%PropertyEditor" @onready var txt_prototype_id = $"%TxtPrototypeName" @onready var btn_add_prototype = $"%BtnAddPrototype" +@onready var btn_duplicate_prototype = $"%BtnDuplicatePrototype" @onready var btn_remove_prototype = $"%BtnRemovePrototype" @onready var btn_rename_prototype = $"%BtnRenamePrototype" @@ -16,30 +18,27 @@ var protoset: ItemProtoset : set(new_protoset): protoset = new_protoset if protoset: - protoset.changed.connect(Callable(self, "_on_protoset_changed")) - _refresh() -var gloot_undo_redo = null -var editor_interface: EditorInterface : - get: - return editor_interface - set(new_editor_interface): - editor_interface = new_editor_interface - btn_add_prototype.icon = EditorIcons.get_icon(editor_interface, "Add") - btn_rename_prototype.icon = EditorIcons.get_icon(editor_interface, "Edit") - btn_remove_prototype.icon = EditorIcons.get_icon(editor_interface, "Remove") - prototype_filter.filter_icon = EditorIcons.get_icon(editor_interface, "Search") + protoset.changed.connect(_on_protoset_changed) + _refresh() var selected_prototype_id: String = "" - + func _ready() -> void: - prototype_filter.choice_selected.connect(Callable(self, "_on_prototype_selected")) - property_editor.value_changed.connect(Callable(self, "_on_property_changed")) - property_editor.value_removed.connect(Callable(self, "_on_property_removed")) - txt_prototype_id.text_changed.connect(Callable(self, "_on_prototype_id_changed")) - txt_prototype_id.text_submitted.connect(Callable(self, "_on_prototype_id_entered")) - btn_add_prototype.pressed.connect(Callable(self, "_on_btn_add_prototype")) - btn_rename_prototype.pressed.connect(Callable(self, "_on_btn_rename_prototype")) - btn_remove_prototype.pressed.connect(Callable(self, "_on_btn_remove_prototype")) + prototype_filter.choice_selected.connect(_on_prototype_selected) + property_editor.value_changed.connect(_on_property_changed) + property_editor.value_removed.connect(_on_property_removed) + txt_prototype_id.text_changed.connect(_on_prototype_id_changed) + txt_prototype_id.text_submitted.connect(_on_prototype_id_entered) + btn_add_prototype.pressed.connect(_on_btn_add_prototype) + btn_duplicate_prototype.pressed.connect(_on_btn_duplicate_prototype) + btn_rename_prototype.pressed.connect(_on_btn_rename_prototype) + btn_remove_prototype.pressed.connect(_on_btn_remove_prototype) + + btn_add_prototype.icon = EditorIcons.get_icon("Add") + btn_duplicate_prototype.icon = EditorIcons.get_icon("Duplicate") + btn_rename_prototype.icon = EditorIcons.get_icon("Edit") + btn_remove_prototype.icon = EditorIcons.get_icon("Remove") + prototype_filter.filter_icon = EditorIcons.get_icon("Search") _refresh() @@ -52,6 +51,7 @@ func _refresh() -> void: _refresh_btn_add_prototype() _refresh_btn_rename_prototype() _refresh_btn_remove_prototype() + _refresh_btn_duplicate_prototype() _inspect_prototype_id(selected_prototype_id) @@ -81,6 +81,10 @@ func _refresh_btn_remove_prototype() -> void: btn_remove_prototype.disabled = prototype_filter.get_selected_text().is_empty() +func _refresh_btn_duplicate_prototype() -> void: + btn_duplicate_prototype.disabled = prototype_filter.get_selected_text().is_empty() + + func _on_protoset_changed() -> void: _refresh() @@ -89,6 +93,7 @@ func _on_prototype_selected(index: int) -> void: selected_prototype_id = prototype_filter.values[index] _inspect_prototype_id(selected_prototype_id) _refresh_btn_remove_prototype() + _refresh_btn_duplicate_prototype() func _inspect_prototype_id(prototype_id: String) -> void: @@ -105,7 +110,7 @@ func _inspect_prototype_id(prototype_id: String) -> void: property_editor.set_remove_button_config(property_name, { "text": "", "disabled": property_name == ItemProtoset.KEY_ID, - "icon": EditorIcons.get_icon(editor_interface, "Remove"), + "icon": EditorIcons.get_icon("Remove"), }) @@ -118,7 +123,7 @@ func _on_property_changed(property_name: String, new_value) -> void: if new_properties.hash() == protoset.get_prototype(selected_prototype_id).hash(): return - gloot_undo_redo.set_prototype_properties(protoset, selected_prototype_id, new_properties) + GlootUndoRedo.set_prototype_properties(protoset, selected_prototype_id, new_properties) func _on_property_removed(property_name: String) -> void: @@ -127,10 +132,10 @@ func _on_property_removed(property_name: String) -> void: var new_properties = protoset.get_prototype(selected_prototype_id).duplicate() new_properties.erase(property_name) - gloot_undo_redo.set_prototype_properties(protoset, selected_prototype_id, new_properties) + GlootUndoRedo.set_prototype_properties(protoset, selected_prototype_id, new_properties) -func _on_prototype_id_changed() -> void: +func _on_prototype_id_changed(_prototype_id: String) -> void: _refresh_btn_add_prototype() _refresh_btn_rename_prototype() @@ -143,28 +148,29 @@ func _on_btn_add_prototype() -> void: _add_prototype_id(txt_prototype_id.text) +func _on_btn_duplicate_prototype() -> void: + GlootUndoRedo.duplicate_prototype(protoset, selected_prototype_id) + + func _on_btn_rename_prototype() -> void: - assert(gloot_undo_redo) if selected_prototype_id.is_empty(): return - gloot_undo_redo.rename_prototype(protoset, + GlootUndoRedo.rename_prototype(protoset, selected_prototype_id, txt_prototype_id.text) txt_prototype_id.text = "" func _add_prototype_id(prototype_id: String) -> void: - assert(gloot_undo_redo) - gloot_undo_redo.add_prototype(protoset, prototype_id) + GlootUndoRedo.add_prototype(protoset, prototype_id) txt_prototype_id.text = "" func _on_btn_remove_prototype() -> void: - assert(gloot_undo_redo) if selected_prototype_id.is_empty(): return var prototype_id = selected_prototype_id if !prototype_id.is_empty(): - gloot_undo_redo.remove_prototype(protoset, prototype_id) + GlootUndoRedo.remove_prototype(protoset, prototype_id) diff --git a/addons/gloot/editor/protoset_editor/protoset_editor.tscn b/addons/gloot/editor/protoset_editor/protoset_editor.tscn index d7bf73da..77aca4e0 100644 --- a/addons/gloot/editor/protoset_editor/protoset_editor.tscn +++ b/addons/gloot/editor/protoset_editor/protoset_editor.tscn @@ -1,14 +1,76 @@ -[gd_scene load_steps=4 format=3 uid="uid://cyj0avrwjowl"] +[gd_scene load_steps=14 format=3 uid="uid://cyj0avrwjowl"] -[ext_resource type="PackedScene" path="res://addons/gloot/editor/common/choice_filter.tscn" id="1"] +[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="1"] [ext_resource type="PackedScene" uid="uid://digtudobrw3xb" path="res://addons/gloot/editor/common/dict_editor.tscn" id="2"] [ext_resource type="Script" path="res://addons/gloot/editor/protoset_editor/protoset_editor.gd" id="3"] +[sub_resource type="Image" id="Image_3d3lf"] +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, 225, 225, 225, 68, 224, 224, 224, 184, 224, 224, 224, 240, 224, 224, 224, 232, 224, 224, 224, 186, 227, 227, 227, 62, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 129, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 122, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 68, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 123, 224, 224, 224, 32, 224, 224, 224, 33, 225, 225, 225, 125, 224, 224, 224, 254, 224, 224, 224, 254, 226, 226, 226, 69, 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, 184, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 125, 224, 224, 224, 255, 225, 225, 225, 174, 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, 240, 224, 224, 224, 255, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 35, 224, 224, 224, 255, 224, 224, 224, 233, 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, 232, 224, 224, 224, 255, 224, 224, 224, 32, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 228, 228, 228, 37, 224, 224, 224, 255, 224, 224, 224, 228, 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, 186, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 130, 224, 224, 224, 255, 224, 224, 224, 173, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 62, 224, 224, 224, 255, 224, 224, 224, 254, 225, 225, 225, 126, 225, 225, 225, 34, 227, 227, 227, 36, 224, 224, 224, 131, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 77, 255, 255, 255, 0, 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, 122, 224, 224, 224, 254, 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, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 69, 225, 225, 225, 174, 224, 224, 224, 233, 224, 224, 224, 228, 224, 224, 224, 173, 226, 226, 226, 77, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 227, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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_ooqbn"] +image = SubResource("Image_3d3lf") + +[sub_resource type="Image" id="Image_7dqyh"] +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_dehry"] +image = SubResource("Image_7dqyh") + +[sub_resource type="Image" id="Image_nsl4i"] +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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 225, 225, 225, 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, 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, 255, 255, 255, 0, 224, 224, 224, 255, 225, 225, 225, 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, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 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, 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, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 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, 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, 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, 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, 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, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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_cfl22"] +image = SubResource("Image_nsl4i") + +[sub_resource type="Image" id="Image_o82dw"] +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, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 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, 224, 224, 224, 255, 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, 224, 224, 224, 255, 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, 224, 224, 224, 255, 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, 224, 224, 224, 255, 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, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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_qoier"] +image = SubResource("Image_o82dw") + +[sub_resource type="Image" id="Image_ey4cw"] +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, 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, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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, 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, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 227, 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, 225, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 73, 224, 224, 224, 226, 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, 225, 226, 226, 226, 70, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 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_i8glk"] +image = SubResource("Image_ey4cw") + [node name="ProtosetEditor" type="Control"] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 script = ExtResource("3") [node name="Gui" type="HSplitContainer" parent="."] @@ -36,6 +98,7 @@ unique_name_in_owner = true layout_mode = 2 pick_button_visible = false filter_text = "Prototype Filter:" +filter_icon = SubResource("ImageTexture_ooqbn") [node name="HBoxContainer2" type="HBoxContainer" parent="Gui/VBoxContainer"] layout_mode = 2 @@ -52,6 +115,15 @@ layout_mode = 2 tooltip_text = "Add a new prototype with the entered ID" disabled = true text = "Add" +icon = SubResource("ImageTexture_dehry") + +[node name="BtnDuplicatePrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +tooltip_text = "Duplicate the selected prototype" +disabled = true +text = "Duplicate" +icon = SubResource("ImageTexture_cfl22") [node name="BtnRenamePrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] unique_name_in_owner = true @@ -59,6 +131,7 @@ layout_mode = 2 tooltip_text = "Rename the selected prototype" disabled = true text = "Rename" +icon = SubResource("ImageTexture_qoier") [node name="BtnRemovePrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] unique_name_in_owner = true @@ -66,6 +139,7 @@ layout_mode = 2 tooltip_text = "Remove the selected prototype" disabled = true text = "Remove" +icon = SubResource("ImageTexture_i8glk") [node name="VBoxContainer2" type="VBoxContainer" parent="Gui"] layout_mode = 2 diff --git a/addons/gloot/gloot.gd b/addons/gloot/gloot.gd index 64093f7d..ad9cd79b 100644 --- a/addons/gloot/gloot.gd +++ b/addons/gloot/gloot.gd @@ -2,72 +2,38 @@ extends EditorPlugin var inspector_plugin: EditorInspectorPlugin +static var _instance: EditorPlugin -func _enter_tree() -> void: - add_custom_type("ItemProtoset", "Resource", preload("core/item_protoset.gd"), preload("images/icon_item_protoset.svg")) - - add_custom_type("InventoryItem", "Node", preload("core/inventory_item.gd"), preload("images/icon_item.svg")) - - add_custom_type("Inventory", "Node", preload("core/inventory.gd"), preload("images/icon_inventory.svg")) - add_custom_type("InventoryStacked", "Node", preload("core/inventory_stacked.gd"), preload("images/icon_inventory_stacked.svg")) - add_custom_type("InventoryGrid", "Node", preload("core/inventory_grid.gd"), preload("images/icon_inventory_grid.svg")) - add_custom_type("InventoryGridStacked", "Node", preload("core/inventory_grid_stacked.gd"), preload("images/icon_inventory_grid_stacked.svg")) +func _init() -> void: + _instance = self - add_custom_type("ItemSlot", "Node", preload("core/item_slot.gd"), preload("images/icon_item_slot.svg")) - add_custom_type("CtrlInventory", "Control", preload("ui/ctrl_inventory.gd"), preload("images/icon_ctrl_inventory.svg")) - add_custom_type("CtrlInventoryStacked", "Control", preload("ui/ctrl_inventory_stacked.gd"), preload("images/icon_ctrl_inventory_stacked.svg")) - add_custom_type("CtrlInventoryGrid", "Control", preload("ui/ctrl_inventory_grid.gd"), preload("images/icon_ctrl_inventory_grid.svg")) - add_custom_type("CtrlInventoryGridEx", "Control", preload("ui/ctrl_inventory_grid_ex.gd"), preload("images/icon_ctrl_inventory_grid.svg")) - add_custom_type("CtrlItemSlot", "Control", preload("ui/ctrl_item_slot.gd"), preload("images/icon_ctrl_item_slot.svg")) - add_custom_type("CtrlItemSlotEx", "Control", preload("ui/ctrl_item_slot_ex.gd"), preload("images/icon_ctrl_item_slot.svg")) +static func instance() -> EditorPlugin: + return _instance - inspector_plugin = preload("res://addons/gloot/editor/inventory_inspector_plugin.gd").new() - inspector_plugin.editor_interface = get_editor_interface() - inspector_plugin.undo_redo_manager = get_undo_redo() - add_inspector_plugin(inspector_plugin) - add_autoload_singleton("GLoot", "res://addons/gloot/gloot_autoload.gd") +func _enter_tree() -> void: + inspector_plugin = preload("res://addons/gloot/editor/inventory_inspector_plugin.gd").new() + add_inspector_plugin(inspector_plugin) - _add_settings() + _add_settings() func _exit_tree() -> void: - remove_autoload_singleton("GLoot") - - remove_inspector_plugin(inspector_plugin) - - remove_custom_type("ItemProtoset") - - remove_custom_type("InventoryItem") - - remove_custom_type("Inventory") - remove_custom_type("InventoryStacked") - remove_custom_type("InventoryGrid") - remove_custom_type("InventoryGridStacked") - - remove_custom_type("ItemSlot") - - remove_custom_type("CtrlInventory") - remove_custom_type("CtrlInventoryStacked") - remove_custom_type("CtrlInventoryGrid") - remove_custom_type("CtrlInventoryGridEx") - remove_custom_type("CtrlItemSlot") - remove_custom_type("CtrlItemSlotEx") - + remove_inspector_plugin(inspector_plugin) func _add_settings() -> void: - _add_setting("gloot/inspector_control_height", TYPE_INT, 200) + _add_setting("gloot/inspector_control_height", TYPE_INT, 200) func _add_setting(name: String, type: int, value) -> void: - if !ProjectSettings.has_setting(name): - ProjectSettings.set(name, value) - - var property_info = { - "name": name, - "type": type - } - ProjectSettings.add_property_info(property_info) - ProjectSettings.set_initial_value(name, value) + if !ProjectSettings.has_setting(name): + ProjectSettings.set(name, value) + + var property_info = { + "name": name, + "type": type + } + ProjectSettings.add_property_info(property_info) + ProjectSettings.set_initial_value(name, value) diff --git a/addons/gloot/images/icon_inventory.svg.import b/addons/gloot/images/icon_inventory.svg.import index 2af2f081..dadd7032 100644 --- a/addons/gloot/images/icon_inventory.svg.import +++ b/addons/gloot/images/icon_inventory.svg.import @@ -3,26 +3,25 @@ importer="texture" type="CompressedTexture2D" uid="uid://df2n5aculnj82" -path.s3tc="res://.godot/imported/icon_inventory.svg-50bec89eff0070d5b4c81ef749399472.s3tc.ctex" +path="res://.godot/imported/icon_inventory.svg-50bec89eff0070d5b4c81ef749399472.ctex" metadata={ -"imported_formats": ["s3tc_bptc"], -"vram_texture": true +"vram_texture": false } [deps] source_file="res://addons/gloot/images/icon_inventory.svg" -dest_files=["res://.godot/imported/icon_inventory.svg-50bec89eff0070d5b4c81ef749399472.s3tc.ctex"] +dest_files=["res://.godot/imported/icon_inventory.svg-50bec89eff0070d5b4c81ef749399472.ctex"] [params] -compress/mode=2 +compress/mode=0 compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 compress/normal_map=0 compress/channel_pack=0 -mipmaps/generate=true +mipmaps/generate=false mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -32,7 +31,7 @@ process/normal_map_invert_y=false process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 -detect_3d/compress_to=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/addons/gloot/images/icon_item.svg.import b/addons/gloot/images/icon_item.svg.import index c8dd2142..87f2f070 100644 --- a/addons/gloot/images/icon_item.svg.import +++ b/addons/gloot/images/icon_item.svg.import @@ -3,26 +3,25 @@ importer="texture" type="CompressedTexture2D" uid="uid://qlt0i7muj2tj" -path.s3tc="res://.godot/imported/icon_item.svg-19f0c54092b35b57bc3510f8accf9092.s3tc.ctex" +path="res://.godot/imported/icon_item.svg-19f0c54092b35b57bc3510f8accf9092.ctex" metadata={ -"imported_formats": ["s3tc_bptc"], -"vram_texture": true +"vram_texture": false } [deps] source_file="res://addons/gloot/images/icon_item.svg" -dest_files=["res://.godot/imported/icon_item.svg-19f0c54092b35b57bc3510f8accf9092.s3tc.ctex"] +dest_files=["res://.godot/imported/icon_item.svg-19f0c54092b35b57bc3510f8accf9092.ctex"] [params] -compress/mode=2 +compress/mode=0 compress/high_quality=false compress/lossy_quality=0.7 compress/hdr_compression=1 compress/normal_map=0 compress/channel_pack=0 -mipmaps/generate=true +mipmaps/generate=false mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -32,7 +31,7 @@ process/normal_map_invert_y=false process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 -detect_3d/compress_to=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/addons/gloot/images/icon_item_ref_slot.svg b/addons/gloot/images/icon_item_ref_slot.svg new file mode 100644 index 00000000..c5da49e5 --- /dev/null +++ b/addons/gloot/images/icon_item_ref_slot.svg @@ -0,0 +1,77 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/addons/gloot/images/icon_item_ref_slot.svg.import b/addons/gloot/images/icon_item_ref_slot.svg.import new file mode 100644 index 00000000..ceb9a0dd --- /dev/null +++ b/addons/gloot/images/icon_item_ref_slot.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dagqmcoxvm3m6" +path="res://.godot/imported/icon_item_ref_slot.svg-c8a8d9826d793965417f19dda840f923.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/gloot/images/icon_item_ref_slot.svg" +dest_files=["res://.godot/imported/icon_item_ref_slot.svg-c8a8d9826d793965417f19dda840f923.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/addons/gloot/plugin.cfg b/addons/gloot/plugin.cfg index 6bcf22ff..1daa2975 100644 --- a/addons/gloot/plugin.cfg +++ b/addons/gloot/plugin.cfg @@ -3,5 +3,5 @@ name="GLoot" description="A universal inventory system for the Godot game engine" author="Peter Kish" -version="2.3.5" +version="2.4.0" script="gloot.gd" diff --git a/addons/gloot/ui/ctrl_dragable.gd b/addons/gloot/ui/ctrl_dragable.gd new file mode 100644 index 00000000..f34975de --- /dev/null +++ b/addons/gloot/ui/ctrl_dragable.gd @@ -0,0 +1,111 @@ +@tool +extends Control + +const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") +const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd") + +# Somewhat hacky way to do static signals: +# https://stackoverflow.com/questions/77026156/how-to-write-a-static-event-emitter-in-gdscript/77026952#77026952 + +static var dragable_grabbed: Signal = (func(): + (CtrlDragable as Object).add_user_signal("dragable_grabbed") + return Signal(CtrlDragable, "dragable_grabbed") +).call() + +static var dragable_dropped: Signal = (func(): + (CtrlDragable as Object).add_user_signal("dragable_dropped") + return Signal(CtrlDragable, "dragable_dropped") +).call() + +signal grabbed(position) +signal dropped(zone, position) + +static var _grabbed_dragable: CtrlDragable = null +static var _grab_offset: Vector2 + +var drag_preview: Control +var _preview_node := Node2D.new() +var drag_z_index := 1 + + +static func grab(dragable: CtrlDragable) -> void: + _grabbed_dragable = dragable + _grab_offset = dragable.get_global_mouse_position() - dragable.global_position + + dragable.mouse_filter = Control.MOUSE_FILTER_IGNORE + dragable.grabbed.emit(_grab_offset) + dragable_grabbed.emit(dragable, _grab_offset) + dragable.drag_start() + + +static func release() -> void: + _drop(null) + + +static func release_on(zone: CtrlDropZone) -> void: + _drop(zone) + + +static func _drop(zone: CtrlDropZone) -> void: + var grabbed_dragable := _grabbed_dragable + var grab_offset := _grab_offset + _grabbed_dragable = null + _grab_offset = Vector2.ZERO + grabbed_dragable.mouse_filter = Control.MOUSE_FILTER_PASS + var local_drop_position := Vector2.ZERO + if zone != null: + local_drop_position = zone.get_local_mouse_position() - grab_offset + + grabbed_dragable.drag_end() + grabbed_dragable.dropped.emit(zone, local_drop_position) + dragable_dropped.emit(grabbed_dragable, zone, local_drop_position) + + +static func get_grabbed_dragable() -> CtrlDragable: + return _grabbed_dragable + + +static func get_grab_offset() -> Vector2: + return _grab_offset + + +func drag_start() -> void: + if drag_preview == null: + return + + drag_preview.mouse_filter = Control.MOUSE_FILTER_IGNORE + drag_preview.global_position = get_global_mouse_position() - get_grab_offset() + add_child(_preview_node) + _preview_node.add_child(drag_preview) + _preview_node.z_index = drag_z_index + + +func drag_end() -> void: + if drag_preview == null: + return + + _preview_node.remove_child(drag_preview) + remove_child(_preview_node) + drag_preview.mouse_filter = Control.MOUSE_FILTER_PASS + + +func _process(_delta) -> void: + if drag_preview: + drag_preview.global_position = get_global_mouse_position() - get_grab_offset() + + +func _gui_input(event: InputEvent) -> void: + if !(event is InputEventMouseButton): + return + + var mb_event: InputEventMouseButton = event + if mb_event.button_index != MOUSE_BUTTON_LEFT: + return + + if mb_event.is_pressed(): + grab(self) + + +func is_dragged() -> bool: + return _grabbed_dragable == self + diff --git a/addons/gloot/ui/ctrl_drop_zone.gd b/addons/gloot/ui/ctrl_drop_zone.gd new file mode 100644 index 00000000..992c6331 --- /dev/null +++ b/addons/gloot/ui/ctrl_drop_zone.gd @@ -0,0 +1,64 @@ +@tool +extends Control + +signal dragable_dropped(dragable, position) + +const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") +const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd") + +var _mouse_inside := false +static var _drop_event: Dictionary = {} + + +func _process(_delta) -> void: + if _drop_event.is_empty(): + return + + if _drop_event.zone == null: + CtrlDragable.release() + else: + if _drop_event.zone != self: + return + _drop_event.zone.dragable_dropped.emit( + CtrlDragable.get_grabbed_dragable(), + get_local_mouse_position() - CtrlDragable.get_grab_offset() + ) + CtrlDragable.release_on(self) + + _drop_event = {} + + +func _input(event: InputEvent) -> void: + if !(event is InputEventMouseButton): + return + + var mb_event: InputEventMouseButton = event + if mb_event.is_pressed() || mb_event.button_index != MOUSE_BUTTON_LEFT: + return + + if CtrlDragable.get_grabbed_dragable() == null: + return + + if _mouse_inside: + _drop_event = {zone = self} + elif _drop_event.is_empty(): + _drop_event = {zone = null} + + +func activate() -> void: + mouse_filter = Control.MOUSE_FILTER_PASS + + +func deactivate() -> void: + mouse_filter = Control.MOUSE_FILTER_IGNORE + _mouse_inside = false + + +func is_active() -> bool: + return (mouse_filter != Control.MOUSE_FILTER_IGNORE) + + +func _ready() -> void: + mouse_entered.connect(func(): _mouse_inside = true) + mouse_exited.connect(func(): _mouse_inside = false) + diff --git a/addons/gloot/ui/ctrl_inventory.gd b/addons/gloot/ui/ctrl_inventory.gd index a3396312..da7aa2d2 100644 --- a/addons/gloot/ui/ctrl_inventory.gd +++ b/addons/gloot/ui/ctrl_inventory.gd @@ -1,39 +1,40 @@ @tool +@icon("res://addons/gloot/images/icon_ctrl_inventory.svg") class_name CtrlInventory extends Control signal inventory_item_activated(item) @export var inventory_path: NodePath : - get: - return inventory_path - set(new_inv_path): - inventory_path = new_inv_path - var node: Node = get_node_or_null(inventory_path) + get: + return inventory_path + set(new_inv_path): + inventory_path = new_inv_path + var node: Node = get_node_or_null(inventory_path) - if node == null: - return + if node == null: + return - if is_inside_tree(): - assert(node is Inventory) - - self.inventory = node - update_configuration_warnings() + if is_inside_tree(): + assert(node is Inventory) + + self.inventory = node + update_configuration_warnings() @export var default_item_icon: Texture2D var inventory: Inventory = null : - get: - return inventory - set(new_inventory): - if new_inventory == inventory: - return - - _disconnect_inventory_signals() - inventory = new_inventory - _connect_inventory_signals() - - _refresh() + get: + return inventory + set(new_inventory): + if new_inventory == inventory: + return + + _disconnect_inventory_signals() + inventory = new_inventory + _connect_inventory_signals() + + _refresh() var _vbox_container: VBoxContainer var _item_list: ItemList @@ -42,124 +43,124 @@ const KEY_NAME = "name" func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "This node is not linked to an inventory, so it can't display any content.\n" + \ - "Set the inventory_path property to point to an Inventory node."]) - return PackedStringArray() + if inventory_path.is_empty(): + return PackedStringArray([ + "This node is not linked to an inventory, so it can't display any content.\n" + \ + "Set the inventory_path property to point to an Inventory node."]) + return PackedStringArray() func _ready(): - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if _vbox_container: - _vbox_container.queue_free() + if Engine.is_editor_hint(): + # Clean up, in case it is duplicated in the editor + if _vbox_container: + _vbox_container.queue_free() - _vbox_container = VBoxContainer.new() - _vbox_container.size_flags_horizontal = SIZE_EXPAND_FILL - _vbox_container.size_flags_vertical = SIZE_EXPAND_FILL - _vbox_container.anchor_right = 1.0 - _vbox_container.anchor_bottom = 1.0 - add_child(_vbox_container) + _vbox_container = VBoxContainer.new() + _vbox_container.size_flags_horizontal = SIZE_EXPAND_FILL + _vbox_container.size_flags_vertical = SIZE_EXPAND_FILL + _vbox_container.anchor_right = 1.0 + _vbox_container.anchor_bottom = 1.0 + add_child(_vbox_container) - _item_list = ItemList.new() - _item_list.size_flags_horizontal = SIZE_EXPAND_FILL - _item_list.size_flags_vertical = SIZE_EXPAND_FILL - _item_list.item_activated.connect(Callable(self, "_on_list_item_activated")) - _vbox_container.add_child(_item_list) + _item_list = ItemList.new() + _item_list.size_flags_horizontal = SIZE_EXPAND_FILL + _item_list.size_flags_vertical = SIZE_EXPAND_FILL + _item_list.item_activated.connect(_on_list_item_activated) + _vbox_container.add_child(_item_list) - if has_node(inventory_path): - self.inventory = get_node(inventory_path) + if has_node(inventory_path): + self.inventory = get_node(inventory_path) - _refresh() + _refresh() func _connect_inventory_signals() -> void: - if !inventory: - return + if !inventory: + return - if !inventory.contents_changed.is_connected(Callable(self, "_refresh")): - inventory.contents_changed.connect(Callable(self, "_refresh")) - if !inventory.item_modified.is_connected(Callable(self, "_on_item_modified")): - inventory.item_modified.connect(Callable(self, "_on_item_modified")) + if !inventory.contents_changed.is_connected(_refresh): + inventory.contents_changed.connect(_refresh) + if !inventory.item_modified.is_connected(_on_item_modified): + inventory.item_modified.connect(_on_item_modified) func _disconnect_inventory_signals() -> void: - if !inventory: - return + if !inventory: + return - if inventory.contents_changed.is_connected(Callable(self, "_refresh")): - inventory.contents_changed.disconnect(Callable(self, "_refresh")) - if inventory.item_modified.is_connected(Callable(self, "_on_item_modified")): - inventory.item_modified.disconnect(Callable(self, "_on_item_modified")) + if inventory.contents_changed.is_connected(_refresh): + inventory.contents_changed.disconnect(_refresh) + if inventory.item_modified.is_connected(_on_item_modified): + inventory.item_modified.disconnect(_on_item_modified) func _on_list_item_activated(index: int) -> void: - inventory_item_activated.emit(_get_inventory_item(index)) + inventory_item_activated.emit(_get_inventory_item(index)) func _on_item_modified(_item: InventoryItem) -> void: - _refresh() + _refresh() func _refresh() -> void: - if is_inside_tree(): - _clear_list() - _populate_list() + if is_inside_tree(): + _clear_list() + _populate_list() func _clear_list() -> void: - if _item_list: - _item_list.clear() + if _item_list: + _item_list.clear() func _populate_list() -> void: - if inventory == null: - return + if inventory == null: + return - for item in inventory.get_items(): - var texture := item.get_texture() - if !texture: - texture = default_item_icon - _item_list.add_item(_get_item_title(item), texture) - _item_list.set_item_metadata(_item_list.get_item_count() - 1, item) + for item in inventory.get_items(): + var texture := item.get_texture() + if !texture: + texture = default_item_icon + _item_list.add_item(_get_item_title(item), texture) + _item_list.set_item_metadata(_item_list.get_item_count() - 1, item) func _get_item_title(item: InventoryItem) -> String: - if item == null: - return "" + if item == null: + return "" - var title = item.get_title() - var stack_size: int = InventoryStacked.get_item_stack_size(item) - if stack_size > 1: - title = "%s (x%d)" % [title, stack_size] + var title = item.get_title() + var stack_size: int = InventoryStacked.get_item_stack_size(item) + if stack_size > 1: + title = "%s (x%d)" % [title, stack_size] - return title + return title func get_selected_inventory_item() -> InventoryItem: - if _item_list.get_selected_items().is_empty(): - return null + if _item_list.get_selected_items().is_empty(): + return null - return _get_inventory_item(_item_list.get_selected_items()[0]) + return _get_inventory_item(_item_list.get_selected_items()[0]) func _get_inventory_item(index: int) -> InventoryItem: - assert(index >= 0) - assert(index < _item_list.get_item_count()) + assert(index >= 0) + assert(index < _item_list.get_item_count()) - return _item_list.get_item_metadata(index) + return _item_list.get_item_metadata(index) func deselect_inventory_item() -> void: - _item_list.deselect_all() + _item_list.deselect_all() func select_inventory_item(item: InventoryItem) -> void: - _item_list.deselect_all() - for index in _item_list.item_count: - if _item_list.get_item_metadata(index) != item: - continue - _item_list.select(index) - return + _item_list.deselect_all() + for index in _item_list.item_count: + if _item_list.get_item_metadata(index) != item: + continue + _item_list.select(index) + return diff --git a/addons/gloot/ui/ctrl_inventory_grid.gd b/addons/gloot/ui/ctrl_inventory_grid.gd index 64016a4b..ed10f7fa 100644 --- a/addons/gloot/ui/ctrl_inventory_grid.gd +++ b/addons/gloot/ui/ctrl_inventory_grid.gd @@ -1,4 +1,5 @@ @tool +@icon("res://addons/gloot/images/icon_ctrl_inventory_grid.svg") class_name CtrlInventoryGrid extends Control @@ -8,493 +9,444 @@ signal inventory_item_activated(item) signal item_mouse_entered(item) signal item_mouse_exited(item) +const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") +const CtrlInventoryItemRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd") +const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd") +const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") + @export var field_dimensions: Vector2 = Vector2(32, 32) : - get: - return field_dimensions - set(new_field_dimensions): - field_dimensions = new_field_dimensions - _refresh_grid_container() + get: + return field_dimensions + set(new_field_dimensions): + field_dimensions = new_field_dimensions + _refresh_grid_container() @export var item_spacing: int = 0 : - get: - return item_spacing - set(new_item_spacing): - item_spacing = new_item_spacing - _refresh() + get: + return item_spacing + set(new_item_spacing): + item_spacing = new_item_spacing + _refresh() @export var draw_grid: bool = true : - get: - return draw_grid - set(new_draw_grid): - draw_grid = new_draw_grid - _refresh() + get: + return draw_grid + set(new_draw_grid): + draw_grid = new_draw_grid + _refresh() @export var grid_color: Color = Color.BLACK : - get: - return grid_color - set(new_grid_color): - grid_color = new_grid_color - _refresh() + get: + return grid_color + set(new_grid_color): + grid_color = new_grid_color + _refresh() @export var draw_selections: bool = false : - get: - return draw_selections - set(new_draw_selections): - draw_selections = new_draw_selections + get: + return draw_selections + set(new_draw_selections): + draw_selections = new_draw_selections @export var selection_color: Color = Color.GRAY @export var inventory_path: NodePath : - get: - return inventory_path - set(new_inv_path): - inventory_path = new_inv_path - var node: Node = get_node_or_null(inventory_path) - - if node == null: - return - - if is_inside_tree(): - assert(node is InventoryGrid) - - self.inventory = node - update_configuration_warnings() + get: + return inventory_path + set(new_inv_path): + inventory_path = new_inv_path + var node: Node = get_node_or_null(inventory_path) + + if node == null: + return + + if is_inside_tree(): + assert(node is InventoryGrid) + + self.inventory = node + update_configuration_warnings() @export var default_item_texture: Texture2D : - get: - return default_item_texture - set(new_default_item_texture): - default_item_texture = new_default_item_texture - _refresh() + get: + return default_item_texture + set(new_default_item_texture): + default_item_texture = new_default_item_texture + _refresh() @export var stretch_item_sprites: bool = true : - get: - return stretch_item_sprites - set(new_stretch_item_sprites): - stretch_item_sprites = new_stretch_item_sprites - _refresh() + get: + return stretch_item_sprites + set(new_stretch_item_sprites): + stretch_item_sprites = new_stretch_item_sprites + _refresh() @export var drag_sprite_z_index: int = 1 var inventory: InventoryGrid = null : - get: - return inventory - set(new_inventory): - if inventory == new_inventory: - return - - _select(null) - - _disconnect_inventory_signals() - inventory = new_inventory - _connect_inventory_signals() - - _refresh() -var _gloot_undo_redo = null -var _grabbed_ctrl_inventory_item = null -var _grab_offset: Vector2 -var _ctrl_inventory_item_script = preload("ctrl_inventory_item_rect.gd") -var _drag_sprite: WeakRef = weakref(null) + get: + return inventory + set(new_inventory): + if inventory == new_inventory: + return + + _select(null) + + _disconnect_inventory_signals() + inventory = new_inventory + _connect_inventory_signals() + + _refresh() var _ctrl_item_container: WeakRef = weakref(null) +var _ctrl_drop_zone: CtrlDropZone var _selected_item: InventoryItem = null -var _gloot: Node = null func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "This node is not linked to an inventory, so it can't display any content.\n" + \ - "Set the inventory_path property to point to an InventoryGrid node."]) - return PackedStringArray() + if inventory_path.is_empty(): + return PackedStringArray([ + "This node is not linked to an inventory, so it can't display any content.\n" + \ + "Set the inventory_path property to point to an InventoryGrid node."]) + return PackedStringArray() func _ready() -> void: - _gloot = _get_gloot() - - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - var ctrl_item_container = _ctrl_item_container.get_ref() - if ctrl_item_container: - ctrl_item_container.queue_free() - if _drag_sprite.get_ref(): - _drag_sprite.get_ref().queue_free() - - var ctrl_item_container = Control.new() - ctrl_item_container.size_flags_horizontal = SIZE_EXPAND_FILL - ctrl_item_container.size_flags_vertical = SIZE_EXPAND_FILL - ctrl_item_container.anchor_right = 1.0 - ctrl_item_container.anchor_bottom = 1.0 - add_child(ctrl_item_container) - _ctrl_item_container = weakref(ctrl_item_container) - - var drag_sprite = Sprite2D.new() - drag_sprite.centered = false - drag_sprite.z_index = drag_sprite_z_index - drag_sprite.hide() - add_child(drag_sprite) - _drag_sprite = weakref(drag_sprite) - - if has_node(inventory_path): - self.inventory = get_node_or_null(inventory_path) - - _refresh() - if !Engine.is_editor_hint() && _gloot: - _gloot.item_dropped.connect(Callable(self, "_on_item_dropped")) - - -func _get_gloot() -> Node: - # This is a "temporary" hack until a better solution is found! - # This is a tool script that is also executed inside the editor, where the "GLoot" singleton is - # not visible - leading to errors inside the editor. - # To work around that, we obtain the singleton by name. - return get_tree().root.get_node_or_null("GLoot") + if Engine.is_editor_hint(): + # Clean up, in case it is duplicated in the editor + var ctrl_item_container = _ctrl_item_container.get_ref() + if ctrl_item_container: + ctrl_item_container.queue_free() + + var ctrl_item_container = Control.new() + ctrl_item_container.size_flags_horizontal = SIZE_EXPAND_FILL + ctrl_item_container.size_flags_vertical = SIZE_EXPAND_FILL + ctrl_item_container.anchor_right = 1.0 + ctrl_item_container.anchor_bottom = 1.0 + add_child(ctrl_item_container) + _ctrl_item_container = weakref(ctrl_item_container) + + _ctrl_drop_zone = CtrlDropZone.new() + _ctrl_drop_zone.dragable_dropped.connect(_on_dragable_dropped) + _ctrl_drop_zone.size = size + resized.connect(func(): _ctrl_drop_zone.size = size) + CtrlDragable.dragable_grabbed.connect(func(dragable: CtrlDragable, grab_position: Vector2): + _ctrl_drop_zone.activate() + ) + CtrlDragable.dragable_dropped.connect(func(dragable: CtrlDragable, zone: CtrlDropZone, drop_position: Vector2): + _ctrl_drop_zone.deactivate() + ) + _ctrl_drop_zone.mouse_entered.connect(_on_drop_zone_mouse_entered) + _ctrl_drop_zone.mouse_exited.connect(_on_drop_zone_mouse_exited) + add_child(_ctrl_drop_zone) + _ctrl_drop_zone.deactivate() + + ctrl_item_container.resized.connect(func(): _ctrl_drop_zone.size = ctrl_item_container.size) + + if has_node(inventory_path): + self.inventory = get_node_or_null(inventory_path) + + _refresh() func _connect_inventory_signals() -> void: - if !inventory: - return + if !inventory: + return - if !inventory.contents_changed.is_connected(Callable(self, "_refresh")): - inventory.contents_changed.connect(Callable(self, "_refresh")) - if !inventory.item_modified.is_connected(Callable(self, "_on_item_modified")): - inventory.item_modified.connect(Callable(self, "_on_item_modified")) - if !inventory.size_changed.is_connected(Callable(self, "_on_inventory_resized")): - inventory.size_changed.connect(Callable(self, "_on_inventory_resized")) - if !inventory.item_removed.is_connected(Callable(self, "_on_item_removed")): - inventory.item_removed.connect(Callable(self, "_on_item_removed")) + if !inventory.contents_changed.is_connected(_refresh): + inventory.contents_changed.connect(_refresh) + if !inventory.item_modified.is_connected(_on_item_modified): + inventory.item_modified.connect(_on_item_modified) + if !inventory.size_changed.is_connected(_on_inventory_resized): + inventory.size_changed.connect(_on_inventory_resized) + if !inventory.item_removed.is_connected(_on_item_removed): + inventory.item_removed.connect(_on_item_removed) func _disconnect_inventory_signals() -> void: - if !inventory: - return + if !inventory: + return - if inventory.contents_changed.is_connected(Callable(self, "_refresh")): - inventory.contents_changed.disconnect(Callable(self, "_refresh")) - if inventory.item_modified.is_connected(Callable(self, "_on_item_modified")): - inventory.item_modified.disconnect(Callable(self, "_on_item_modified")) - if inventory.size_changed.is_connected(Callable(self, "_on_inventory_resized")): - inventory.size_changed.disconnect(Callable(self, "_on_inventory_resized")) - if inventory.item_removed.is_connected(Callable(self, "_on_item_removed")): - inventory.item_removed.disconnect(Callable(self, "_on_item_removed")) + if inventory.contents_changed.is_connected(_refresh): + inventory.contents_changed.disconnect(_refresh) + if inventory.item_modified.is_connected(_on_item_modified): + inventory.item_modified.disconnect(_on_item_modified) + if inventory.size_changed.is_connected(_on_inventory_resized): + inventory.size_changed.disconnect(_on_inventory_resized) + if inventory.item_removed.is_connected(_on_item_removed): + inventory.item_removed.disconnect(_on_item_removed) func _on_item_modified(_item: InventoryItem) -> void: - _refresh() + _refresh() func _on_inventory_resized() -> void: - _refresh() + _refresh() func _on_item_removed(_item: InventoryItem) -> void: - if _item == _selected_item: - _select(null) + if _item == _selected_item: + _select(null) func _refresh() -> void: - _refresh_grid_container() - _clear_list() - _populate_list() - queue_redraw() - - -func _process(_delta) -> void: - var drag_sprite = _drag_sprite.get_ref() - if drag_sprite && drag_sprite.visible: - drag_sprite.global_position = get_global_mouse_position() - _grab_offset + _refresh_grid_container() + _clear_list() + _populate_list() + queue_redraw() func _draw() -> void: - if !inventory: - return - if draw_grid: - _draw_grid(Vector2.ZERO, inventory.size.x, inventory.size.y, field_dimensions, item_spacing) + if !inventory: + return + if draw_grid: + _draw_grid(Vector2.ZERO, inventory.size.x, inventory.size.y, field_dimensions, item_spacing) func _draw_grid(pos: Vector2, w: int, h: int, fsize: Vector2, spacing: int) -> void: - if w <= 0 || h <= 0 || spacing < 0: - return - - if spacing <= 1: - var rect = Rect2(pos, _get_inventory_size_px()) - draw_rect(rect, grid_color, false) - for i in range(w): - var from: Vector2 = Vector2(i * fsize.x, 0) + pos - var to: Vector2 = Vector2(i * fsize.x, rect.size.y) + pos - from += Vector2(spacing, 0) - to += Vector2(spacing, 0) - draw_line(from, to, grid_color) - for j in range(h): - var from: Vector2 = Vector2(0, j * fsize.y) + pos - var to: Vector2 = Vector2(rect.size.x, j * fsize.y) + pos - from += Vector2(0, spacing) - to += Vector2(0, spacing) - draw_line(from, to, grid_color) - else: - for i in range(w): - for j in range(h): - var field_pos = pos + Vector2(i * fsize.x, j * fsize.y) + Vector2(i, j) * spacing - var field_rect = Rect2(field_pos, fsize) - draw_rect(field_rect, grid_color, false) + if w <= 0 || h <= 0 || spacing < 0: + return + + if spacing <= 1: + var rect = Rect2(pos, _get_inventory_size_px()) + draw_rect(rect, grid_color, false) + for i in range(w): + var from: Vector2 = Vector2(i * fsize.x, 0) + pos + var to: Vector2 = Vector2(i * fsize.x, rect.size.y) + pos + from += Vector2(spacing, 0) + to += Vector2(spacing, 0) + draw_line(from, to, grid_color) + for j in range(h): + var from: Vector2 = Vector2(0, j * fsize.y) + pos + var to: Vector2 = Vector2(rect.size.x, j * fsize.y) + pos + from += Vector2(0, spacing) + to += Vector2(0, spacing) + draw_line(from, to, grid_color) + else: + for i in range(w): + for j in range(h): + var field_pos = pos + Vector2(i * fsize.x, j * fsize.y) + Vector2(i, j) * spacing + var field_rect = Rect2(field_pos, fsize) + draw_rect(field_rect, grid_color, false) func _get_inventory_size_px() -> Vector2: - var result := Vector2(inventory.size.x * field_dimensions.x, \ - inventory.size.y * field_dimensions.y) + var result := Vector2(inventory.size.x * field_dimensions.x, \ + inventory.size.y * field_dimensions.y) - # Also take item spacing into consideration - result += Vector2(inventory.size - Vector2i.ONE) * item_spacing + # Also take item spacing into consideration + result += Vector2(inventory.size - Vector2i.ONE) * item_spacing - return result + return result func _refresh_grid_container() -> void: - if !inventory: - return + if !inventory: + return - custom_minimum_size = _get_inventory_size_px() - size = custom_minimum_size + custom_minimum_size = _get_inventory_size_px() + size = custom_minimum_size func _clear_list() -> void: - var ctrl_item_container = _ctrl_item_container.get_ref() - if !ctrl_item_container: - return + var ctrl_item_container = _ctrl_item_container.get_ref() + if !ctrl_item_container: + return - for ctrl_inventory_item in ctrl_item_container.get_children(): - ctrl_item_container.remove_child(ctrl_inventory_item) - ctrl_inventory_item.queue_free() - - _grabbed_ctrl_inventory_item = null + for ctrl_inventory_item in ctrl_item_container.get_children(): + ctrl_item_container.remove_child(ctrl_inventory_item) + ctrl_inventory_item.queue_free() func _populate_list() -> void: - var ctrl_item_container = _ctrl_item_container.get_ref() - if inventory == null || ctrl_item_container == null: - return - - for item in inventory.get_items(): - var ctrl_inventory_item = _ctrl_inventory_item_script.new() - ctrl_inventory_item.ctrl_inventory = self - ctrl_inventory_item.texture = default_item_texture - ctrl_inventory_item.item = item - ctrl_inventory_item.grabbed.connect(Callable(self, "_on_item_grab")) - ctrl_inventory_item.activated.connect(Callable(self, "_on_item_activated")) - ctrl_inventory_item.mouse_entered.connect(Callable(self, "_on_item_mouse_entered").bind(ctrl_inventory_item)) - ctrl_inventory_item.mouse_exited.connect(Callable(self, "_on_item_mouse_exited").bind(ctrl_inventory_item)) - ctrl_item_container.add_child(ctrl_inventory_item) - - _refresh_selection() + var ctrl_item_container = _ctrl_item_container.get_ref() + if inventory == null || ctrl_item_container == null: + return + + for item in inventory.get_items(): + var ctrl_inventory_item = CtrlInventoryItemRect.new() + ctrl_inventory_item.texture = default_item_texture + ctrl_inventory_item.item = item + ctrl_inventory_item.drag_z_index = drag_sprite_z_index + ctrl_inventory_item.grabbed.connect(_on_item_grab.bind(ctrl_inventory_item)) + ctrl_inventory_item.dropped.connect(_on_item_drop.bind(ctrl_inventory_item)) + ctrl_inventory_item.activated.connect(_on_item_activated.bind(ctrl_inventory_item)) + ctrl_inventory_item.mouse_entered.connect(_on_item_mouse_entered.bind(ctrl_inventory_item)) + ctrl_inventory_item.mouse_exited.connect(_on_item_mouse_exited.bind(ctrl_inventory_item)) + ctrl_inventory_item.size = _get_item_sprite_size(item) + + ctrl_inventory_item.position = _get_field_position(inventory.get_item_position(item)) + if !stretch_item_sprites: + # Position the item centered when it's not streched + ctrl_inventory_item.position += _get_unstreched_sprite_offset(item) + + ctrl_item_container.add_child(ctrl_inventory_item) + + _refresh_selection() func _refresh_selection() -> void: - if !draw_selections: - return - - if !_ctrl_item_container.get_ref(): - return - - for ctrl_item in _ctrl_item_container.get_ref().get_children(): - ctrl_item.selected = ctrl_item.item && (ctrl_item.item == _selected_item) - ctrl_item.selection_bg_color = selection_color - - -func _on_item_grab(ctrl_inventory_item, offset: Vector2) -> void: - _select(null) - _grabbed_ctrl_inventory_item = ctrl_inventory_item - _grabbed_ctrl_inventory_item.hide() - _grab_offset = offset - if _gloot: - _gloot._grabbed_inventory_item = get_grabbed_item() - _gloot._grab_offset = _grab_offset - var drag_sprite = _drag_sprite.get_ref() - if drag_sprite: - drag_sprite.texture = ctrl_inventory_item.texture - if drag_sprite.texture == null: - drag_sprite.texture = default_item_texture - if stretch_item_sprites: - var texture_size: Vector2 = drag_sprite.texture.get_size() - var streched_size: Vector2 = _get_streched_item_sprite_size(ctrl_inventory_item.item) - drag_sprite.scale = streched_size / texture_size - drag_sprite.show() - - -func _get_streched_item_sprite_size(item: InventoryItem) -> Vector2: - var item_size := inventory.get_item_size(item) - var sprite_size := Vector2(item_size) * field_dimensions + if !draw_selections: + return - # Also take item spacing into consideration - sprite_size += (Vector2(item_size) - Vector2.ONE) * item_spacing + if !_ctrl_item_container.get_ref(): + return - return sprite_size + for ctrl_item in _ctrl_item_container.get_ref().get_children(): + ctrl_item.selected = ctrl_item.item && (ctrl_item.item == _selected_item) + ctrl_item.selection_bg_color = selection_color -func _on_item_activated(ctrl_inventory_item) -> void: - var item = ctrl_inventory_item.item - if !item: - return +func _on_item_grab(offset: Vector2, ctrl_inventory_item: CtrlInventoryItemRect) -> void: + _select(null) - _grabbed_ctrl_inventory_item = null - if _drag_sprite.get_ref(): - _drag_sprite.get_ref().hide() - inventory_item_activated.emit(item) +func _on_item_drop(zone: CtrlDropZone, drop_position: Vector2, ctrl_inventory_item: CtrlInventoryItemRect) -> void: + var item = ctrl_inventory_item.item + # The item might have been freed in case the item stack has been moved and merged with another + # stack. + if is_instance_valid(item) and inventory.has_item(item): + _select(item) -func _on_item_mouse_entered(ctrl_inventory_item) -> void: - item_mouse_entered.emit(ctrl_inventory_item.item) +func _get_item_sprite_size(item: InventoryItem) -> Vector2: + if stretch_item_sprites: + return _get_streched_item_sprite_size(item) + else: + return item.get_texture().get_size() -func _on_item_mouse_exited(ctrl_inventory_item) -> void: - item_mouse_exited.emit(ctrl_inventory_item.item) - - -func _select(item: InventoryItem) -> void: - if item == _selected_item: - return - - _selected_item = item - _refresh_selection() - selection_changed.emit() +func _get_streched_item_sprite_size(item: InventoryItem) -> Vector2: + var item_size := inventory.get_item_size(item) + var sprite_size := Vector2(item_size) * field_dimensions + # Also take item spacing into consideration + sprite_size += (Vector2(item_size) - Vector2.ONE) * item_spacing -# Using _input instead of _gui_input because _gui_input is only called for "mouse released" -# (InputEventMouseButton.pressed==false) events if the same control previously triggered the "mouse -# pressed" event (InputEventMouseButton.pressed==true). -# This makes dragging items from one CtrlInventoryGrid to another impossible to implement with -# _gui_input. -func _input(event: InputEvent) -> void: - if !(event is InputEventMouseButton): - return + return sprite_size - if !_grabbed_ctrl_inventory_item: - return - var mb_event: InputEventMouseButton = event - if mb_event.is_pressed() || mb_event.button_index != MOUSE_BUTTON_LEFT: - return +func _get_unstreched_sprite_offset(item: InventoryItem) -> Vector2: + var texture = item.get_texture() + if texture == null: + texture = default_item_texture + if texture == null: + return Vector2.ZERO + return (_get_streched_item_sprite_size(item) - texture.get_size()) / 2 - _handle_item_release(_grabbed_ctrl_inventory_item.item) +func _on_item_activated(ctrl_inventory_item: CtrlInventoryItemRect) -> void: + var item = ctrl_inventory_item.item + if !item: + return -func _handle_item_release(item: InventoryItem) -> void: - _grabbed_ctrl_inventory_item.show() + inventory_item_activated.emit(item) - if _gloot: - _gloot._grabbed_inventory_item = null - var global_grabbed_item_pos := _get_grabbed_item_global_pos() - if _is_hovering(global_grabbed_item_pos): - _handle_item_move(item, global_grabbed_item_pos) - else: - _handle_item_drop(item, global_grabbed_item_pos) +func _on_item_mouse_entered(ctrl_inventory_item) -> void: + item_mouse_entered.emit(ctrl_inventory_item.item) - # The item might have been freed in case the item stack has been moved and merged with another - # stack. - if is_instance_valid(item) and inventory.has_item(item): - _select(item) - _grabbed_ctrl_inventory_item = null - if _drag_sprite.get_ref(): - _drag_sprite.get_ref().hide() +func _on_item_mouse_exited(ctrl_inventory_item) -> void: + item_mouse_exited.emit(ctrl_inventory_item.item) -func _handle_item_move(item: InventoryItem, global_grabbed_item_pos: Vector2) -> void: - var field_coords = get_field_coords(global_grabbed_item_pos) - if inventory.rect_free(Rect2i(field_coords, inventory.get_item_size(item)), item): - _move_item(item, field_coords) - elif inventory is InventoryGridStacked: - _merge_item(item, field_coords) +func _select(item: InventoryItem) -> void: + if item == _selected_item: + return + _selected_item = item + _refresh_selection() + selection_changed.emit() -func _handle_item_drop(item: InventoryItem, global_grabbed_item_pos: Vector2) -> void: - # Using WeakRefs for the item_dropped signals, as items might be freed at some point of dropping - # (when merging with other items) - var wr_item := weakref(item) - item_dropped.emit(wr_item, global_grabbed_item_pos) - if !Engine.is_editor_hint() && _gloot: - _gloot.item_dropped.emit(wr_item, global_grabbed_item_pos) +func _on_drop_zone_mouse_entered() -> void: + if CtrlDragable._grabbed_dragable == null: + return + var _grabbed_ctrl := (CtrlDragable._grabbed_dragable as CtrlInventoryItemRect) + if _grabbed_ctrl == null || _grabbed_ctrl.item == null: + return + CtrlInventoryItemRect.override_preview_size(_get_item_sprite_size(_grabbed_ctrl.item)) -func _get_grabbed_item_global_pos() -> Vector2: - return get_global_mouse_position() - _grab_offset + (field_dimensions / 2) +func _on_drop_zone_mouse_exited() -> void: + CtrlInventoryItemRect.restore_preview_size() -func _on_item_dropped(wr_item: WeakRef, global_drop_pos: Vector2) -> void: - var item: InventoryItem = wr_item.get_ref() - if item == null: - return - if !_is_hovering(global_drop_pos): - return +func _on_dragable_dropped(dragable: CtrlDragable, drop_position: Vector2) -> void: + var item: InventoryItem = dragable.item + if item == null: + return - if !inventory: - return + if !inventory: + return - var source_inventory: InventoryGrid = item.get_inventory() - if source_inventory.item_protoset != inventory.item_protoset: - return + if inventory.has_item(item): + _handle_item_move(item, drop_position) + else: + _handle_item_transfer(item, drop_position) - var field_coords = get_field_coords(global_drop_pos) - source_inventory.transfer_to(item, inventory, field_coords) +func _handle_item_move(item: InventoryItem, drop_position: Vector2) -> void: + var field_coords = get_field_coords(drop_position + (field_dimensions / 2)) + if inventory.rect_free(Rect2i(field_coords, inventory.get_item_size(item)), item): + _move_item(item, field_coords) + elif inventory is InventoryGridStacked: + _merge_item(item, field_coords) -func _is_hovering(global_pos: Vector2) -> bool: - return get_global_rect().has_point(global_pos) +func _handle_item_transfer(item: InventoryItem, drop_position: Vector2) -> void: + var source_inventory: InventoryGrid = item.get_inventory() + + var field_coords = get_field_coords(drop_position + (field_dimensions / 2)) + if source_inventory != null: + if source_inventory.item_protoset != inventory.item_protoset: + return + source_inventory.transfer_to(item, inventory, field_coords) + else: + inventory.add_item_at(item, field_coords) -func get_field_coords(global_pos: Vector2) -> Vector2i: - var local_pos = global_pos - get_global_rect().position - # We have to consider the item spacing when calculating field coordinates, thus we expand the - # size of each field by Vector2(item_spacing, item_spacing). - var field_dimensions_ex = field_dimensions + Vector2(item_spacing, item_spacing) +func get_field_coords(local_pos: Vector2) -> Vector2i: + # We have to consider the item spacing when calculating field coordinates, thus we expand the + # size of each field by Vector2(item_spacing, item_spacing). + var field_dimensions_ex = field_dimensions + Vector2(item_spacing, item_spacing) - # We also don't want the item spacing to disturb snapping to the closest field, so we add half - # the spacing to the local coordinates. - var local_pos_ex = local_pos + Vector2(item_spacing, item_spacing) / 2 + # We also don't want the item spacing to disturb snapping to the closest field, so we add half + # the spacing to the local coordinates. + var local_pos_ex = local_pos + (Vector2(item_spacing, item_spacing) / 2) - var x: int = local_pos_ex.x / (field_dimensions_ex.x) - var y: int = local_pos_ex.y / (field_dimensions_ex.y) - return Vector2i(x, y) + var x: int = local_pos_ex.x / (field_dimensions_ex.x) + var y: int = local_pos_ex.y / (field_dimensions_ex.y) + return Vector2i(x, y) func get_selected_inventory_item() -> InventoryItem: - return _selected_item + return _selected_item -# TODO: Find a better way for undoing/redoing item movements -func _move_item(item: InventoryItem, position: Vector2i) -> void: - if _gloot_undo_redo: - _gloot_undo_redo.move_inventory_item(inventory, item, position) - else: - inventory.move_item_to(item, position) +func _move_item(item: InventoryItem, move_position: Vector2i) -> void: + if Engine.is_editor_hint(): + GlootUndoRedo.move_inventory_item(inventory, item, move_position) + else: + inventory.move_item_to(item, move_position) - -# TODO: Find a better way for undoing/redoing item merges + func _merge_item(item_src: InventoryItem, position: Vector2i) -> void: - var item_dst = (inventory as InventoryGridStacked)._get_mergable_item_at(item_src, position) - if item_dst == null: - return + var item_dst = (inventory as InventoryGridStacked)._get_mergable_item_at(item_src, position) + if item_dst == null: + return - if _gloot_undo_redo: - _gloot_undo_redo.join_inventory_items(inventory, item_dst, item_src) - else: - (inventory as InventoryGridStacked).join(item_dst, item_src) + if Engine.is_editor_hint(): + GlootUndoRedo.join_inventory_items(inventory, item_dst, item_src) + else: + (inventory as InventoryGridStacked).join(item_dst, item_src) func _get_field_position(field_coords: Vector2i) -> Vector2: - var field_position = Vector2(field_coords.x * field_dimensions.x, \ - field_coords.y * field_dimensions.y) - field_position += Vector2(item_spacing * field_coords) - return field_position + var field_position = Vector2(field_coords.x * field_dimensions.x, \ + field_coords.y * field_dimensions.y) + field_position += Vector2(item_spacing * field_coords) + return field_position func _get_global_field_position(field_coords: Vector2i) -> Vector2: - return _get_field_position(field_coords) + global_position - - -func get_grabbed_item() -> InventoryItem: - if _grabbed_ctrl_inventory_item: - return _grabbed_ctrl_inventory_item.item - - return null + return _get_field_position(field_coords) + global_position func deselect_inventory_item() -> void: - _select(null) + _select(null) func select_inventory_item(item: InventoryItem) -> void: - _select(item) + _select(item) diff --git a/addons/gloot/ui/ctrl_inventory_grid_ex.gd b/addons/gloot/ui/ctrl_inventory_grid_ex.gd index 74368044..5344e3f3 100644 --- a/addons/gloot/ui/ctrl_inventory_grid_ex.gd +++ b/addons/gloot/ui/ctrl_inventory_grid_ex.gd @@ -1,4 +1,5 @@ @tool +@icon("res://addons/gloot/images/icon_ctrl_inventory_grid.svg") class_name CtrlInventoryGridEx extends CtrlInventoryGrid @@ -48,6 +49,7 @@ func _dequeue_highlight(): func _refresh() -> void: super._refresh() + _refresh_field_background_grid() func _refresh_selection() -> void: @@ -101,16 +103,8 @@ func _create_selection_panel() -> void: _set_panel_style(_selection_panel, selection_style) _selection_panel.visible = (_selected_item != null) && (selection_style != null) _selection_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE - _selection_panel.mouse_entered.connect(Callable(self, "_on_selection_mouse_entered")) - _selection_panel.mouse_exited.connect(Callable(self, "_on_selection_mouse_exited")) - - -func _on_selection_mouse_entered() -> void: - item_mouse_entered.emit(_selected_item) - - -func _on_selection_mouse_exited() -> void: - item_mouse_exited.emit(_selected_item) + _selection_panel.mouse_entered.connect(func(): item_mouse_entered.emit(_selected_item)) + _selection_panel.mouse_exited.connect(func(): item_mouse_exited.emit(_selected_item)) func _set_panel_style(panel: Panel, style: StyleBox) -> void: @@ -124,7 +118,7 @@ func _ready() -> void: _create_selection_panel() _create_field_background_grid() - selection_changed.connect(Callable(self, "_on_selection_changed")) + selection_changed.connect(_on_selection_changed) func _on_selection_changed() -> void: @@ -145,16 +139,14 @@ func _on_inventory_resized() -> void: func _input(event) -> void: - super._input(event) - if !(event is InputEventMouseMotion): return if !inventory: return var hovered_field_coords := Vector2i(-1, -1) - if _is_hovering(get_global_mouse_position()): - hovered_field_coords = get_field_coords(get_global_mouse_position()) + if _is_hovering(get_local_mouse_position()): + hovered_field_coords = get_field_coords(get_local_mouse_position()) _reset_highlights() if !field_highlighted_style: @@ -187,17 +179,21 @@ func _highlight_grabbed_item(style: StyleBox) -> bool: if !grabbed_item: return false - var global_grabbed_item_pos: Vector2 = _get_global_grabbed_item_global_pos() + var global_grabbed_item_pos: Vector2 = _get_global_grabbed_item_local_pos() if !_is_hovering(global_grabbed_item_pos): return false - var grabbed_item_coords := get_field_coords(global_grabbed_item_pos) + var grabbed_item_coords := get_field_coords(global_grabbed_item_pos + (field_dimensions / 2)) var item_size := inventory.get_item_size(grabbed_item) var rect := Rect2i(grabbed_item_coords, item_size) _highlight_rect(rect, style, true) return true +func _is_hovering(local_pos: Vector2) -> bool: + return get_rect().has_point(local_pos) + + func _highlight_item(item: InventoryItem, style: StyleBox) -> bool: if !item || !style: return false @@ -228,14 +224,13 @@ func _highlight_rect(rect: Rect2i, style: StyleBox, queue_for_reset: bool) -> vo func _get_global_grabbed_item() -> InventoryItem: - var grabbed_item: InventoryItem = get_grabbed_item() - if !grabbed_item && _gloot: - grabbed_item = _gloot._grabbed_inventory_item - return grabbed_item + if CtrlDragable.get_grabbed_dragable() == null: + return null + return (CtrlDragable.get_grabbed_dragable() as CtrlInventoryItemRect).item -func _get_global_grabbed_item_global_pos() -> Vector2: - if _gloot && _gloot._grabbed_inventory_item: - return get_global_mouse_position() - _gloot._grab_offset + (field_dimensions / 2) +func _get_global_grabbed_item_local_pos() -> Vector2: + if CtrlDragable.get_grabbed_dragable(): + return get_local_mouse_position() - CtrlDragable.get_grab_offset() return Vector2(-1, -1) diff --git a/addons/gloot/ui/ctrl_inventory_item_rect.gd b/addons/gloot/ui/ctrl_inventory_item_rect.gd index 971befc6..60512568 100644 --- a/addons/gloot/ui/ctrl_inventory_item_rect.gd +++ b/addons/gloot/ui/ctrl_inventory_item_rect.gd @@ -1,66 +1,78 @@ class_name CtrlInventoryItemRect -extends Control +extends "res://addons/gloot/ui/ctrl_dragable.gd" const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") -signal grabbed(offset) signal activated var item: InventoryItem : get: return item set(new_item): + if item == new_item: + return + + _disconnect_item_signals() + _connect_item_signals(new_item) + item = new_item - if item && ctrl_inventory: - var texture_path = item.get_property(CtrlInventory.KEY_IMAGE) - if texture_path: - texture = load(texture_path) - _refresh() -var ctrl_inventory + if item: + texture = item.get_texture() + else: + texture = null var texture: Texture2D : get: return texture set(new_texture): + if new_texture == texture: + return texture = new_texture + if texture != null: + size = texture.get_size() queue_redraw() var selected: bool = false : get: return selected set(new_selected): + if new_selected == selected: + return selected = new_selected queue_redraw() var selection_bg_color: Color = Color.GRAY : get: return selection_bg_color set(new_selection_bg_color): + if new_selection_bg_color == selection_bg_color: + return selection_bg_color = new_selection_bg_color queue_redraw() +var item_slot: ItemSlot +static var _stored_preview_size: Vector2 +static var _stored_preview_offset: Vector2 -func _refresh() -> void: - _refresh_size() - _refresh_pos() - - -func _refresh_size() -> void: - if ctrl_inventory.stretch_item_sprites: - size = ctrl_inventory._get_streched_item_sprite_size(item) - else: - size = texture.get_size() - - -func _refresh_pos() -> void: - var item_pos: Vector2 = _get_item_position() +func _connect_item_signals(new_item: InventoryItem) -> void: + if new_item == null: + return - position = ctrl_inventory._get_field_position(item_pos) + if !new_item.protoset_changed.is_connected(queue_redraw): + new_item.protoset_changed.connect(queue_redraw) + if !new_item.prototype_id_changed.is_connected(queue_redraw): + new_item.prototype_id_changed.connect(queue_redraw) + if !new_item.properties_changed.is_connected(queue_redraw): + new_item.properties_changed.connect(queue_redraw) - if !ctrl_inventory.stretch_item_sprites: - # Position the item centered when it's not streched - position += _get_unstreched_sprite_offset() +func _disconnect_item_signals() -> void: + if item == null: + return -func _get_unstreched_sprite_offset() -> Vector2: - return (ctrl_inventory._get_streched_item_sprite_size(item) - texture.get_size()) / 2 + if item.protoset_changed.is_connected(queue_redraw): + item.protoset_changed.disconnect(queue_redraw) + if item.prototype_id_changed.is_connected(queue_redraw): + item.prototype_id_changed.disconnect(queue_redraw) + if item.properties_changed.is_connected(queue_redraw): + item.properties_changed.disconnect(queue_redraw) func _get_item_size() -> Vector2: @@ -76,11 +88,42 @@ func _get_item_position() -> Vector2: func _ready() -> void: - if item && ctrl_inventory: - _refresh() + drag_preview = CtrlInventoryItemRect.new() + + +func drag_start() -> void: + if drag_preview != null: + drag_preview.item = item + drag_preview.texture = texture + drag_preview.size = size + super.drag_start() + + +static func override_preview_size(s: Vector2) -> void: + if CtrlDragable._grabbed_dragable == null: + return + var _grabbed_ctrl := (CtrlDragable._grabbed_dragable as CtrlInventoryItemRect) + if _grabbed_ctrl.item == null || _grabbed_ctrl.drag_preview == null: + return + _stored_preview_size = _grabbed_ctrl.drag_preview.size + _stored_preview_offset = CtrlDragable._grab_offset + CtrlDragable._grab_offset *= s/_grabbed_ctrl.drag_preview.size + _grabbed_ctrl.drag_preview.size = s + + +static func restore_preview_size() -> void: + if CtrlDragable._grabbed_dragable == null: + return + var _grabbed_ctrl := (CtrlDragable._grabbed_dragable as CtrlInventoryItemRect) + if _grabbed_ctrl.item == null || _grabbed_ctrl.drag_preview == null: + return + _grabbed_ctrl.drag_preview.size = _stored_preview_size + CtrlDragable._grab_offset = _stored_preview_offset func _draw() -> void: + if is_dragged(): + return var rect = Rect2(Vector2.ZERO, size) _draw_selection(rect) _draw_texture(rect) @@ -96,8 +139,6 @@ func _draw_texture(rect: Rect2): if texture: var src_rect: Rect2 = Rect2(0, 0, texture.get_width(), texture.get_height()) draw_texture_rect_region(texture, rect, src_rect) - else: - draw_rect(rect, Color.WHITE, false) func _draw_stack_size(rect: Rect2): @@ -122,6 +163,7 @@ func _draw_stack_size(rect: Rect2): func _gui_input(event: InputEvent) -> void: + super._gui_input(event) if !(event is InputEventMouseButton): return @@ -131,8 +173,4 @@ func _gui_input(event: InputEvent) -> void: if mb_event.double_click: if get_global_rect().has_point(get_global_mouse_position()): - activated.emit(self) - elif mb_event.is_pressed(): - if get_global_rect().has_point(get_global_mouse_position()): - var offset: Vector2 = get_global_mouse_position() - get_global_rect().position - grabbed.emit(self, offset) + activated.emit() diff --git a/addons/gloot/ui/ctrl_inventory_stacked.gd b/addons/gloot/ui/ctrl_inventory_stacked.gd index f1452b2f..67ea8bd5 100644 --- a/addons/gloot/ui/ctrl_inventory_stacked.gd +++ b/addons/gloot/ui/ctrl_inventory_stacked.gd @@ -1,77 +1,78 @@ @tool +@icon("res://addons/gloot/images/icon_ctrl_inventory_stacked.svg") class_name CtrlInventoryStacked extends CtrlInventory @export var progress_bar_visible: bool = true : - get: - return progress_bar_visible - set(new_progress_bar_visible): - progress_bar_visible = new_progress_bar_visible - if _progress_bar: - _progress_bar.visible = progress_bar_visible + get: + return progress_bar_visible + set(new_progress_bar_visible): + progress_bar_visible = new_progress_bar_visible + if _progress_bar: + _progress_bar.visible = progress_bar_visible @export var label_visible: bool = true : - get: - return label_visible - set(new_label_visible): - label_visible = new_label_visible - if _label: - _label.visible = label_visible + get: + return label_visible + set(new_label_visible): + label_visible = new_label_visible + if _label: + _label.visible = label_visible var _progress_bar: ProgressBar var _label: Label func _ready(): - super._ready() - - _progress_bar = ProgressBar.new() - _progress_bar.size_flags_horizontal = SIZE_EXPAND_FILL - _progress_bar.show_percentage = false - _progress_bar.visible = progress_bar_visible - _progress_bar.custom_minimum_size.y = 20 - _vbox_container.add_child(_progress_bar) + super._ready() + + _progress_bar = ProgressBar.new() + _progress_bar.size_flags_horizontal = SIZE_EXPAND_FILL + _progress_bar.show_percentage = false + _progress_bar.visible = progress_bar_visible + _progress_bar.custom_minimum_size.y = 20 + _vbox_container.add_child(_progress_bar) - _label = Label.new() - _label.anchor_right = 1.0 - _label.anchor_bottom = 1.0 - _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER - _label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - _progress_bar.add_child(_label) + _label = Label.new() + _label.anchor_right = 1.0 + _label.anchor_bottom = 1.0 + _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + _progress_bar.add_child(_label) - _refresh() + _refresh() func _connect_inventory_signals() -> void: - if !inventory: - return + if !inventory: + return - super._connect_inventory_signals() + super._connect_inventory_signals() - if !inventory.capacity_changed.is_connected(Callable(self, "_refresh")): - inventory.capacity_changed.connect(Callable(self, "_refresh")) - if !inventory.occupied_space_changed.is_connected(Callable(self, "_refresh")): - inventory.occupied_space_changed.connect(Callable(self, "_refresh")) + if !inventory.capacity_changed.is_connected(_refresh): + inventory.capacity_changed.connect(_refresh) + if !inventory.occupied_space_changed.is_connected(_refresh): + inventory.occupied_space_changed.connect(_refresh) func _disconnect_inventory_signals() -> void: - if !inventory: - return + if !inventory: + return - super._disconnect_inventory_signals() + super._disconnect_inventory_signals() - if !inventory.capacity_changed.is_connected(Callable(self, "_refresh")): - inventory.capacity_changed.disconnect(Callable(self, "_refresh")) - if !inventory.occupied_space_changed.is_connected(Callable(self, "_refresh")): - inventory.occupied_space_changed.disconnect(Callable(self, "_refresh")) + if !inventory.capacity_changed.is_connected(_refresh): + inventory.capacity_changed.disconnect(_refresh) + if !inventory.occupied_space_changed.is_connected(_refresh): + inventory.occupied_space_changed.disconnect(_refresh) func _refresh(): - super._refresh() - if _label: - _label.visible = label_visible - _label.text = "%d/%d" % [inventory.occupied_space, inventory.capacity] - if _progress_bar: - _progress_bar.visible = progress_bar_visible - _progress_bar.min_value = 0 - _progress_bar.max_value = inventory.capacity - _progress_bar.value = inventory.occupied_space + super._refresh() + if _label: + _label.visible = label_visible + _label.text = "%d/%d" % [inventory.occupied_space, inventory.capacity] + if _progress_bar: + _progress_bar.visible = progress_bar_visible + _progress_bar.min_value = 0 + _progress_bar.max_value = inventory.capacity + _progress_bar.value = inventory.occupied_space diff --git a/addons/gloot/ui/ctrl_item_slot.gd b/addons/gloot/ui/ctrl_item_slot.gd index 6f43db9e..ef4a8309 100644 --- a/addons/gloot/ui/ctrl_item_slot.gd +++ b/addons/gloot/ui/ctrl_item_slot.gd @@ -1,44 +1,68 @@ @tool +@icon("res://addons/gloot/images/icon_ctrl_item_slot.svg") class_name CtrlItemSlot extends Control +const CtrlInventoryRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd") +const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd") +const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") + @export var item_slot_path: NodePath : get: return item_slot_path set(new_item_slot_path): + if item_slot_path == new_item_slot_path: + return item_slot_path = new_item_slot_path var node: Node = get_node_or_null(item_slot_path) if node == null: + _clear() return if is_inside_tree(): - assert(node is ItemSlot) + assert(node is ItemSlotBase) - self.item_slot = node + item_slot = node + _refresh() update_configuration_warnings() @export var default_item_icon: Texture2D : get: return default_item_icon set(new_default_item_icon): + if default_item_icon == new_default_item_icon: + return default_item_icon = new_default_item_icon _refresh() +@export var icon_scaling: Vector2 = Vector2.ONE : + get: + return icon_scaling + set(new_icon_scaling): + if icon_scaling == new_icon_scaling: + return + icon_scaling = new_icon_scaling + if _ctrl_inventory_item_rect && _ctrl_inventory_item_rect.texture: + _ctrl_inventory_item_rect.custom_minimum_size = _ctrl_inventory_item_rect.texture.get_size() * icon_scaling @export var item_texture_visible: bool = true : get: return item_texture_visible set(new_item_texture_visible): + if item_texture_visible == new_item_texture_visible: + return item_texture_visible = new_item_texture_visible - if _texture_rect: - _texture_rect.visible = item_texture_visible + if _ctrl_inventory_item_rect: + _ctrl_inventory_item_rect.visible = item_texture_visible @export var label_visible: bool = true : get: return label_visible set(new_label_visible): + if label_visible == new_label_visible: + return label_visible = new_label_visible if _label: _label.visible = label_visible -var item_slot: ItemSlot : +var item_slot: ItemSlotBase : get: return item_slot set(new_item_slot): @@ -51,16 +75,16 @@ var item_slot: ItemSlot : _refresh() var _hbox_container: HBoxContainer -var _texture_rect: TextureRect +var _ctrl_inventory_item_rect: CtrlInventoryRect var _label: Label -var _gloot: Node = null +var _ctrl_drop_zone: CtrlDropZone func _get_configuration_warnings() -> PackedStringArray: if item_slot_path.is_empty(): return PackedStringArray([ "This node is not linked to an item slot, so it can't display any content.\n" + \ - "Set the item_slot_path property to point to an ItemSlot node."]) + "Set the item_slot_path property to point to an ItemSlotBase node."]) return PackedStringArray() @@ -68,87 +92,114 @@ func _connect_item_slot_signals() -> void: if !item_slot: return - if !item_slot.item_set.is_connected(Callable(self, "_on_item_set")): - item_slot.item_set.connect(Callable(self, "_on_item_set")) - if !item_slot.item_cleared.is_connected(Callable(self, "_refresh")): - item_slot.item_cleared.connect(Callable(self, "_refresh")) - if !item_slot.inventory_changed.is_connected(Callable(self, "_on_inventory_changed")): - item_slot.inventory_changed.connect(Callable(self, "_on_inventory_changed")) + if !item_slot.item_equipped.is_connected(_refresh): + item_slot.item_equipped.connect(_refresh) + if !item_slot.cleared.is_connected(_refresh): + item_slot.cleared.connect(_refresh) func _disconnect_item_slot_signals() -> void: if !item_slot: return - if item_slot.item_set.is_connected(Callable(self, "_on_item_set")): - item_slot.item_set.disconnect(Callable(self, "_on_item_set")) - if item_slot.item_cleared.is_connected(Callable(self, "_refresh")): - item_slot.item_cleared.disconnect(Callable(self, "_refresh")) - if item_slot.inventory_changed.is_connected(Callable(self, "_on_inventory_changed")): - item_slot.inventory_changed.disconnect(Callable(self, "_on_inventory_changed")) - - -func _on_item_set(_item: InventoryItem) -> void: - _refresh() - - -func _on_inventory_changed(_inventory: Inventory) -> void: - _refresh() + if item_slot.item_equipped.is_connected(_refresh): + item_slot.item_equipped.disconnect(_refresh) + if item_slot.cleared.is_connected(_refresh): + item_slot.cleared.disconnect(_refresh) func _ready(): - _gloot = _get_gloot() - if Engine.is_editor_hint(): # Clean up, in case it is duplicated in the editor if _hbox_container: _hbox_container.queue_free() + var node: Node = get_node_or_null(item_slot_path) + if is_inside_tree() && node: + assert(node is ItemSlotBase) + item_slot = node + _hbox_container = HBoxContainer.new() _hbox_container.size_flags_horizontal = SIZE_EXPAND_FILL _hbox_container.size_flags_vertical = SIZE_EXPAND_FILL add_child(_hbox_container) - - _texture_rect = TextureRect.new() - _texture_rect.visible = item_texture_visible - _hbox_container.add_child(_texture_rect) + _hbox_container.resized.connect(func(): size = _hbox_container.size) + + _ctrl_inventory_item_rect = CtrlInventoryRect.new() + _ctrl_inventory_item_rect.visible = item_texture_visible + _ctrl_inventory_item_rect.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN + _ctrl_inventory_item_rect.size_flags_vertical = Control.SIZE_SHRINK_BEGIN + _ctrl_inventory_item_rect.item_slot = item_slot + _ctrl_inventory_item_rect.resized.connect(func(): + custom_minimum_size = _ctrl_inventory_item_rect.size + size = _ctrl_inventory_item_rect.size + ) + _hbox_container.add_child(_ctrl_inventory_item_rect) + + _ctrl_drop_zone = CtrlDropZone.new() + _ctrl_drop_zone.dragable_dropped.connect(_on_dragable_dropped) + _ctrl_drop_zone.size = size + resized.connect(func(): _ctrl_drop_zone.size = size) + _ctrl_drop_zone.mouse_entered.connect(_on_drop_zone_mouse_entered) + _ctrl_drop_zone.mouse_exited.connect(_on_drop_zone_mouse_exited) + CtrlDragable.dragable_grabbed.connect(_on_any_dragable_grabbed) + CtrlDragable.dragable_dropped.connect(_on_any_dragable_dropped) + add_child(_ctrl_drop_zone) + _ctrl_drop_zone.deactivate() _label = Label.new() _label.visible = label_visible _hbox_container.add_child(_label) - var node: Node = get_node_or_null(item_slot_path) - if is_inside_tree() && node: - assert(node is ItemSlot) - self.item_slot = node + size = _hbox_container.size + _hbox_container.resized.connect(func(): size = _hbox_container.size) _refresh() - if !Engine.is_editor_hint() && _gloot: - _gloot.item_dropped.connect(Callable(self, "_on_item_dropped")) -func _get_gloot() -> Node: - # This is a "temporary" hack until a better solution is found! - # This is a tool script that is also executed inside the editor, where the "GLoot" singleton is - # not visible - leading to errors inside the editor. - # To work around that, we obtain the singleton by name. - return get_tree().root.get_node_or_null("GLoot") +func _on_dragable_dropped(dragable: CtrlDragable, drop_position: Vector2) -> void: + var item = (dragable as CtrlInventoryItemRect).item - -func _get_singleton() -> Node: - return null - - -func _on_item_dropped(wr_item: WeakRef, global_drop_pos: Vector2) -> void: - var item: InventoryItem = wr_item.get_ref() if !item: return if !item_slot: return - var slot_rect = get_global_rect() - if slot_rect.has_point(get_global_mouse_position()) && item_slot.can_hold_item(item): - item_slot.item = item + if !item_slot.can_hold_item(item): + return + + if item == item_slot.get_item(): + return + + item_slot.equip(item) + + +func _on_drop_zone_mouse_entered() -> void: + if CtrlDragable._grabbed_dragable == null: + return + var _grabbed_ctrl := (CtrlDragable._grabbed_dragable as CtrlInventoryItemRect) + if _grabbed_ctrl == null || _grabbed_ctrl.texture == null: + return + CtrlInventoryItemRect.override_preview_size(_grabbed_ctrl.texture.get_size() * icon_scaling) + + +func _on_drop_zone_mouse_exited() -> void: + CtrlInventoryItemRect.restore_preview_size() + + +func _on_any_dragable_grabbed(dragable: CtrlDragable, grab_position: Vector2): + _ctrl_drop_zone.activate() + + +func _on_any_dragable_dropped(dragable: CtrlDragable, zone: CtrlDropZone, drop_position: Vector2): + _ctrl_drop_zone.deactivate() + + # Unequip from other slots + if zone == _ctrl_drop_zone || zone == null: + return + var ctrl_inventory_item_rect := (dragable as CtrlInventoryItemRect) + if ctrl_inventory_item_rect.item_slot: + ctrl_inventory_item_rect.item_slot.clear() func _refresh() -> void: @@ -157,19 +208,26 @@ func _refresh() -> void: if item_slot == null: return - if item_slot.item == null: + if item_slot.get_item() == null: return - var item = item_slot.item + var item = item_slot.get_item() if _label: _label.text = item.get_property(CtrlInventory.KEY_NAME, item.prototype_id) - if _texture_rect: - _texture_rect.texture = item.get_texture() + if _ctrl_inventory_item_rect: + _ctrl_inventory_item_rect.item = item + if item.get_texture(): + _ctrl_inventory_item_rect.texture = item.get_texture() + else: + _ctrl_inventory_item_rect.texture = default_item_icon + + if _ctrl_inventory_item_rect.texture: + _ctrl_inventory_item_rect.custom_minimum_size = _ctrl_inventory_item_rect.texture.get_size() * icon_scaling func _clear() -> void: if _label: _label.text = "" - if _texture_rect: - _texture_rect.texture = null + if _ctrl_inventory_item_rect: + _ctrl_inventory_item_rect.item = null diff --git a/addons/gloot/ui/ctrl_item_slot_ex.gd b/addons/gloot/ui/ctrl_item_slot_ex.gd index 3e111e4e..eb8df188 100644 --- a/addons/gloot/ui/ctrl_item_slot_ex.gd +++ b/addons/gloot/ui/ctrl_item_slot_ex.gd @@ -1,4 +1,5 @@ @tool +@icon("res://addons/gloot/images/icon_ctrl_item_slot.svg") class_name CtrlItemSlotEx extends CtrlItemSlot @@ -17,6 +18,14 @@ extends CtrlItemSlot var _background_panel: Panel +func _ready(): + super._ready() + resized.connect(func(): + if _background_panel: + _background_panel.size = size + ) + + func _refresh() -> void: super._refresh() _update_background() From 1a066446ab9c557fef074c3a7afc639a4b1fb75e Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 23 Jan 2024 06:29:10 +0100 Subject: [PATCH 117/138] Add some tabs to the item editor --- .../ItemEditor/ItemAmmoEditor.tscn | 26 ++++ .../Custom_Editors/ItemEditor/ItemEditor.tscn | 47 ++++++- .../ItemEditor/ItemMagazineEditor.tscn | 36 +++++ .../ItemEditor/ItemRangedEditor.tscn | 130 ++++++++++++++++++ Scenes/InventoryWindow.tscn | 53 ++++++- Scripts/ItemAmmoEditor.gd | 9 ++ Scripts/ItemEditor.gd | 35 +++++ Scripts/ItemMagazineEditor.gd | 10 ++ Scripts/ItemRangedEditor.gd | 17 +++ 9 files changed, 360 insertions(+), 3 deletions(-) create mode 100644 Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn create mode 100644 Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn create mode 100644 Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn create mode 100644 Scripts/ItemAmmoEditor.gd create mode 100644 Scripts/ItemMagazineEditor.gd create mode 100644 Scripts/ItemRangedEditor.gd diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn new file mode 100644 index 00000000..6a668c63 --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=2 format=3 uid="uid://c2uiumyeepree"] + +[ext_resource type="Script" path="res://Scripts/ItemAmmoEditor.gd" id="1_5v06u"] + +[node name="ItemAmmoEditor" type="Control" node_paths=PackedStringArray("DamageNumberBox")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_5v06u") +DamageNumberBox = NodePath("Ammo/DamageNumber") + +[node name="Ammo" type="GridContainer" parent="."] +size_flags_vertical = 3 +columns = 2 + +[node name="DamageLabel" type="Label" parent="Ammo"] +layout_mode = 2 +text = "Damage" + +[node name="DamageNumber" type="SpinBox" parent="Ammo"] +layout_mode = 2 +tooltip_text = "The width of this item in the inventory. A larger number means it will take up more horizontal inventory slots" +value = 25.0 diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn index 0940519f..2a6fa0c0 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn @@ -1,10 +1,13 @@ -[gd_scene load_steps=4 format=3 uid="uid://dmpomdwta1pgq"] +[gd_scene load_steps=7 format=3 uid="uid://dmpomdwta1pgq"] [ext_resource type="Script" path="res://Scripts/ItemEditor.gd" id="1_ef3j7"] [ext_resource type="Texture2D" uid="uid://c8ragmxitca47" path="res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png" id="2_ghd7c"] [ext_resource type="PackedScene" uid="uid://d1h1rpwt8f807" path="res://Scenes/ContentManager/Custom_Widgets/Sprite_Selector_Popup.tscn" id="3_qb68r"] +[ext_resource type="PackedScene" uid="uid://cbke1yb3m7dra" path="res://Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn" id="3_qqmud"] +[ext_resource type="PackedScene" uid="uid://27f4k2pq2odn" path="res://Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn" id="4_x8xa3"] +[ext_resource type="PackedScene" uid="uid://c2uiumyeepree" path="res://Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn" id="5_mr1dn"] -[node name="ItemEditor" type="Control" node_paths=PackedStringArray("itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector", "WidthNumberBox", "HeightNumberBox", "WeightNumberBox", "StackSizeNumberBox", "MaxStackSizeNumberBox")] +[node name="ItemEditor" type="Control" node_paths=PackedStringArray("tabContainer", "itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector", "WidthNumberBox", "HeightNumberBox", "WeightNumberBox", "StackSizeNumberBox", "MaxStackSizeNumberBox", "typesContainer")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -12,6 +15,7 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_ef3j7") +tabContainer = NodePath("VBoxContainer/TabContainer") itemImageDisplay = NodePath("VBoxContainer/TabContainer/Basic/ItemImageDisplay") IDTextLabel = NodePath("VBoxContainer/TabContainer/Basic/IDTextLabel") PathTextLabel = NodePath("VBoxContainer/TabContainer/Basic/PathTextLabel") @@ -23,6 +27,7 @@ HeightNumberBox = NodePath("VBoxContainer/TabContainer/Basic/HeightNumber") WeightNumberBox = NodePath("VBoxContainer/TabContainer/Basic/WeightNumber") StackSizeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/StackSizeNumber") MaxStackSizeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/MaxStackSizeNumber") +typesContainer = NodePath("VBoxContainer/TabContainer/Basic/TypesContainer") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -211,10 +216,48 @@ layout_mode = 2 tooltip_text = "If this is checked, the item can be disassembled and disassembly tab will be visible. Otherwise, this item cannot be disassembled and the disassembly tab will not be visible" text = "Disassemble" +[node name="ContainerCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +tooltip_text = "If this is checked, the item can contain items and the container tab will be visible. Otherwise, this item cannot contain items and the container tab will not be visible" +text = "Container" + +[node name="ClothingCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +tooltip_text = "If this is checked, the item functions as clothing and the clothing properties tab will be visible. Otherwise, this item will not function as clothing and the clothing properties tab will not be visible" +text = "Clothing" + +[node name="Food" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] +layout_mode = 2 +tooltip_text = "If this is checked, the item functions as food and the food properties tab will be visible. Otherwise, this item will not function as food and the food properties tab will not be visible" +text = "Food" + +[node name="Ranged" parent="VBoxContainer/TabContainer" instance=ExtResource("3_qqmud")] +visible = false +layout_mode = 2 + +[node name="Magazine" parent="VBoxContainer/TabContainer" instance=ExtResource("4_x8xa3")] +visible = false +layout_mode = 2 + +[node name="Ammo" parent="VBoxContainer/TabContainer" instance=ExtResource("5_mr1dn")] +visible = false +layout_mode = 2 + [node name="Sprite_selector" parent="." instance=ExtResource("3_qb68r")] visible = false [connection signal="button_up" from="VBoxContainer/HBoxContainer/CloseButton" to="." method="_on_close_button_button_up"] [connection signal="button_up" from="VBoxContainer/HBoxContainer/SaveButton" to="." method="_on_save_button_button_up"] [connection signal="gui_input" from="VBoxContainer/TabContainer/Basic/ItemImageDisplay" to="." method="_on_item_image_display_gui_input"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/RangedWeaponCheck" to="." method="_on_type_check_button_up"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/MeleeCheck" to="." method="_on_type_check_button_up"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/MedicalCheck" to="." method="_on_type_check_button_up"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/MagazineCheck" to="." method="_on_type_check_button_up"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/AmmunitionCheck" to="." method="_on_type_check_button_up"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/BookCheck" to="." method="_on_type_check_button_up"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/CraftableCheck" to="." method="_on_type_check_button_up"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/DisassembleCheck" to="." method="_on_type_check_button_up"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/ContainerCheck" to="." method="_on_type_check_button_up"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/ClothingCheck" to="." method="_on_type_check_button_up"] +[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/Food" to="." method="_on_type_check_button_up"] [connection signal="sprite_selected_ok" from="Sprite_selector" to="." method="_on_sprite_selector_sprite_selected_ok"] diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn new file mode 100644 index 00000000..a9e27e16 --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=2 format=3 uid="uid://27f4k2pq2odn"] + +[ext_resource type="Script" path="res://Scripts/ItemMagazineEditor.gd" id="1_cgvqr"] + +[node name="ItemMagazineEditor" 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_cgvqr") + +[node name="Magazine" type="GridContainer" parent="."] +size_flags_vertical = 3 +columns = 2 + +[node name="UsedAmmoLabel" type="Label" parent="Magazine"] +layout_mode = 2 +text = "Ammo" + +[node name="UsedAmmoTextEdit" type="TextEdit" parent="Magazine"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 +placeholder_text = "9mm" + +[node name="MaxAmmoLabel" type="Label" parent="Magazine"] +layout_mode = 2 +text = "Max ammo" + +[node name="MaxAmmoNumber" type="SpinBox" parent="Magazine"] +layout_mode = 2 +tooltip_text = "The width of this item in the inventory. A larger number means it will take up more horizontal inventory slots" +value = 20.0 diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn new file mode 100644 index 00000000..c8832a6d --- /dev/null +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn @@ -0,0 +1,130 @@ +[gd_scene load_steps=2 format=3 uid="uid://cbke1yb3m7dra"] + +[ext_resource type="Script" path="res://Scripts/ItemRangedEditor.gd" id="1_my1v7"] + +[node name="ItemRangedEditor" type="Control" node_paths=PackedStringArray("UsedAmmoTextEdit", "UsedMagazineTextEdit", "RangeNumberBox", "SpreadNumberBox", "SwayNumberBox", "RecoilNumberBox", "UsedSkillTextEdit", "ReloadSpeedNumberBox", "FiringSpeedNumberBox")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_my1v7") +UsedAmmoTextEdit = NodePath("Ranged/UsedAmmoTextEdit") +UsedMagazineTextEdit = NodePath("Ranged/UsedMagazineTextEdit") +RangeNumberBox = NodePath("Ranged/RangeNumber") +SpreadNumberBox = NodePath("Ranged/SpreadNumber") +SwayNumberBox = NodePath("Ranged/SwayNumber") +RecoilNumberBox = NodePath("Ranged/RecoilNumber") +UsedSkillTextEdit = NodePath("Ranged/UsedSkillTextEdit") +ReloadSpeedNumberBox = NodePath("Ranged/ReloadSpeedNumber") +FiringSpeedNumberBox = NodePath("Ranged/FiringSpeedNumber") + +[node name="Ranged" type="GridContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_vertical = 3 +columns = 2 + +[node name="UsedAmmoLabel" type="Label" parent="Ranged"] +layout_mode = 2 +text = "Ammo" + +[node name="UsedAmmoTextEdit" type="TextEdit" parent="Ranged"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.1 +focus_next = NodePath("../UsedMagazineTextEdit") +placeholder_text = "9mm" + +[node name="UsedMagazineLabel" type="Label" parent="Ranged"] +layout_mode = 2 +text = "Magazine" + +[node name="UsedMagazineTextEdit" type="TextEdit" parent="Ranged"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.9 +focus_previous = NodePath("../UsedAmmoTextEdit") +placeholder_text = "pistol_magazine" +wrap_mode = 1 + +[node name="RangeLabel" type="Label" parent="Ranged"] +layout_mode = 2 +text = "Range" + +[node name="RangeNumber" type="SpinBox" parent="Ranged"] +layout_mode = 2 +tooltip_text = "The width of this item in the inventory. A larger number means it will take up more horizontal inventory slots" +min_value = 100.0 +max_value = 10000.0 +step = 100.0 +value = 1000.0 + +[node name="SpreadLabel" type="Label" parent="Ranged"] +layout_mode = 2 +text = "Spread" + +[node name="SpreadNumber" type="SpinBox" parent="Ranged"] +layout_mode = 2 +tooltip_text = "The height of this item in the inventory. A larger number means it will take up more vertical inventory slots" +min_value = 1.0 +value = 5.0 + +[node name="SwayLabel" type="Label" parent="Ranged"] +layout_mode = 2 +text = "Sway" + +[node name="SwayNumber" type="SpinBox" parent="Ranged"] +layout_mode = 2 +tooltip_text = "The weight of this item in kg" +value = 5.0 + +[node name="RecoilLabel" type="Label" parent="Ranged"] +layout_mode = 2 +text = "Recoil" + +[node name="RecoilNumber" type="SpinBox" parent="Ranged"] +layout_mode = 2 +tooltip_text = "The amount of this item that will spawn in a stack by default" +min_value = 1.0 +value = 20.0 + +[node name="UsedSkillLabel" type="Label" parent="Ranged"] +layout_mode = 2 +text = "Skill" + +[node name="UsedSkillTextEdit" type="TextEdit" parent="Ranged"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.9 +focus_previous = NodePath("../UsedAmmoTextEdit") +placeholder_text = "short_guns" +wrap_mode = 1 + +[node name="ReloadSpeedLabel" type="Label" parent="Ranged"] +layout_mode = 2 +text = "Reload speed" + +[node name="ReloadSpeedNumber" type="SpinBox" parent="Ranged"] +layout_mode = 2 +tooltip_text = "The maximum number of this item that will fit in a stack" +min_value = 0.1 +step = 0.1 +value = 2.5 + +[node name="FiringSpeedLabel" type="Label" parent="Ranged"] +layout_mode = 2 +text = "Firing speed" + +[node name="FiringSpeedNumber" type="SpinBox" parent="Ranged"] +layout_mode = 2 +tooltip_text = "The maximum number of this item that will fit in a stack" +min_value = 0.01 +step = 0.01 +value = 0.25 diff --git a/Scenes/InventoryWindow.tscn b/Scenes/InventoryWindow.tscn index 1bd476a6..fe5fc1f8 100644 --- a/Scenes/InventoryWindow.tscn +++ b/Scenes/InventoryWindow.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=9 format=3 uid="uid://e0ebcv1n8jnq"] +[gd_scene load_steps=13 format=3 uid="uid://e0ebcv1n8jnq"] [ext_resource type="Script" path="res://Scripts/InventoryWindow.gd" id="1_7kqbx"] [ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="2_alcyo"] @@ -7,6 +7,12 @@ [ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_grid_ex.gd" id="4_8j4xb"] [ext_resource type="Texture2D" uid="uid://cwmsngeoc631h" path="res://Textures/Screenshot_167.png" id="5_wixd1"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="6_xpf2l"] +[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_item_slot_ex.gd" id="7_kcmi5"] +[ext_resource type="Texture2D" uid="uid://dfmrlie57qrbo" path="res://Mods/Core/Items/9mm.png" id="8_0yr0i"] +[ext_resource type="Script" path="res://addons/gloot/core/item_slot.gd" id="9_qoep6"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hyt2o"] +bg_color = Color(0.152941, 0.152941, 0.231373, 1) [sub_resource type="Theme" id="Theme_6v4rg"] default_font = ExtResource("6_xpf2l") @@ -36,6 +42,7 @@ layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +offset_right = 133.0 offset_bottom = 29.0 grow_horizontal = 2 grow_vertical = 2 @@ -86,6 +93,50 @@ grid_color = Color(0.305882, 0.305882, 0.305882, 1) inventory_path = NodePath("../../../InventoryGridStackedProx") default_item_texture = ExtResource("5_wixd1") +[node name="EquipmentSlotList" type="VBoxContainer" parent="HBoxContainer"] +custom_minimum_size = Vector2(64, 0) +layout_mode = 2 + +[node name="LeftHandEquipment" type="HBoxContainer" parent="HBoxContainer/EquipmentSlotList"] +layout_mode = 2 + +[node name="LeftHandEquipmentSlot" type="Node" parent="HBoxContainer/EquipmentSlotList/LeftHandEquipment"] +script = ExtResource("9_qoep6") +item_protoset = ExtResource("3_sqsc0") + +[node name="LeftHandEquipmentSlotControl" type="Control" parent="HBoxContainer/EquipmentSlotList/LeftHandEquipment"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +script = ExtResource("7_kcmi5") +slot_style = SubResource("StyleBoxFlat_hyt2o") +item_slot_path = NodePath("../LeftHandEquipmentSlot") +default_item_icon = ExtResource("8_0yr0i") +label_visible = false + +[node name="Label" type="Label" parent="HBoxContainer/EquipmentSlotList/LeftHandEquipment"] +layout_mode = 2 +text = "Left hand" + +[node name="RightHandEquipment" type="HBoxContainer" parent="HBoxContainer/EquipmentSlotList"] +layout_mode = 2 + +[node name="RightHandEquipmentSlot" type="Node" parent="HBoxContainer/EquipmentSlotList/RightHandEquipment"] +script = ExtResource("9_qoep6") +item_protoset = ExtResource("3_sqsc0") + +[node name="RightHandEquipmentSlotControl" type="Control" parent="HBoxContainer/EquipmentSlotList/RightHandEquipment"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +script = ExtResource("7_kcmi5") +slot_style = SubResource("StyleBoxFlat_hyt2o") +item_slot_path = NodePath("../RightHandEquipmentSlot") +default_item_icon = ExtResource("8_0yr0i") +label_visible = false + +[node name="Label" type="Label" parent="HBoxContainer/EquipmentSlotList/RightHandEquipment"] +layout_mode = 2 +text = "Right hand" + [node name="Tooltip" type="Control" parent="."] visible = false layout_mode = 3 diff --git a/Scripts/ItemAmmoEditor.gd b/Scripts/ItemAmmoEditor.gd new file mode 100644 index 00000000..a1a816c8 --- /dev/null +++ b/Scripts/ItemAmmoEditor.gd @@ -0,0 +1,9 @@ +extends Control + +# This scene is intended to be used inside the item editor +# It is supposed to edit exactly one type of ammo + + +# Form elements +@export var DamageNumberBox: SpinBox = null + diff --git a/Scripts/ItemEditor.gd b/Scripts/ItemEditor.gd index f2fb3bd8..c1bde7da 100644 --- a/Scripts/ItemEditor.gd +++ b/Scripts/ItemEditor.gd @@ -5,6 +5,9 @@ extends Control #It expects to save the data to a JSON file that contains all data from a mod #To load data, provide the name of the item data file and an ID + +@export var tabContainer: TabContainer = null + # Used to open the sprite selector popup @export var itemImageDisplay: TextureRect = null @export var IDTextLabel: Label = null @@ -26,6 +29,10 @@ extends Control @export var StackSizeNumberBox: SpinBox = null @export var MaxStackSizeNumberBox: SpinBox = null +@export var typesContainer: HBoxContainer = null + + + # This signal will be emitted when the user presses the save button # This signal should alert Gamedata that the item data array should be saved to disk # The content editor has connected this signal to Gamedata already @@ -39,6 +46,9 @@ var contentData: Dictionary = {}: contentData = value load_item_data() itemSelector.sprites_collection = Gamedata.data.items.sprites + +func _ready(): + refresh_tab_visibility() #This function update the form based on the contentData that has been loaded func load_item_data() -> void: @@ -95,3 +105,28 @@ func _on_sprite_selector_sprite_selected_ok(clicked_sprite) -> void: var itemTexture: Resource = clicked_sprite.get_texture() itemImageDisplay.texture = itemTexture PathTextLabel.text = itemTexture.resource_path.get_file() + + +func _on_type_check_button_up(): + refresh_tab_visibility() + +# This function loops over the checkboxes. +# It will show corresponding tabs in the tab container if the box is checked. +# It will hide the corresponding tabs in the tab container if the box is unchecked. +func refresh_tab_visibility() -> void: + # Loop over all children of the typesContainer + for i in range(typesContainer.get_child_count()): + # Get the child node at index 'i' + var child = typesContainer.get_child(i) + # Check if the child is a CheckBox + if child is CheckBox: + # Find the tab in the TabContainer with the same name as the checkbox text + tabContainer.set_tab_hidden(get_tab_by_title(child.text),!child.button_pressed) + +# Returns the tab control with the given name +func get_tab_by_title(tabName: String) -> int: + # Loop over all children of the typesContainer + for i in range(tabContainer.get_tab_count()): + if tabContainer.get_tab_title(i) == tabName: + return i + return -1 diff --git a/Scripts/ItemMagazineEditor.gd b/Scripts/ItemMagazineEditor.gd new file mode 100644 index 00000000..5aabb3e7 --- /dev/null +++ b/Scripts/ItemMagazineEditor.gd @@ -0,0 +1,10 @@ +extends Control + +# This scene is intended to be used inside the item editor +# It is supposed to edit exactly one magazine + + +# Form elements +@export var ReloadSpeedNumberBox: SpinBox = null +@export var FiringSpeedNumberBox: SpinBox = null + diff --git a/Scripts/ItemRangedEditor.gd b/Scripts/ItemRangedEditor.gd new file mode 100644 index 00000000..bda84bbe --- /dev/null +++ b/Scripts/ItemRangedEditor.gd @@ -0,0 +1,17 @@ +extends Control + +# This scene is intended to be used inside the item editor +# It is supposed to edit exactly one ranged weapon + + +# Ranged form elements +@export var UsedAmmoTextEdit: TextEdit = null +@export var UsedMagazineTextEdit: TextEdit = null +@export var RangeNumberBox: SpinBox = null +@export var SpreadNumberBox: SpinBox = null +@export var SwayNumberBox: SpinBox = null +@export var RecoilNumberBox: SpinBox = null +@export var UsedSkillTextEdit: TextEdit = null +@export var ReloadSpeedNumberBox: SpinBox = null +@export var FiringSpeedNumberBox: SpinBox = null + From 160ec24da9a7efa9754d9d4d7d9d9cacad72d0f7 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 24 Jan 2024 00:30:58 +0100 Subject: [PATCH 118/138] Add pistol and rifle json in item editor --- Defaults/Mobs/mob_corpse.tscn | 2 +- ItemProtosets.tres | 48 +++++++++++++++++- Mods/Core/Items/Items.json | 46 +++++++++++++++++ Mods/Core/Items/pistol_64.png | Bin 0 -> 2902 bytes Mods/Core/Items/pistol_64.png.import | 34 +++++++++++++ Mods/Core/Items/rifle_128_64.png | Bin 0 -> 5209 bytes Mods/Core/Items/rifle_128_64.png.import | 34 +++++++++++++ .../ItemEditor/ItemAmmoEditor.tscn | 1 + .../Custom_Editors/ItemEditor/ItemEditor.tscn | 2 +- .../ItemEditor/ItemMagazineEditor.tscn | 1 + .../ItemEditor/ItemRangedEditor.tscn | 2 + Scripts/ItemAmmoEditor.gd | 8 +++ Scripts/ItemEditor.gd | 24 ++++++++- Scripts/ItemMagazineEditor.gd | 16 +++++- Scripts/ItemRangedEditor.gd | 33 +++++++++++- 15 files changed, 244 insertions(+), 7 deletions(-) create mode 100644 Mods/Core/Items/pistol_64.png create mode 100644 Mods/Core/Items/pistol_64.png.import create mode 100644 Mods/Core/Items/rifle_128_64.png create mode 100644 Mods/Core/Items/rifle_128_64.png.import diff --git a/Defaults/Mobs/mob_corpse.tscn b/Defaults/Mobs/mob_corpse.tscn index 74addc8f..662defea 100644 --- a/Defaults/Mobs/mob_corpse.tscn +++ b/Defaults/Mobs/mob_corpse.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://Scripts/container.gd" id="1_4celg"] [ext_resource type="Texture2D" uid="uid://cy56wx4qynp3m" path="res://Textures/enemy.png" id="2_pvjek"] [ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="3_131gg"] -[ext_resource type="Resource" uid="uid://bvrl0obu5ejqq" path="res://ItemProtosets.tres" id="4_ehn4b"] +[ext_resource type="Resource" uid="uid://b1tngttyk4w2s" path="res://ItemProtosets.tres" id="4_ehn4b"] [sub_resource type="SphereShape3D" id="SphereShape3D_0pnwx"] radius = 0.2 diff --git a/ItemProtosets.tres b/ItemProtosets.tres index 359c581a..d93a95f7 100644 --- a/ItemProtosets.tres +++ b/ItemProtosets.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="ItemProtoset" load_steps=2 format=3 uid="uid://bvrl0obu5ejqq"] +[gd_resource type="Resource" script_class="ItemProtoset" load_steps=2 format=3 uid="uid://b1tngttyk4w2s"] [ext_resource type="Script" path="res://addons/gloot/core/item_protoset.gd" id="1_o35lu"] @@ -53,5 +53,51 @@ json_data = "[ \"stack_size\": \"1\", \"weight\": \"0.25\", \"width\": \"1\" + }, + { + \"Ranged\": { + \"firing_speed\": \"0.25\", + \"range\": \"1000\", + \"recoil\": \"20\", + \"reload_speed\": \"2.5\", + \"spread\": \"5\", + \"sway\": \"5\", + \"used_ammo\": \"9mm\", + \"used_magazine\": \"pistol_magazine\", + \"used_skill\": \"short_guns\" + }, + \"description\": \"A standard issue pistol that uses 9mm ammunition\", + \"height\": \"2\", + \"id\": \"pistol_9mm\", + \"image\": \"./Mods/Core/Items/pistol_64.png\", + \"max_stack_size\": \"1\", + \"name\": \"Pistol 9mm\", + \"sprite\": \"pistol_64.png\", + \"stack_size\": \"1\", + \"weight\": \"2\", + \"width\": \"2\" + }, + { + \"Ranged\": { + \"firing_speed\": \"0.1\", + \"range\": \"1000\", + \"recoil\": \"15\", + \"reload_speed\": \"2.5\", + \"spread\": \"8\", + \"sway\": \"5\", + \"used_ammo\": \"9mm\", + \"used_magazine\": \"pistol_magazine\", + \"used_skill\": \"short_guns\" + }, + \"description\": \"A standard issue rifle that uses 9mm ammunition\", + \"height\": \"2\", + \"id\": \"rifle_m4a1\", + \"image\": \"./Mods/Core/Items/rifle_128_64.png\", + \"max_stack_size\": \"1\", + \"name\": \"M4a1 rifle\", + \"sprite\": \"rifle_128_64.png\", + \"stack_size\": \"1\", + \"weight\": \"4\", + \"width\": \"4\" } ]" diff --git a/Mods/Core/Items/Items.json b/Mods/Core/Items/Items.json index 0b691ae2..fbecc878 100644 --- a/Mods/Core/Items/Items.json +++ b/Mods/Core/Items/Items.json @@ -47,5 +47,51 @@ "stack_size": "1", "weight": "0.25", "width": "1" + }, + { + "Ranged": { + "firing_speed": "0.25", + "range": "1000", + "recoil": "20", + "reload_speed": "2.5", + "spread": "5", + "sway": "5", + "used_ammo": "9mm", + "used_magazine": "pistol_magazine", + "used_skill": "short_guns" + }, + "description": "A standard issue pistol that uses 9mm ammunition", + "height": "2", + "id": "pistol_9mm", + "image": "./Mods/Core/Items/pistol_64.png", + "max_stack_size": "1", + "name": "Pistol 9mm", + "sprite": "pistol_64.png", + "stack_size": "1", + "weight": "2", + "width": "2" + }, + { + "Ranged": { + "firing_speed": "0.1", + "range": "1000", + "recoil": "15", + "reload_speed": "2.5", + "spread": "8", + "sway": "5", + "used_ammo": "9mm", + "used_magazine": "pistol_magazine", + "used_skill": "short_guns" + }, + "description": "A standard issue rifle that uses 9mm ammunition", + "height": "2", + "id": "rifle_m4a1", + "image": "./Mods/Core/Items/rifle_128_64.png", + "max_stack_size": "1", + "name": "M4a1 rifle", + "sprite": "rifle_128_64.png", + "stack_size": "1", + "weight": "4", + "width": "4" } ] \ No newline at end of file diff --git a/Mods/Core/Items/pistol_64.png b/Mods/Core/Items/pistol_64.png new file mode 100644 index 0000000000000000000000000000000000000000..4091748ce5917e2e92288ddce0863fdd90bcb151 GIT binary patch literal 2902 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 B6pa7? literal 0 HcmV?d00001 diff --git a/Mods/Core/Items/rifle_128_64.png.import b/Mods/Core/Items/rifle_128_64.png.import new file mode 100644 index 00000000..0e178e0a --- /dev/null +++ b/Mods/Core/Items/rifle_128_64.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://iaxknyj2b5s2" +path="res://.godot/imported/rifle_128_64.png-b12f38a9f7ff52df43988cce360173b4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Items/rifle_128_64.png" +dest_files=["res://.godot/imported/rifle_128_64.png-b12f38a9f7ff52df43988cce360173b4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn index 6a668c63..f2cc5d5b 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn @@ -13,6 +13,7 @@ script = ExtResource("1_5v06u") DamageNumberBox = NodePath("Ammo/DamageNumber") [node name="Ammo" type="GridContainer" parent="."] +layout_mode = 0 size_flags_vertical = 3 columns = 2 diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn index 2a6fa0c0..aad0ead9 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn @@ -173,7 +173,7 @@ value = 1.0 layout_mode = 2 text = "Type(s)" -[node name="TypesContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Basic"] +[node name="TypesContainer" type="HFlowContainer" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 [node name="RangedWeaponCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn index a9e27e16..5c068b19 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn @@ -12,6 +12,7 @@ grow_vertical = 2 script = ExtResource("1_cgvqr") [node name="Magazine" type="GridContainer" parent="."] +layout_mode = 0 size_flags_vertical = 3 columns = 2 diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn index c8832a6d..219f960d 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn @@ -47,6 +47,7 @@ layout_mode = 2 text = "Magazine" [node name="UsedMagazineTextEdit" type="TextEdit" parent="Ranged"] +custom_minimum_size = Vector2(0, 28) layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.9 @@ -100,6 +101,7 @@ layout_mode = 2 text = "Skill" [node name="UsedSkillTextEdit" type="TextEdit" parent="Ranged"] +custom_minimum_size = Vector2(0, 28) layout_mode = 2 size_flags_horizontal = 3 size_flags_stretch_ratio = 0.9 diff --git a/Scripts/ItemAmmoEditor.gd b/Scripts/ItemAmmoEditor.gd index a1a816c8..e7cf0158 100644 --- a/Scripts/ItemAmmoEditor.gd +++ b/Scripts/ItemAmmoEditor.gd @@ -7,3 +7,11 @@ extends Control # Form elements @export var DamageNumberBox: SpinBox = null +func get_properties() -> Dictionary: + return { + "damage": DamageNumberBox.get_line_edit().text + } + +func set_properties(properties: Dictionary) -> void: + if properties.has("damage"): + DamageNumberBox.get_line_edit().text = properties["damage"] diff --git a/Scripts/ItemEditor.gd b/Scripts/ItemEditor.gd index c1bde7da..021e9db2 100644 --- a/Scripts/ItemEditor.gd +++ b/Scripts/ItemEditor.gd @@ -29,7 +29,7 @@ extends Control @export var StackSizeNumberBox: SpinBox = null @export var MaxStackSizeNumberBox: SpinBox = null -@export var typesContainer: HBoxContainer = null +@export var typesContainer: HFlowContainer = null @@ -72,6 +72,18 @@ func load_item_data() -> void: if MaxStackSizeNumberBox != null and contentData.has("max_stack_size"): MaxStackSizeNumberBox.get_line_edit().text = contentData["max_stack_size"] + # Loop through typesContainer children to load additional properties and set button_pressed + for i in range(typesContainer.get_child_count()): + var child = typesContainer.get_child(i) + if child is CheckBox: + var tabIndex = get_tab_by_title(child.text) + var tab = tabContainer.get_child(tabIndex) + if tab and tab.has_method("set_properties") and contentData.has(child.text): + tab.set_properties(contentData[child.text]) + # Set button_pressed to true if contentData has the property + child.button_pressed = true + refresh_tab_visibility() + #The editor is closed, destroy the instance #TODO: Check for unsaved changes func _on_close_button_button_up() -> void: @@ -92,6 +104,16 @@ func _on_save_button_button_up() -> void: contentData["weight"] = WeightNumberBox.get_line_edit().text contentData["stack_size"] = StackSizeNumberBox.get_line_edit().text contentData["max_stack_size"] = MaxStackSizeNumberBox.get_line_edit().text + + # Loop through typesContainer children to save additional properties + for i in range(typesContainer.get_child_count()): + var child = typesContainer.get_child(i) + # Check if the child is a CheckBox and its button_pressed is true + if child is CheckBox and child.button_pressed: + var tabIndex = get_tab_by_title(child.text) + var tab = tabContainer.get_child(tabIndex) + if tab and tab.has_method("get_properties"): + contentData[child.text] = tab.get_properties() data_changed.emit() #When the itemImageDisplay is clicked, the user will be prompted to select an image from diff --git a/Scripts/ItemMagazineEditor.gd b/Scripts/ItemMagazineEditor.gd index 5aabb3e7..87a34da1 100644 --- a/Scripts/ItemMagazineEditor.gd +++ b/Scripts/ItemMagazineEditor.gd @@ -5,6 +5,18 @@ extends Control # Form elements -@export var ReloadSpeedNumberBox: SpinBox = null -@export var FiringSpeedNumberBox: SpinBox = null +@export var UsedAmmoTextEdit: TextEdit = null +@export var MaxAmmoNumberBox: SpinBox = null + +func get_properties() -> Dictionary: + return { + "used_ammo": UsedAmmoTextEdit.text, + "max_ammo": MaxAmmoNumberBox.get_line_edit().text + } + +func set_properties(properties: Dictionary) -> void: + if properties.has("used_ammo"): + UsedAmmoTextEdit.text = properties["used_ammo"] + if properties.has("max_ammo"): + MaxAmmoNumberBox.get_line_edit().text = properties["max_ammo"] diff --git a/Scripts/ItemRangedEditor.gd b/Scripts/ItemRangedEditor.gd index bda84bbe..952da4d0 100644 --- a/Scripts/ItemRangedEditor.gd +++ b/Scripts/ItemRangedEditor.gd @@ -3,7 +3,6 @@ extends Control # This scene is intended to be used inside the item editor # It is supposed to edit exactly one ranged weapon - # Ranged form elements @export var UsedAmmoTextEdit: TextEdit = null @export var UsedMagazineTextEdit: TextEdit = null @@ -15,3 +14,35 @@ extends Control @export var ReloadSpeedNumberBox: SpinBox = null @export var FiringSpeedNumberBox: SpinBox = null +func get_properties() -> Dictionary: + return { + "used_ammo": UsedAmmoTextEdit.text, + "used_magazine": UsedMagazineTextEdit.text, + "range": RangeNumberBox.get_line_edit().text, + "spread": SpreadNumberBox.get_line_edit().text, + "sway": SwayNumberBox.get_line_edit().text, + "recoil": RecoilNumberBox.get_line_edit().text, + "used_skill": UsedSkillTextEdit.text, + "reload_speed": ReloadSpeedNumberBox.get_line_edit().text, + "firing_speed": FiringSpeedNumberBox.get_line_edit().text + } + +func set_properties(properties: Dictionary) -> void: + if properties.has("used_ammo"): + UsedAmmoTextEdit.text = properties["used_ammo"] + if properties.has("used_magazine"): + UsedMagazineTextEdit.text = properties["used_magazine"] + if properties.has("range"): + RangeNumberBox.get_line_edit().text = properties["range"] + if properties.has("spread"): + SpreadNumberBox.get_line_edit().text = properties["spread"] + if properties.has("sway"): + SwayNumberBox.get_line_edit().text = properties["sway"] + if properties.has("recoil"): + RecoilNumberBox.get_line_edit().text = properties["recoil"] + if properties.has("used_skill"): + UsedSkillTextEdit.text = properties["used_skill"] + if properties.has("reload_speed"): + ReloadSpeedNumberBox.get_line_edit().text = properties["reload_speed"] + if properties.has("firing_speed"): + FiringSpeedNumberBox.get_line_edit().text = properties["firing_speed"] From b3880ecbf500958065e32c56b7a9e4f9c7f9700e Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 24 Jan 2024 00:34:04 +0100 Subject: [PATCH 119/138] Magazine and bullet json --- ItemProtosets.tres | 7 +++++++ Mods/Core/Items/Items.json | 7 +++++++ .../Custom_Editors/ItemEditor/ItemMagazineEditor.tscn | 4 +++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ItemProtosets.tres b/ItemProtosets.tres index d93a95f7..4645cc17 100644 --- a/ItemProtosets.tres +++ b/ItemProtosets.tres @@ -31,6 +31,9 @@ json_data = "[ \"width\": \"2\" }, { + \"Ammo\": { + \"damage\": \"25\" + }, \"description\": \"Standard type of ammunition. Very common.\", \"height\": \"1\", \"id\": \"bullet_9mm\", @@ -43,6 +46,10 @@ json_data = "[ \"width\": \"1\" }, { + \"Magazine\": { + \"max_ammo\": \"20\", + \"used_ammo\": \"9mm\" + }, \"description\": \"In order for your pistol to fire a bullet, it needs to have a magazine loaded with bullets\", \"height\": \"1\", \"id\": \"pistol_magazine\", diff --git a/Mods/Core/Items/Items.json b/Mods/Core/Items/Items.json index fbecc878..4c1765c0 100644 --- a/Mods/Core/Items/Items.json +++ b/Mods/Core/Items/Items.json @@ -25,6 +25,9 @@ "width": "2" }, { + "Ammo": { + "damage": "25" + }, "description": "Standard type of ammunition. Very common.", "height": "1", "id": "bullet_9mm", @@ -37,6 +40,10 @@ "width": "1" }, { + "Magazine": { + "max_ammo": "20", + "used_ammo": "9mm" + }, "description": "In order for your pistol to fire a bullet, it needs to have a magazine loaded with bullets", "height": "1", "id": "pistol_magazine", diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn index 5c068b19..d1cffcaf 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://Scripts/ItemMagazineEditor.gd" id="1_cgvqr"] -[node name="ItemMagazineEditor" type="Control"] +[node name="ItemMagazineEditor" type="Control" node_paths=PackedStringArray("UsedAmmoTextEdit", "MaxAmmoNumberBox")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -10,6 +10,8 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_cgvqr") +UsedAmmoTextEdit = NodePath("Magazine/UsedAmmoTextEdit") +MaxAmmoNumberBox = NodePath("Magazine/MaxAmmoNumber") [node name="Magazine" type="GridContainer" parent="."] layout_mode = 0 From b1ecc2079c84653545a6cfcb956fd50ea17deee8 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 24 Jan 2024 02:16:30 +0100 Subject: [PATCH 120/138] Weapon can be equipped --- Mods/Core/Items/Items.json | 2 + .../ItemEditor/ItemRangedEditor.tscn | 12 ++- Scenes/InventoryWindow.tscn | 34 ++++++- Scripts/InventoryWindow.gd | 89 +++---------------- Scripts/ItemRangedEditor.gd | 6 +- Scripts/PlayerShooting.gd | 65 +++++++++++--- Scripts/hud.gd | 5 ++ hud.tscn | 3 +- level_generation.tscn | 1 + 9 files changed, 120 insertions(+), 97 deletions(-) diff --git a/Mods/Core/Items/Items.json b/Mods/Core/Items/Items.json index 4c1765c0..1b3394c4 100644 --- a/Mods/Core/Items/Items.json +++ b/Mods/Core/Items/Items.json @@ -63,6 +63,7 @@ "reload_speed": "2.5", "spread": "5", "sway": "5", + "two_handed": false, "used_ammo": "9mm", "used_magazine": "pistol_magazine", "used_skill": "short_guns" @@ -86,6 +87,7 @@ "reload_speed": "2.5", "spread": "8", "sway": "5", + "two_handed": true, "used_ammo": "9mm", "used_magazine": "pistol_magazine", "used_skill": "short_guns" diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn index 219f960d..aadaacf4 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://Scripts/ItemRangedEditor.gd" id="1_my1v7"] -[node name="ItemRangedEditor" type="Control" node_paths=PackedStringArray("UsedAmmoTextEdit", "UsedMagazineTextEdit", "RangeNumberBox", "SpreadNumberBox", "SwayNumberBox", "RecoilNumberBox", "UsedSkillTextEdit", "ReloadSpeedNumberBox", "FiringSpeedNumberBox")] +[node name="ItemRangedEditor" type="Control" node_paths=PackedStringArray("UsedAmmoTextEdit", "UsedMagazineTextEdit", "RangeNumberBox", "SpreadNumberBox", "SwayNumberBox", "RecoilNumberBox", "UsedSkillTextEdit", "ReloadSpeedNumberBox", "FiringSpeedNumberBox", "TwoHandedCheckBox")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -19,6 +19,7 @@ RecoilNumberBox = NodePath("Ranged/RecoilNumber") UsedSkillTextEdit = NodePath("Ranged/UsedSkillTextEdit") ReloadSpeedNumberBox = NodePath("Ranged/ReloadSpeedNumber") FiringSpeedNumberBox = NodePath("Ranged/FiringSpeedNumber") +TwoHandedCheckBox = NodePath("Ranged/TwoHandedCheckBox") [node name="Ranged" type="GridContainer" parent="."] layout_mode = 1 @@ -130,3 +131,12 @@ tooltip_text = "The maximum number of this item that will fit in a stack" min_value = 0.01 step = 0.01 value = 0.25 + +[node name="TwoHandedLabel" type="Label" parent="Ranged"] +layout_mode = 2 +text = "Two handed" + +[node name="TwoHandedCheckBox" type="CheckBox" parent="Ranged"] +layout_mode = 2 +tooltip_text = "Enable this if the ranged weapon occupies both hands. Disable this if the equipped weapon occupies one hand" +text = "Two handed" diff --git a/Scenes/InventoryWindow.tscn b/Scenes/InventoryWindow.tscn index fe5fc1f8..84444b99 100644 --- a/Scenes/InventoryWindow.tscn +++ b/Scenes/InventoryWindow.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=13 format=3 uid="uid://e0ebcv1n8jnq"] +[gd_scene load_steps=14 format=3 uid="uid://e0ebcv1n8jnq"] [ext_resource type="Script" path="res://Scripts/InventoryWindow.gd" id="1_7kqbx"] [ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="2_alcyo"] [ext_resource type="PackedScene" uid="uid://crck2fhgayxhn" path="res://Scenes/InventoryContainerListItem.tscn" id="2_xfgb3"] -[ext_resource type="Resource" uid="uid://bvrl0obu5ejqq" path="res://ItemProtosets.tres" id="3_sqsc0"] +[ext_resource type="Resource" uid="uid://b1tngttyk4w2s" path="res://ItemProtosets.tres" id="3_sqsc0"] [ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_grid_ex.gd" id="4_8j4xb"] +[ext_resource type="Script" path="res://addons/gloot/core/inventory_item.gd" id="5_qidb6"] [ext_resource type="Texture2D" uid="uid://cwmsngeoc631h" path="res://Textures/Screenshot_167.png" id="5_wixd1"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="6_xpf2l"] [ext_resource type="Script" path="res://addons/gloot/ui/ctrl_item_slot_ex.gd" id="7_kcmi5"] @@ -12,13 +13,13 @@ [ext_resource type="Script" path="res://addons/gloot/core/item_slot.gd" id="9_qoep6"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hyt2o"] -bg_color = Color(0.152941, 0.152941, 0.231373, 1) +bg_color = Color(0.584314, 0.588235, 0.737255, 1) [sub_resource type="Theme" id="Theme_6v4rg"] default_font = ExtResource("6_xpf2l") default_font_size = 13 -[node name="InventoryWindow" type="Control" node_paths=PackedStringArray("proximity_inventory", "proximity_inventory_control", "inventory_control", "inventory", "containerList", "tooltip", "tooltip_item_name", "tooltip_item_description")] +[node name="InventoryWindow" type="Control" node_paths=PackedStringArray("proximity_inventory", "proximity_inventory_control", "inventory_control", "inventory", "containerList", "LeftHandEquipmentSlot", "RightHandEquipmentSlot", "tooltip", "tooltip_item_name", "tooltip_item_description")] layout_mode = 3 anchors_preset = 0 offset_top = 150.0 @@ -33,6 +34,8 @@ inventory_control = NodePath("HBoxContainer/Inventories/CtrlInventoryGridEx") inventory = NodePath("InventoryGridStacked") containerList = NodePath("HBoxContainer/ContainersList") containerListItem = ExtResource("2_xfgb3") +LeftHandEquipmentSlot = NodePath("HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentSlot") +RightHandEquipmentSlot = NodePath("HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentSlot") tooltip = NodePath("Tooltip") tooltip_item_name = NodePath("Tooltip/Panel/ItemName") tooltip_item_description = NodePath("Tooltip/Panel2/Description") @@ -53,6 +56,27 @@ script = ExtResource("2_alcyo") size = Vector2i(12, 8) item_protoset = ExtResource("3_sqsc0") +[node name="_Node_50375" type="Node" parent="InventoryGridStacked"] +script = ExtResource("5_qidb6") +protoset = ExtResource("3_sqsc0") +prototype_id = "pistol_9mm" + +[node name="_Node_51104" type="Node" parent="InventoryGridStacked"] +script = ExtResource("5_qidb6") +protoset = ExtResource("3_sqsc0") +prototype_id = "pistol_magazine" +properties = { +"grid_position": Vector2i(0, 2) +} + +[node name="_Node_52218" type="Node" parent="InventoryGridStacked"] +script = ExtResource("5_qidb6") +protoset = ExtResource("3_sqsc0") +prototype_id = "bullet_9mm" +properties = { +"grid_position": Vector2i(0, 3) +} + [node name="InventoryGridStackedProx" type="Node" parent="."] script = ExtResource("2_alcyo") size = Vector2i(12, 8) @@ -194,3 +218,5 @@ autowrap_mode = 3 [connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_exited"] [connection signal="item_mouse_entered" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_entered"] [connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_exited"] +[connection signal="item_equipped" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentSlot" to="." method="_on_left_hand_equipment_slot_item_equipped"] +[connection signal="item_equipped" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentSlot" to="." method="_on_right_hand_equipment_slot_item_equipped"] diff --git a/Scripts/InventoryWindow.gd b/Scripts/InventoryWindow.gd index 376f225a..5dbf8e0a 100644 --- a/Scripts/InventoryWindow.gd +++ b/Scripts/InventoryWindow.gd @@ -13,12 +13,17 @@ extends Control @export var containerList : VBoxContainer @export var containerListItem : PackedScene +# Equipment +@export var LeftHandEquipmentSlot : ItemSlot +@export var RightHandEquipmentSlot : ItemSlot + # The tooltip will show when the player hovers over an item @export var tooltip: Control var is_showing_tooltip = false @export var tooltip_item_name : Label @export var tooltip_item_description : Label +signal item_was_equipped(equippedItem: InventoryItem, slotName: String) # Called when the node enters the scene tree for the first time. func _ready(): @@ -118,25 +123,6 @@ func _on_inventory_grid_stacked_item_added(item): func get_inventory() -> InventoryGridStacked: return inventory -# -# -## The parameter container is the node3d that holds the inventory that has entered proximity -#func _on_item_detector_add_to_proximity_inventory(container: Node3D): - #var duplicated_items = container.get_items() - #for item in duplicated_items: - #var duplicated_item = item.duplicate() - ## Store the original inventory - #duplicated_item.set_meta("original_parent", item.get_inventory()) - #duplicated_item.set_meta("original_item", item) - #proximity_inventory.add_child(duplicated_item) -# -## The parameter container is the node3d that holds the inventory that has left proximity -#func _on_item_detector_remove_from_proximity_inventory(container: Node3D): - #for prox_item in proximity_inventory.get_children(): - #for item in container.get_items(): - #if item.get_property("assigned_id") == prox_item.get_property("assigned_id"): - #prox_item.queue_free() - # Signal handler for adding a container to the proximity func _on_item_detector_add_to_proximity_inventory(container: Node3D): @@ -145,17 +131,6 @@ func _on_item_detector_add_to_proximity_inventory(container: Node3D): # Signal handler for removing a container from the proximity func _on_item_detector_remove_from_proximity_inventory(container: Node3D): remove_container_from_list(container) -# -## Function to add a container to the containerList -#func add_container_to_list(container: Node3D): - ## Create a new instance of the containerlistitem node - #var containerListItemInstance = containerListItem.instantiate() - ## Assign the texture to the TextureRect - #containerListItemInstance.set_item_texture(container.get_sprite()) - ## We save a reference to the container - #containerListItemInstance.containerInstance = container - #containerListItemInstance.containerlistitem_clicked.connect(_on_container_clicked) - #containerList.add_child(containerListItemInstance) # Function to add a container to the containerList func add_container_to_list(container: Node3D): @@ -185,52 +160,6 @@ func _on_container_clicked(containerListItemInstance: Control): if container_inventory: proximity_inventory_control.inventory = container_inventory -# -## Function to remove a container from the containerList -#func remove_container_from_list(container: Node3D): - #for child in containerList.get_children(): - #if child.containerInstance == container: - #child.queue_free() - #break -# - ## Check if containerList has no more children - #if containerList.get_child_count() == 0: - ## Set proximity_inventory_control.inventory to proximity_inventory - #proximity_inventory_control.inventory = proximity_inventory - ## Hide the proximity_inventory_control - #proximity_inventory_control.visible = false -# -# -## Function to remove a container from the containerList -#func remove_container_from_list(container: Node3D): - #var was_selected = false - #var first_container = null -# - ## Check if the container being removed is the currently selected one - #if proximity_inventory_control.inventory == container.get_inventory(): - #was_selected = true -# - ## Remove the container from the list - #for child in containerList.get_children(): - #if child.containerInstance == container: - #child.queue_free() - #break -# - ## Check if there are any containers left in the list - #if containerList.get_child_count() > 0: - #first_container = containerList.get_child(0).containerInstance -# - ## If the removed container was selected, update the inventory to the first container's inventory - #if was_selected and first_container: - #var first_container_inventory = first_container.get_inventory() - #if first_container_inventory: - #proximity_inventory_control.inventory = first_container_inventory - #elif was_selected or containerList.get_child_count() == 0: - ## Reset the inventory to proximity_inventory and hide the control - #proximity_inventory_control.inventory = proximity_inventory - #proximity_inventory_control.visible = false -# - # Function to remove a container from the containerList func remove_container_from_list(container: Node3D): var was_selected = false @@ -259,3 +188,11 @@ func remove_container_from_list(container: Node3D): # Reset the inventory to proximity_inventory and hide the control proximity_inventory_control.inventory = proximity_inventory proximity_inventory_control.visible = false + + +func _on_left_hand_equipment_slot_item_equipped(): + item_was_equipped.emit(LeftHandEquipmentSlot.get_item(), "LeftHand") + + +func _on_right_hand_equipment_slot_item_equipped(): + item_was_equipped.emit(RightHandEquipmentSlot.get_item(), "RightHand") diff --git a/Scripts/ItemRangedEditor.gd b/Scripts/ItemRangedEditor.gd index 952da4d0..c43e2671 100644 --- a/Scripts/ItemRangedEditor.gd +++ b/Scripts/ItemRangedEditor.gd @@ -13,6 +13,7 @@ extends Control @export var UsedSkillTextEdit: TextEdit = null @export var ReloadSpeedNumberBox: SpinBox = null @export var FiringSpeedNumberBox: SpinBox = null +@export var TwoHandedCheckBox: CheckBox = null func get_properties() -> Dictionary: return { @@ -24,7 +25,8 @@ func get_properties() -> Dictionary: "recoil": RecoilNumberBox.get_line_edit().text, "used_skill": UsedSkillTextEdit.text, "reload_speed": ReloadSpeedNumberBox.get_line_edit().text, - "firing_speed": FiringSpeedNumberBox.get_line_edit().text + "firing_speed": FiringSpeedNumberBox.get_line_edit().text, + "two_handed": TwoHandedCheckBox.button_pressed } func set_properties(properties: Dictionary) -> void: @@ -46,3 +48,5 @@ func set_properties(properties: Dictionary) -> void: ReloadSpeedNumberBox.get_line_edit().text = properties["reload_speed"] if properties.has("firing_speed"): FiringSpeedNumberBox.get_line_edit().text = properties["firing_speed"] + if properties.has("two_handed"): + TwoHandedCheckBox.button_pressed = properties["two_handed"] diff --git a/Scripts/PlayerShooting.gd b/Scripts/PlayerShooting.gd index 184e6153..26794885 100644 --- a/Scripts/PlayerShooting.gd +++ b/Scripts/PlayerShooting.gd @@ -33,7 +33,8 @@ var damage = 25 func _input(event): - + if not weapon: + return # Return early if no weapon is equipped if event.is_action_pressed("reload_weapon"): reload_timer.start() @@ -105,17 +106,23 @@ func _input(event): # Called when the node enters the scene tree for the first time. func _ready(): - weapon = ItemManager.weapon - magazine = ItemManager.magazine - ammo = ItemManager.ammo - - max_ammo = int(magazine["max_ammo"]) - current_ammo = max_ammo - - ammo_changed.emit(current_ammo, max_ammo) - - attack_cooldown.wait_time = float(weapon["firing_speed"]) - reload_timer.wait_time = float(weapon["reload_speed"]) + # Initialize without assigning a default weapon, magazine, or ammo. + weapon = null + magazine = null + ammo = null + current_ammo = 0 + max_ammo = 0 + #weapon = Gamedata.get_data_by_id(Gamedata.data.items, "pistol_9mm") + #magazine = Gamedata.get_data_by_id(Gamedata.data.items, "pistol_magazine") + #ammo = Gamedata.get_data_by_id(Gamedata.data.items, "bullet_9mm") + # + #max_ammo = int(magazine.Magazine["max_ammo"]) + #current_ammo = max_ammo + # + #ammo_changed.emit(current_ammo, max_ammo) + # + #attack_cooldown.wait_time = float(weapon.Ranged["firing_speed"]) + #reload_timer.wait_time = float(weapon.Ranged["reload_speed"]) @@ -129,5 +136,35 @@ func _process(_delta): func _on_reload_time_timeout(): - current_ammo = max_ammo - ammo_changed.emit(current_ammo, max_ammo) + if weapon: + current_ammo = max_ammo + ammo_changed.emit(current_ammo, max_ammo) + + +# The player has equipped an item in one of the equipmentslots +# equippedItem is an InventoryItem +# slotName is a string, for example "LeftHand" or "RightHand" +func _on_hud_item_was_equipped(equippedItem: InventoryItem, slotName: String): + var weaponID = equippedItem.prototype_id + var weaponData = Gamedata.get_data_by_id(Gamedata.data.items, weaponID) + if weaponData.has("Ranged"): + weapon = weaponData + var twoHanded: bool = weapon.Ranged.two_handed + var newMagazineID = weapon.Ranged.used_magazine + var newAmmoID = weapon.Ranged.used_ammo + magazine = Gamedata.get_data_by_id(Gamedata.data.items, newMagazineID) + ammo = Gamedata.get_data_by_id(Gamedata.data.items, newAmmoID) + + max_ammo = int(magazine.Magazine["max_ammo"]) + current_ammo = max_ammo + + attack_cooldown.wait_time = float(weapon.Ranged["firing_speed"]) + reload_timer.wait_time = float(weapon.Ranged["reload_speed"]) + ammo_changed.emit(current_ammo, max_ammo) + else: + # Reset weapon, magazine, and ammo if the equipped item is not a weapon + weapon = null + magazine = null + ammo = null + current_ammo = 0 + max_ammo = 0 diff --git a/Scripts/hud.gd b/Scripts/hud.gd index d1a0e9c7..f1ae8b72 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -32,6 +32,7 @@ var progress_bar_timer_max_time : float var is_progress_bar_well_progressing_i_guess = false signal construction_chosen +signal item_was_equipped(equippedItem: InventoryItem, slotName: String) @@ -185,3 +186,7 @@ func _on_item_detector_add_to_proximity_inventory(container): # The parameter container the inventory that has left proximity func _on_item_detector_remove_from_proximity_inventory(container): inventoryWindow._on_item_detector_remove_from_proximity_inventory(container) + +# When an item in the inventorywindow was equipped, we pass on the signal +func _on_inventory_window_item_was_equipped(equippedItem, slotName): + item_was_equipped.emit(equippedItem, slotName) diff --git a/hud.tscn b/hud.tscn index a77122ae..466cede0 100644 --- a/hud.tscn +++ b/hud.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" path="res://Scripts/hud.gd" id="1_s3xoj"] [ext_resource type="Script" path="res://Scripts/NonHUDclick.gd" id="2_kpbhl"] [ext_resource type="Texture2D" uid="uid://7hppy1l45loq" path="res://Textures/bar_progress.png" id="3_83uwt"] -[ext_resource type="Resource" uid="uid://bvrl0obu5ejqq" path="res://ItemProtosets.tres" id="3_jmlkb"] +[ext_resource type="Resource" uid="uid://b1tngttyk4w2s" path="res://ItemProtosets.tres" id="3_jmlkb"] [ext_resource type="Texture2D" uid="uid://dcgwgmsmi7mjn" path="res://Textures/bar_border.png" id="3_y43f5"] [ext_resource type="Texture2D" uid="uid://tdebfxkpwiva" path="res://Textures/leftarm.png" id="4_wt5t7"] [ext_resource type="Texture2D" uid="uid://8pdm2gvd1v3n" path="res://Textures/leftleg.png" id="5_si2ot"] @@ -333,3 +333,4 @@ visible = false [connection signal="start_craft" from="CraftingMenu" to="." method="_on_crafting_menu_start_craft"] [connection signal="pressed" from="CraftingMenu/Panel/StartCraftingButton" to="CraftingMenu" method="_on_start_crafting_button_pressed"] [connection signal="change_level_pressed" from="Overmap" to="." method="_on_overmap_change_level_pressed"] +[connection signal="item_was_equipped" from="InventoryWindow" to="." method="_on_inventory_window_item_was_equipped"] diff --git a/level_generation.tscn b/level_generation.tscn index 051a55f5..00aebb74 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -204,3 +204,4 @@ transform = Transform3D(-0.946576, 0, -0.32248, 0, 1, 0, 0.32248, 0, -0.946576, [connection signal="area_exited" from="TacticalMap/Entities/Player/ItemDetector" to="TacticalMap/Entities/Player/ItemDetector" method="_on_area_exited"] [connection signal="remove_from_proximity_inventory" from="TacticalMap/Entities/Player/ItemDetector" to="HUD" method="_on_item_detector_remove_from_proximity_inventory"] [connection signal="construction_chosen" from="HUD" to="TacticalMap/BuildManager" method="_on_hud_construction_chosen"] +[connection signal="item_was_equipped" from="HUD" to="TacticalMap/Entities/Player/Shooting" method="_on_hud_item_was_equipped"] From 66da0a726d18934dec373b6efb5f3245036bd4e1 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 24 Jan 2024 06:14:16 +0100 Subject: [PATCH 121/138] start implementing dual wielding --- Scripts/PlayerShooting.gd | 246 +++++++++++++++++++++++--------------- Scripts/hud.gd | 7 +- hud.tscn | 50 +++++--- level_generation.tscn | 22 +++- project.godot | 20 ++-- 5 files changed, 210 insertions(+), 135 deletions(-) diff --git a/Scripts/PlayerShooting.gd b/Scripts/PlayerShooting.gd index 26794885..bf6212f1 100644 --- a/Scripts/PlayerShooting.gd +++ b/Scripts/PlayerShooting.gd @@ -7,7 +7,22 @@ var ammo var current_ammo : int var max_ammo : int -signal ammo_changed + + +# Define properties for left-hand and right-hand weapons. +var left_hand_weapon +var right_hand_weapon +var left_hand_magazine +var right_hand_magazine +var left_hand_ammo +var right_hand_ammo + +var current_left_ammo : int +var max_left_ammo : int +var current_right_ammo : int +var max_right_ammo : int + +signal ammo_changed(current_ammo: int, max_ammo: int, leftHand: bool) @export var projectiles: NodePath @export var bullet_speed: float @@ -17,8 +32,11 @@ signal ammo_changed @export var bullet_line_scene: PackedScene -@export var attack_cooldown : Timer -@export var reload_timer : Timer +@export var left_attack_cooldown : Timer +@export var right_attack_cooldown : Timer +@export var left_reload_timer : Timer +@export var right_reload_timer : Timer + @export var player: NodePath @export var hud: NodePath @@ -37,72 +55,92 @@ func _input(event): return # Return early if no weapon is equipped if event.is_action_pressed("reload_weapon"): - reload_timer.start() - get_node(hud).start_progress_bar(reload_timer.time_left) + # Reload logic for both weapons with additional checks. + if left_hand_weapon and current_left_ammo < max_left_ammo and right_reload_timer.is_stopped(): + reload_left_weapon() + elif right_hand_weapon and current_right_ammo < max_right_ammo and left_reload_timer.is_stopped(): + reload_right_weapon() + + # Handling left and right click for different weapons. + if event.is_action_pressed("click_left") and General.is_mouse_outside_HUD and General.is_allowed_to_shoot: + fire_weapon(left_hand_weapon, current_left_ammo, max_left_ammo, "left") + + if event.is_action_pressed("click_right") and General.is_mouse_outside_HUD and General.is_allowed_to_shoot: + fire_weapon(right_hand_weapon, current_right_ammo, max_right_ammo, "right") + +# New function to handle firing logic for a weapon. +func fire_weapon(weapon, current_ammo, max_ammo, hand): + if not weapon or current_ammo <= 0: + return # Return if no weapon is equipped or no ammo. - if event.is_action_pressed("click") && General.is_mouse_outside_HUD && General.is_allowed_to_shoot: - -# var space_state = get_world_2d().direct_space_state -# var query = PhysicsRayQueryParameters2D.create(global_position, global_position + (get_global_mouse_position() - global_position).normalized() * 10000 , pow(2, 1-1) + pow(2, 2-1) + pow(2, 3-1),[self]) -# -# var result = space_state.intersect_ray(query) -# -# if result: -# print("hit") -# var line = bullet_line_scene.instantiate() -# get_node(projectiles).add_child(line) -# line.add_point(global_position) -# line.add_point(result.position) -# -# if result.collider.has_method("_get_hit"): -# result.collider._get_hit(damage) - if attack_cooldown.is_stopped() && current_ammo > 0 && reload_timer.is_stopped(): - attack_cooldown.start() - current_ammo -= 1 - ammo_changed.emit(current_ammo, max_ammo) - shoot_audio_player.stream = shoot_audio_randomizer - shoot_audio_player.play() + var cooldown_timer = get_cooldown_timer(hand) + if cooldown_timer.is_stopped() and reload_timer_is_stopped(hand): + cooldown_timer.start() + # Update ammo and emit signal. + if hand == "left": + current_left_ammo -= 1 + ammo_changed.emit(current_left_ammo, max_left_ammo, true) + elif hand == "right": + current_right_ammo -= 1 + ammo_changed.emit(current_right_ammo, max_right_ammo, false) - var space_state = get_world_3d().direct_space_state - var mouse_pos : Vector2 = get_viewport().get_mouse_position() - -# var dropPlane = Plane(Vector3(0, 0, 1), 1) -# var position3D = dropPlane.intersects_ray( -# get_tree().get_first_node_in_group("Camera").project_ray_origin(mouse_pos), -# get_tree().get_first_node_in_group("Camera").project_ray_normal(mouse_pos)) - -# var query = PhysicsRayQueryParameters3D.create(global_position, global_position + Vector3(mouse_pos.x - global_position.x, 0, mouse_pos.y - global_position.z).normalized() * 10000 , pow(2, 1-1) + pow(2, 2-1) + pow(2, 3-1),[self]) - #var query = PhysicsRayQueryParameters3D.create(global_position, global_position + (position3D - global_position).normalized() * 10000 , pow(2, 1-1) + pow(2, 2-1) + pow(2, 3-1),[self]) - var layer = pow(2, 1-1) + pow(2, 2-1) + pow(2, 3-1) - var mouse_pos_in_world = Helper.raycast_from_mouse(mouse_pos, layer).position - var query = PhysicsRayQueryParameters3D.create(global_position, global_position + (Vector3(mouse_pos_in_world.x - global_position.x, 0, mouse_pos_in_world.z - global_position.z)).normalized() * 10000, layer, [self]) + + shoot_audio_player.stream = shoot_audio_randomizer + shoot_audio_player.play() + + var space_state = get_world_3d().direct_space_state + var mouse_pos : Vector2 = get_viewport().get_mouse_position() + + var layer = pow(2, 1-1) + pow(2, 2-1) + pow(2, 3-1) + var mouse_pos_in_world = Helper.raycast_from_mouse(mouse_pos, layer).position + var query = PhysicsRayQueryParameters3D.create(global_position, global_position + (Vector3(mouse_pos_in_world.x - global_position.x, 0, mouse_pos_in_world.z - global_position.z)).normalized() * 10000, layer, [self]) - var result = space_state.intersect_ray(query) + var result = space_state.intersect_ray(query) + + if result: + print("hit") + Helper.line(global_position, result.position) - if result: - print("hit") -# var line = bullet_line_scene.instantiate() -# get_node(projectiles).add_child(line) -# line.add_point(global_position) -# line.add_point(result.position) - Helper.line(global_position, result.position) - - if result.collider.has_method("_get_hit"): - result.collider._get_hit(damage) - + if result.collider.has_method("_get_hit"): + result.collider._get_hit(damage) +# Helper function to get the appropriate cooldown timer based on the hand. +func get_cooldown_timer(hand: String) -> Timer: + if hand == "left": + return left_attack_cooldown + else: + return right_attack_cooldown +# Helper function to check if reload timer is stopped based on the hand. +func reload_timer_is_stopped(hand: String) -> bool: + if hand == "left": + return left_reload_timer.is_stopped() + else: + return right_reload_timer.is_stopped() + +# Called when the left weapon is reloaded +# Since only one reload action can run at a time, +# We check that the right reload timer is stopped +func reload_left_weapon(): + if right_reload_timer.is_stopped(): + # Logic to reload left-hand weapon. + current_left_ammo = max_left_ammo + left_reload_timer.start() # Start the left reload timer + ammo_changed.emit(current_left_ammo, max_left_ammo, true) + +# Called when the right weapon is reloaded +# Since only one reload action can run at a time, +# We check that the left reload timer is stopped +func reload_right_weapon(): + if left_reload_timer.is_stopped(): + # Logic to reload right-hand weapon. + current_right_ammo = max_right_ammo + right_reload_timer.start() # Start the right reload timer + ammo_changed.emit(current_right_ammo, max_right_ammo, false) -# var bullet = bullet_scene.instantiate() -# bullet.speed = bullet_speed -# bullet.damage = bullet_damage -# get_node(projectiles).add_child(bullet) -# bullet.global_position = global_position -# #bullet.rotation = (get_global_mouse_position() - global_position).normalized() -# bullet.direction = (get_global_mouse_position() - global_position).normalized() # Called when the node enters the scene tree for the first time. func _ready(): @@ -112,59 +150,71 @@ func _ready(): ammo = null current_ammo = 0 max_ammo = 0 - #weapon = Gamedata.get_data_by_id(Gamedata.data.items, "pistol_9mm") - #magazine = Gamedata.get_data_by_id(Gamedata.data.items, "pistol_magazine") - #ammo = Gamedata.get_data_by_id(Gamedata.data.items, "bullet_9mm") - # - #max_ammo = int(magazine.Magazine["max_ammo"]) - #current_ammo = max_ammo - # - #ammo_changed.emit(current_ammo, max_ammo) - # - #attack_cooldown.wait_time = float(weapon.Ranged["firing_speed"]) - #reload_timer.wait_time = float(weapon.Ranged["reload_speed"]) - + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): - - # Reloading sound logic, basically we want to play the sound during the reloading phase, - # not before or after reloading so the end of reloading sounds will align with end of the reloading phase - if reload_timer.time_left <= reload_audio_player.stream.get_length() && !reload_audio_player.playing && !reload_timer.is_stopped(): - reload_audio_player.play() + # Check if the left-hand weapon is reloading. + if left_reload_timer.is_started() and not left_reload_timer.is_stopped() and left_reload_timer.time_left <= reload_audio_player.stream.get_length() and not reload_audio_player.playing: + reload_audio_player.play() # Play reload sound for left-hand weapon. + + # Check if the right-hand weapon is reloading. + if right_reload_timer.is_started() and not right_reload_timer.is_stopped() and right_reload_timer.time_left <= reload_audio_player.stream.get_length() and not reload_audio_player.playing: + reload_audio_player.play() # Play reload sound for right-hand weapon. +# The weapon is reloaded once the timer has stopped func _on_reload_time_timeout(): - if weapon: - current_ammo = max_ammo - ammo_changed.emit(current_ammo, max_ammo) + if left_reload_timer.is_stopped() and left_hand_weapon: + current_left_ammo = max_left_ammo + ammo_changed.emit(current_left_ammo, max_left_ammo, true) + + if right_reload_timer.is_stopped() and right_hand_weapon: + current_right_ammo = max_right_ammo + ammo_changed.emit(current_right_ammo, max_right_ammo, false) # The player has equipped an item in one of the equipmentslots # equippedItem is an InventoryItem # slotName is a string, for example "LeftHand" or "RightHand" func _on_hud_item_was_equipped(equippedItem: InventoryItem, slotName: String): + # Adjust this function to handle dual-wielding. var weaponID = equippedItem.prototype_id var weaponData = Gamedata.get_data_by_id(Gamedata.data.items, weaponID) if weaponData.has("Ranged"): - weapon = weaponData - var twoHanded: bool = weapon.Ranged.two_handed - var newMagazineID = weapon.Ranged.used_magazine - var newAmmoID = weapon.Ranged.used_ammo - magazine = Gamedata.get_data_by_id(Gamedata.data.items, newMagazineID) - ammo = Gamedata.get_data_by_id(Gamedata.data.items, newAmmoID) - - max_ammo = int(magazine.Magazine["max_ammo"]) - current_ammo = max_ammo - - attack_cooldown.wait_time = float(weapon.Ranged["firing_speed"]) - reload_timer.wait_time = float(weapon.Ranged["reload_speed"]) - ammo_changed.emit(current_ammo, max_ammo) + var newMagazineID = weaponData.Ranged.used_magazine + var newAmmoID = weaponData.Ranged.used_ammo + # Set the weapon for the corresponding hand. + if slotName == "LeftHand": + left_hand_weapon = weaponData + left_hand_magazine = Gamedata.get_data_by_id(Gamedata.data.items, newMagazineID) + left_hand_ammo = Gamedata.get_data_by_id(Gamedata.data.items, newAmmoID) + max_left_ammo = int(left_hand_magazine.Magazine["max_ammo"]) + current_left_ammo = max_left_ammo + elif slotName == "RightHand": + right_hand_weapon = weaponData + right_hand_magazine = Gamedata.get_data_by_id(Gamedata.data.items, newMagazineID) + right_hand_ammo = Gamedata.get_data_by_id(Gamedata.data.items, newAmmoID) + max_right_ammo = int(right_hand_magazine.Magazine["max_ammo"]) + current_right_ammo = max_right_ammo + # Check for two-handed weapon and adjust accordingly. + if weaponData.Ranged.two_handed: + if slotName == "LeftHand": + right_hand_weapon = null # Clear the right hand if a two-handed weapon is equipped in the left hand. + elif slotName == "RightHand": + left_hand_weapon = null # Clear the left hand if a two-handed weapon is equipped in the right hand. else: - # Reset weapon, magazine, and ammo if the equipped item is not a weapon - weapon = null - magazine = null - ammo = null - current_ammo = 0 - max_ammo = 0 + # Reset weapon, magazine, and ammo if the equipped item is not a weapon. + if slotName == "LeftHand": + left_hand_weapon = null + left_hand_magazine = null + left_hand_ammo = null + current_left_ammo = 0 + max_left_ammo = 0 + elif slotName == "RightHand": + right_hand_weapon = null + right_hand_magazine = null + right_hand_ammo = null + current_right_ammo = 0 + max_right_ammo = 0 diff --git a/Scripts/hud.gd b/Scripts/hud.gd index f1ae8b72..e952b2e4 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -9,7 +9,8 @@ extends CanvasLayer @export var stamina_HUD: NodePath -@export var ammo_HUD: NodePath +@export var ammo_HUD_left: NodePath +@export var ammo_HUD_right: NodePath @export var healthy_color: Color @export var damaged_color: Color @@ -171,8 +172,8 @@ func interrupt_progress_bar(): func _on_progress_bar_timer_timeout(): interrupt_progress_bar() -func _on_shooting_ammo_changed(current_ammo, max_ammo): - get_node(ammo_HUD).text = str(current_ammo) + "/" + str(max_ammo) +func _on_shooting_ammo_changed(current_ammo: int, max_ammo: int): + get_node(ammo_HUD_left).text = str(current_ammo) + "/" + str(max_ammo) # Called when the users presses the travel button on the overmap # We save the player inventory to a autoload singleton so we can load it on the next map diff --git a/hud.tscn b/hud.tscn index 466cede0..4d644f6f 100644 --- a/hud.tscn +++ b/hud.tscn @@ -35,7 +35,8 @@ torso_health = NodePath("Doll/Torso") right_leg_health = NodePath("Doll/Rightleg") left_leg_health = NodePath("Doll/Leftleg") stamina_HUD = NodePath("StaminaLevel") -ammo_HUD = NodePath("Ammo") +ammo_HUD_left = NodePath("AmmoVisuals/LeftAmmo") +ammo_HUD_right = NodePath("AmmoVisuals/RightAmmo") healthy_color = Color(0, 0.635294, 0, 1) damaged_color = Color(0.635294, 0, 0, 1) inventoryWindow = NodePath("InventoryWindow") @@ -96,44 +97,57 @@ theme_override_font_sizes/font_size = 49 text = "100%" vertical_alignment = 1 -[node name="Ammo" type="Label" parent="."] +[node name="StaminaLevel" type="Label" parent="."] +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 256.0 +offset_top = -64.0 +offset_right = 381.0 +offset_bottom = -3.0 +grow_vertical = 0 +theme = SubResource("Theme_xn5t2") +theme_override_colors/font_color = Color(0.741176, 0.482353, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 6 +theme_override_fonts/font = ExtResource("1_pxloi") +theme_override_font_sizes/font_size = 49 +text = "100%" +vertical_alignment = 1 + +[node name="AmmoVisuals" type="HBoxContainer" parent="."] anchors_preset = 3 anchor_left = 1.0 anchor_top = 1.0 anchor_right = 1.0 anchor_bottom = 1.0 -offset_left = -232.0 -offset_top = -56.0 -offset_right = -16.0 -offset_bottom = 5.0 +offset_left = -486.0 +offset_top = -58.0 grow_horizontal = 0 grow_vertical = 0 + +[node name="LeftAmmo" type="Label" parent="AmmoVisuals"] +layout_mode = 2 theme = SubResource("Theme_xn5t2") theme_override_colors/font_color = Color(1, 1, 1, 1) theme_override_colors/font_outline_color = Color(0, 0, 0, 1) theme_override_constants/outline_size = 6 theme_override_fonts/font = ExtResource("1_pxloi") theme_override_font_sizes/font_size = 49 -text = "999/999" +text = "L: 999/999" horizontal_alignment = 2 vertical_alignment = 1 -[node name="StaminaLevel" type="Label" parent="."] -anchors_preset = 2 -anchor_top = 1.0 -anchor_bottom = 1.0 -offset_left = 256.0 -offset_top = -64.0 -offset_right = 381.0 -offset_bottom = -3.0 -grow_vertical = 0 +[node name="RightAmmo" type="Label" parent="AmmoVisuals"] +layout_mode = 2 theme = SubResource("Theme_xn5t2") -theme_override_colors/font_color = Color(0.741176, 0.482353, 0, 1) +theme_override_colors/font_color = Color(1, 1, 1, 1) theme_override_colors/font_outline_color = Color(0, 0, 0, 1) theme_override_constants/outline_size = 6 theme_override_fonts/font = ExtResource("1_pxloi") theme_override_font_sizes/font_size = 49 -text = "100%" +text = "R: 999/999" +horizontal_alignment = 2 vertical_alignment = 1 [node name="Time" type="Label" parent="."] diff --git a/level_generation.tscn b/level_generation.tscn index 00aebb74..dc3d6381 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -145,23 +145,32 @@ double_sided = false no_depth_test = true texture = ExtResource("10_alql8") -[node name="Shooting" type="Node3D" parent="TacticalMap/Entities/Player" node_paths=PackedStringArray("attack_cooldown", "reload_timer", "shoot_audio_player", "reload_audio_player")] +[node name="Shooting" type="Node3D" parent="TacticalMap/Entities/Player" node_paths=PackedStringArray("left_attack_cooldown", "right_attack_cooldown", "left_reload_timer", "right_reload_timer", "shoot_audio_player", "reload_audio_player")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.25, 0) script = ExtResource("11_6i2sa") bullet_damage = 25.0 bullet_line_scene = ExtResource("12_dip38") -attack_cooldown = NodePath("AttackCD") -reload_timer = NodePath("ReloadTime") +left_attack_cooldown = NodePath("Left_attack_cooldown") +right_attack_cooldown = NodePath("Right_attack_cooldown") +left_reload_timer = NodePath("Left_reload_timer") +right_reload_timer = NodePath("Right_reload_timer") player = NodePath("..") hud = NodePath("../../../../HUD") shoot_audio_player = NodePath("ShootAudio") shoot_audio_randomizer = SubResource("AudioStreamRandomizer_136pt") reload_audio_player = NodePath("ReloadAudio") -[node name="AttackCD" type="Timer" parent="TacticalMap/Entities/Player/Shooting"] +[node name="Left_attack_cooldown" type="Timer" parent="TacticalMap/Entities/Player/Shooting"] one_shot = true -[node name="ReloadTime" type="Timer" parent="TacticalMap/Entities/Player/Shooting"] +[node name="Left_reload_timer" type="Timer" parent="TacticalMap/Entities/Player/Shooting"] +wait_time = 5.0 +one_shot = true + +[node name="Right_attack_cooldown" type="Timer" parent="TacticalMap/Entities/Player/Shooting"] +one_shot = true + +[node name="Right_reload_timer" type="Timer" parent="TacticalMap/Entities/Player/Shooting"] wait_time = 5.0 one_shot = true @@ -198,7 +207,8 @@ transform = Transform3D(-0.946576, 0, -0.32248, 0, 1, 0, 0.32248, 0, -0.946576, [connection signal="update_doll" from="TacticalMap/Entities/Player" to="HUD" method="_on_player_update_doll"] [connection signal="update_stamina_HUD" from="TacticalMap/Entities/Player" to="HUD" method="_on_player_update_stamina_hud"] [connection signal="ammo_changed" from="TacticalMap/Entities/Player/Shooting" to="HUD" method="_on_shooting_ammo_changed"] -[connection signal="timeout" from="TacticalMap/Entities/Player/Shooting/ReloadTime" to="TacticalMap/Entities/Player/Shooting" method="_on_reload_time_timeout"] +[connection signal="timeout" from="TacticalMap/Entities/Player/Shooting/Left_reload_timer" to="TacticalMap/Entities/Player/Shooting" method="_on_reload_time_timeout"] +[connection signal="timeout" from="TacticalMap/Entities/Player/Shooting/Right_reload_timer" to="TacticalMap/Entities/Player/Shooting" method="_on_reload_time_timeout"] [connection signal="add_to_proximity_inventory" from="TacticalMap/Entities/Player/ItemDetector" to="HUD" method="_on_item_detector_add_to_proximity_inventory"] [connection signal="area_entered" from="TacticalMap/Entities/Player/ItemDetector" to="TacticalMap/Entities/Player/ItemDetector" method="_on_area_entered"] [connection signal="area_exited" from="TacticalMap/Entities/Player/ItemDetector" to="TacticalMap/Entities/Player/ItemDetector" method="_on_area_exited"] diff --git a/project.godot b/project.godot index 227f60df..65f59b44 100644 --- a/project.godot +++ b/project.godot @@ -81,11 +81,6 @@ right={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) ] } -click={ -"deadzone": 0.5, -"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(286, 8),"global_position":Vector2(290, 51),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) -] -} zoom_in={ "deadzone": 0.5, "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":8,"position":Vector2(120, 6),"global_position":Vector2(124, 49),"factor":1.0,"button_index":4,"canceled":false,"pressed":true,"double_click":false,"script":null) @@ -111,11 +106,6 @@ build_menu={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":66,"key_label":0,"unicode":98,"echo":false,"script":null) ] } -right_click={ -"deadzone": 0.5, -"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(124, 12),"global_position":Vector2(128, 55),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) -] -} reload_weapon={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"echo":false,"script":null) @@ -136,6 +126,16 @@ overmap={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":77,"key_label":0,"unicode":109,"echo":false,"script":null) ] } +click_left={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(130, 29),"global_position":Vector2(135, 79),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) +] +} +click_right={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(281, 16),"global_position":Vector2(286, 66),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) +] +} [layer_names] From 134fec61d9a8e02975b65ea1d2f2f358d2560ae1 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 24 Jan 2024 21:10:48 +0100 Subject: [PATCH 122/138] Basic dual wielding --- Scenes/InventoryWindow.tscn | 18 +++++++++ Scripts/BuildManager.gd | 2 +- Scripts/InventoryWindow.gd | 8 ++++ Scripts/PlayerShooting.gd | 81 +++++++++++++++++++++---------------- Scripts/hud.gd | 28 ++++++++++++- hud.tscn | 1 + level_generation.tscn | 5 ++- 7 files changed, 103 insertions(+), 40 deletions(-) diff --git a/Scenes/InventoryWindow.tscn b/Scenes/InventoryWindow.tscn index 84444b99..f227777a 100644 --- a/Scenes/InventoryWindow.tscn +++ b/Scenes/InventoryWindow.tscn @@ -77,6 +77,22 @@ properties = { "grid_position": Vector2i(0, 3) } +[node name="_Node_27438" type="Node" parent="InventoryGridStacked"] +script = ExtResource("5_qidb6") +protoset = ExtResource("3_sqsc0") +prototype_id = "rifle_m4a1" +properties = { +"grid_position": Vector2i(0, 4) +} + +[node name="_Node_28997" type="Node" parent="InventoryGridStacked"] +script = ExtResource("5_qidb6") +protoset = ExtResource("3_sqsc0") +prototype_id = "pistol_9mm" +properties = { +"grid_position": Vector2i(0, 6) +} + [node name="InventoryGridStackedProx" type="Node" parent="."] script = ExtResource("2_alcyo") size = Vector2i(12, 8) @@ -218,5 +234,7 @@ autowrap_mode = 3 [connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_exited"] [connection signal="item_mouse_entered" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_entered"] [connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_exited"] +[connection signal="cleared" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentSlot" to="." method="_on_left_hand_equipment_slot_cleared"] [connection signal="item_equipped" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentSlot" to="." method="_on_left_hand_equipment_slot_item_equipped"] +[connection signal="cleared" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentSlot" to="." method="_on_right_hand_equipment_slot_cleared"] [connection signal="item_equipped" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentSlot" to="." method="_on_right_hand_equipment_slot_item_equipped"] diff --git a/Scripts/BuildManager.gd b/Scripts/BuildManager.gd index f5b84154..eea9deb3 100644 --- a/Scripts/BuildManager.gd +++ b/Scripts/BuildManager.gd @@ -41,7 +41,7 @@ func _input(_event): # if get_node(player_path).check_if_visible(get_global_mouse_position()) && Vector2(get_node(player_path).global_position).distance_to(get_global_mouse_position()) <= build_range: # tile_map.set_cell(0, tile_map.local_to_map(get_global_mouse_position()), 0, Vector2i(9,3)) - if Input.is_action_pressed("right_click") && is_building: + if Input.is_action_pressed("click_right") && is_building: is_building = false General.is_allowed_to_shoot = true ghost_sprite.visible = false diff --git a/Scripts/InventoryWindow.gd b/Scripts/InventoryWindow.gd index 5dbf8e0a..abadfd5e 100644 --- a/Scripts/InventoryWindow.gd +++ b/Scripts/InventoryWindow.gd @@ -24,6 +24,7 @@ var is_showing_tooltip = false @export var tooltip_item_description : Label signal item_was_equipped(equippedItem: InventoryItem, slotName: String) +signal item_was_cleared(slotName: String) # Called when the node enters the scene tree for the first time. func _ready(): @@ -196,3 +197,10 @@ func _on_left_hand_equipment_slot_item_equipped(): func _on_right_hand_equipment_slot_item_equipped(): item_was_equipped.emit(RightHandEquipmentSlot.get_item(), "RightHand") + + +func _on_left_hand_equipment_slot_cleared(): + item_was_cleared.emit("LeftHand") + +func _on_right_hand_equipment_slot_cleared(): + item_was_cleared.emit("RightHand") diff --git a/Scripts/PlayerShooting.gd b/Scripts/PlayerShooting.gd index bf6212f1..512cfae7 100644 --- a/Scripts/PlayerShooting.gd +++ b/Scripts/PlayerShooting.gd @@ -1,13 +1,5 @@ extends Node3D -var weapon -var magazine -var ammo - -var current_ammo : int -var max_ammo : int - - # Define properties for left-hand and right-hand weapons. var left_hand_weapon @@ -51,7 +43,7 @@ var damage = 25 func _input(event): - if not weapon: + if not left_hand_weapon and not right_hand_weapon: return # Return early if no weapon is equipped if event.is_action_pressed("reload_weapon"): @@ -62,14 +54,14 @@ func _input(event): reload_right_weapon() # Handling left and right click for different weapons. - if event.is_action_pressed("click_left") and General.is_mouse_outside_HUD and General.is_allowed_to_shoot: - fire_weapon(left_hand_weapon, current_left_ammo, max_left_ammo, "left") + if event.is_action_pressed("click_left") and General.is_mouse_outside_HUD and General.is_allowed_to_shoot and left_hand_weapon: + fire_weapon(left_hand_weapon, current_left_ammo, "LeftHand") - if event.is_action_pressed("click_right") and General.is_mouse_outside_HUD and General.is_allowed_to_shoot: - fire_weapon(right_hand_weapon, current_right_ammo, max_right_ammo, "right") + if event.is_action_pressed("click_right") and General.is_mouse_outside_HUD and General.is_allowed_to_shoot and right_hand_weapon: + fire_weapon(right_hand_weapon, current_right_ammo, "RightHand") # New function to handle firing logic for a weapon. -func fire_weapon(weapon, current_ammo, max_ammo, hand): +func fire_weapon(weapon, current_ammo, hand): if not weapon or current_ammo <= 0: return # Return if no weapon is equipped or no ammo. @@ -78,10 +70,10 @@ func fire_weapon(weapon, current_ammo, max_ammo, hand): if cooldown_timer.is_stopped() and reload_timer_is_stopped(hand): cooldown_timer.start() # Update ammo and emit signal. - if hand == "left": + if hand == "LeftHand": current_left_ammo -= 1 ammo_changed.emit(current_left_ammo, max_left_ammo, true) - elif hand == "right": + elif hand == "RightHand": current_right_ammo -= 1 ammo_changed.emit(current_right_ammo, max_right_ammo, false) @@ -108,14 +100,14 @@ func fire_weapon(weapon, current_ammo, max_ammo, hand): # Helper function to get the appropriate cooldown timer based on the hand. func get_cooldown_timer(hand: String) -> Timer: - if hand == "left": + if hand == "LeftHand": return left_attack_cooldown else: return right_attack_cooldown # Helper function to check if reload timer is stopped based on the hand. func reload_timer_is_stopped(hand: String) -> bool: - if hand == "left": + if hand == "LeftHand": return left_reload_timer.is_stopped() else: return right_reload_timer.is_stopped() @@ -125,52 +117,46 @@ func reload_timer_is_stopped(hand: String) -> bool: # We check that the right reload timer is stopped func reload_left_weapon(): if right_reload_timer.is_stopped(): - # Logic to reload left-hand weapon. current_left_ammo = max_left_ammo left_reload_timer.start() # Start the left reload timer - ammo_changed.emit(current_left_ammo, max_left_ammo, true) + get_node(hud).start_progress_bar(left_reload_timer.time_left) # Start HUD progress bar for left-hand weapon # Called when the right weapon is reloaded # Since only one reload action can run at a time, # We check that the left reload timer is stopped func reload_right_weapon(): if left_reload_timer.is_stopped(): - # Logic to reload right-hand weapon. current_right_ammo = max_right_ammo right_reload_timer.start() # Start the right reload timer - ammo_changed.emit(current_right_ammo, max_right_ammo, false) - + get_node(hud).start_progress_bar(right_reload_timer.time_left) # Start HUD progress bar for right-hand weapon # Called when the node enters the scene tree for the first time. func _ready(): - # Initialize without assigning a default weapon, magazine, or ammo. - weapon = null - magazine = null - ammo = null - current_ammo = 0 - max_ammo = 0 - + clear_weapon_properties("LeftHand") + clear_weapon_properties("RightHand") # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): # Check if the left-hand weapon is reloading. - if left_reload_timer.is_started() and not left_reload_timer.is_stopped() and left_reload_timer.time_left <= reload_audio_player.stream.get_length() and not reload_audio_player.playing: + if not left_reload_timer.is_stopped() and left_reload_timer.time_left <= reload_audio_player.stream.get_length() and not reload_audio_player.playing: reload_audio_player.play() # Play reload sound for left-hand weapon. # Check if the right-hand weapon is reloading. - if right_reload_timer.is_started() and not right_reload_timer.is_stopped() and right_reload_timer.time_left <= reload_audio_player.stream.get_length() and not reload_audio_player.playing: + if not right_reload_timer.is_stopped() and right_reload_timer.time_left <= reload_audio_player.stream.get_length() and not reload_audio_player.playing: reload_audio_player.play() # Play reload sound for right-hand weapon. + # The weapon is reloaded once the timer has stopped -func _on_reload_time_timeout(): - if left_reload_timer.is_stopped() and left_hand_weapon: +func _on_left_reload_time_timeout(): + if left_hand_weapon: current_left_ammo = max_left_ammo ammo_changed.emit(current_left_ammo, max_left_ammo, true) - if right_reload_timer.is_stopped() and right_hand_weapon: +func _on_right_reload_time_timeout(): + if right_hand_weapon: current_right_ammo = max_right_ammo ammo_changed.emit(current_right_ammo, max_right_ammo, false) @@ -192,12 +178,14 @@ func _on_hud_item_was_equipped(equippedItem: InventoryItem, slotName: String): left_hand_ammo = Gamedata.get_data_by_id(Gamedata.data.items, newAmmoID) max_left_ammo = int(left_hand_magazine.Magazine["max_ammo"]) current_left_ammo = max_left_ammo + ammo_changed.emit(current_left_ammo, max_left_ammo, true) elif slotName == "RightHand": right_hand_weapon = weaponData right_hand_magazine = Gamedata.get_data_by_id(Gamedata.data.items, newMagazineID) right_hand_ammo = Gamedata.get_data_by_id(Gamedata.data.items, newAmmoID) max_right_ammo = int(right_hand_magazine.Magazine["max_ammo"]) current_right_ammo = max_right_ammo + ammo_changed.emit(current_right_ammo, max_right_ammo, false) # Check for two-handed weapon and adjust accordingly. if weaponData.Ranged.two_handed: if slotName == "LeftHand": @@ -212,9 +200,32 @@ func _on_hud_item_was_equipped(equippedItem: InventoryItem, slotName: String): left_hand_ammo = null current_left_ammo = 0 max_left_ammo = 0 + ammo_changed.emit(-1,-1, false) elif slotName == "RightHand": right_hand_weapon = null right_hand_magazine = null right_hand_ammo = null current_right_ammo = 0 max_right_ammo = 0 + ammo_changed.emit(-1,-1, true) + +# Called when an equipment slot was cleared +# slotName can be "LeftHand" or "RightHand" +func _on_hud_item_equipment_slot_was_cleared(slotName): + clear_weapon_properties(slotName) + +# Function to clear weapon properties for a specified hand +func clear_weapon_properties(hand: String): + if hand == "LeftHand": + left_hand_weapon = null + left_hand_magazine = null + left_hand_ammo = null + current_left_ammo = 0 + max_left_ammo = 0 + elif hand == "RightHand": + right_hand_weapon = null + right_hand_magazine = null + right_hand_ammo = null + current_right_ammo = 0 + max_right_ammo = 0 + ammo_changed.emit(-1, -1, hand == "LeftHand") # Emit signal to indicate no weapon is equipped diff --git a/Scripts/hud.gd b/Scripts/hud.gd index e952b2e4..5cd3815f 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -34,6 +34,7 @@ var is_progress_bar_well_progressing_i_guess = false signal construction_chosen signal item_was_equipped(equippedItem: InventoryItem, slotName: String) +signal item_equipment_slot_was_cleared(slotName: String) @@ -41,7 +42,16 @@ signal item_was_equipped(equippedItem: InventoryItem, slotName: String) func test(): print("TESTING 123 123!") + +func _process(_delta): + if is_progress_bar_well_progressing_i_guess: + update_progress_bar() + +func update_progress_bar(): + var progressBarNode = get_node(progress_bar_filling) + var timerNode = get_node(progress_bar_timer) + progressBarNode.scale.x = lerp(1, 0, timerNode.time_left / progress_bar_timer_max_time) func _input(event): if event.is_action_pressed("build_menu"): @@ -172,8 +182,18 @@ func interrupt_progress_bar(): func _on_progress_bar_timer_timeout(): interrupt_progress_bar() -func _on_shooting_ammo_changed(current_ammo: int, max_ammo: int): - get_node(ammo_HUD_left).text = str(current_ammo) + "/" + str(max_ammo) +func _on_shooting_ammo_changed(current_ammo: int, max_ammo: int, leftHand:bool): + var ammo_HUD: Label = get_node(ammo_HUD_left) + var prefix: String = "L: " + if !leftHand: + ammo_HUD = get_node(ammo_HUD_right) + prefix = "R: " + if current_ammo == -1 and max_ammo == -1: # Assuming -1 is the value when no weapon is equipped + ammo_HUD.hide() + else: + ammo_HUD.text = prefix + str(current_ammo) + "/" + str(max_ammo) + ammo_HUD.show() + # Called when the users presses the travel button on the overmap # We save the player inventory to a autoload singleton so we can load it on the next map @@ -191,3 +211,7 @@ func _on_item_detector_remove_from_proximity_inventory(container): # When an item in the inventorywindow was equipped, we pass on the signal func _on_inventory_window_item_was_equipped(equippedItem, slotName): item_was_equipped.emit(equippedItem, slotName) + +# slotName can be "LeftHand" or "RightHand" +func _on_inventory_window_item_was_cleared(slotName: String): + item_equipment_slot_was_cleared.emit(slotName) diff --git a/hud.tscn b/hud.tscn index 4d644f6f..918fd865 100644 --- a/hud.tscn +++ b/hud.tscn @@ -347,4 +347,5 @@ visible = false [connection signal="start_craft" from="CraftingMenu" to="." method="_on_crafting_menu_start_craft"] [connection signal="pressed" from="CraftingMenu/Panel/StartCraftingButton" to="CraftingMenu" method="_on_start_crafting_button_pressed"] [connection signal="change_level_pressed" from="Overmap" to="." method="_on_overmap_change_level_pressed"] +[connection signal="item_was_cleared" from="InventoryWindow" to="." method="_on_inventory_window_item_was_cleared"] [connection signal="item_was_equipped" from="InventoryWindow" to="." method="_on_inventory_window_item_was_equipped"] diff --git a/level_generation.tscn b/level_generation.tscn index dc3d6381..a3c22fd5 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -207,11 +207,12 @@ transform = Transform3D(-0.946576, 0, -0.32248, 0, 1, 0, 0.32248, 0, -0.946576, [connection signal="update_doll" from="TacticalMap/Entities/Player" to="HUD" method="_on_player_update_doll"] [connection signal="update_stamina_HUD" from="TacticalMap/Entities/Player" to="HUD" method="_on_player_update_stamina_hud"] [connection signal="ammo_changed" from="TacticalMap/Entities/Player/Shooting" to="HUD" method="_on_shooting_ammo_changed"] -[connection signal="timeout" from="TacticalMap/Entities/Player/Shooting/Left_reload_timer" to="TacticalMap/Entities/Player/Shooting" method="_on_reload_time_timeout"] -[connection signal="timeout" from="TacticalMap/Entities/Player/Shooting/Right_reload_timer" to="TacticalMap/Entities/Player/Shooting" method="_on_reload_time_timeout"] +[connection signal="timeout" from="TacticalMap/Entities/Player/Shooting/Left_reload_timer" to="TacticalMap/Entities/Player/Shooting" method="_on_left_reload_time_timeout"] +[connection signal="timeout" from="TacticalMap/Entities/Player/Shooting/Right_reload_timer" to="TacticalMap/Entities/Player/Shooting" method="_on_right_reload_time_timeout"] [connection signal="add_to_proximity_inventory" from="TacticalMap/Entities/Player/ItemDetector" to="HUD" method="_on_item_detector_add_to_proximity_inventory"] [connection signal="area_entered" from="TacticalMap/Entities/Player/ItemDetector" to="TacticalMap/Entities/Player/ItemDetector" method="_on_area_entered"] [connection signal="area_exited" from="TacticalMap/Entities/Player/ItemDetector" to="TacticalMap/Entities/Player/ItemDetector" method="_on_area_exited"] [connection signal="remove_from_proximity_inventory" from="TacticalMap/Entities/Player/ItemDetector" to="HUD" method="_on_item_detector_remove_from_proximity_inventory"] [connection signal="construction_chosen" from="HUD" to="TacticalMap/BuildManager" method="_on_hud_construction_chosen"] +[connection signal="item_equipment_slot_was_cleared" from="HUD" to="TacticalMap/Entities/Player/Shooting" method="_on_hud_item_equipment_slot_was_cleared"] [connection signal="item_was_equipped" from="HUD" to="TacticalMap/Entities/Player/Shooting" method="_on_hud_item_was_equipped"] From 3888d220423c12afaff39d86494e47406276c797 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 25 Jan 2024 19:19:59 +0100 Subject: [PATCH 123/138] two handed weapons clear the other hand slot --- ItemProtosets.tres | 2 + Mods/Core/Items/Items.json | 4 +- .../Custom_Editors/ItemEditor/ItemEditor.tscn | 12 +++++- .../ItemEditor/ItemRangedEditor.tscn | 12 +----- Scripts/InventoryWindow.gd | 40 ++++++++++++++++--- Scripts/ItemEditor.gd | 4 ++ Scripts/ItemRangedEditor.gd | 6 +-- Scripts/PlayerShooting.gd | 6 --- 8 files changed, 55 insertions(+), 31 deletions(-) diff --git a/ItemProtosets.tres b/ItemProtosets.tres index 4645cc17..910fd61e 100644 --- a/ItemProtosets.tres +++ b/ItemProtosets.tres @@ -81,6 +81,7 @@ json_data = "[ \"name\": \"Pistol 9mm\", \"sprite\": \"pistol_64.png\", \"stack_size\": \"1\", + \"two_handed\": false, \"weight\": \"2\", \"width\": \"2\" }, @@ -104,6 +105,7 @@ json_data = "[ \"name\": \"M4a1 rifle\", \"sprite\": \"rifle_128_64.png\", \"stack_size\": \"1\", + \"two_handed\": true, \"weight\": \"4\", \"width\": \"4\" } diff --git a/Mods/Core/Items/Items.json b/Mods/Core/Items/Items.json index 1b3394c4..34ba4acc 100644 --- a/Mods/Core/Items/Items.json +++ b/Mods/Core/Items/Items.json @@ -63,7 +63,6 @@ "reload_speed": "2.5", "spread": "5", "sway": "5", - "two_handed": false, "used_ammo": "9mm", "used_magazine": "pistol_magazine", "used_skill": "short_guns" @@ -76,6 +75,7 @@ "name": "Pistol 9mm", "sprite": "pistol_64.png", "stack_size": "1", + "two_handed": false, "weight": "2", "width": "2" }, @@ -87,7 +87,6 @@ "reload_speed": "2.5", "spread": "8", "sway": "5", - "two_handed": true, "used_ammo": "9mm", "used_magazine": "pistol_magazine", "used_skill": "short_guns" @@ -100,6 +99,7 @@ "name": "M4a1 rifle", "sprite": "rifle_128_64.png", "stack_size": "1", + "two_handed": true, "weight": "4", "width": "4" } diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn index aad0ead9..60c1a238 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn @@ -7,7 +7,7 @@ [ext_resource type="PackedScene" uid="uid://27f4k2pq2odn" path="res://Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn" id="4_x8xa3"] [ext_resource type="PackedScene" uid="uid://c2uiumyeepree" path="res://Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn" id="5_mr1dn"] -[node name="ItemEditor" type="Control" node_paths=PackedStringArray("tabContainer", "itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector", "WidthNumberBox", "HeightNumberBox", "WeightNumberBox", "StackSizeNumberBox", "MaxStackSizeNumberBox", "typesContainer")] +[node name="ItemEditor" type="Control" node_paths=PackedStringArray("tabContainer", "itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector", "WidthNumberBox", "HeightNumberBox", "WeightNumberBox", "StackSizeNumberBox", "MaxStackSizeNumberBox", "typesContainer", "TwoHandedCheckBox")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -28,6 +28,7 @@ WeightNumberBox = NodePath("VBoxContainer/TabContainer/Basic/WeightNumber") StackSizeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/StackSizeNumber") MaxStackSizeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/MaxStackSizeNumber") typesContainer = NodePath("VBoxContainer/TabContainer/Basic/TypesContainer") +TwoHandedCheckBox = NodePath("VBoxContainer/TabContainer/Basic/TwoHandedCheckBox") [node name="VBoxContainer" type="VBoxContainer" parent="."] layout_mode = 1 @@ -169,6 +170,15 @@ tooltip_text = "The maximum number of this item that will fit in a stack" min_value = 1.0 value = 1.0 +[node name="TwoHandedLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +text = "Two handed" + +[node name="TwoHandedCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Basic"] +layout_mode = 2 +tooltip_text = "Enable this if the item weapon occupies both hands when held. Disable this if the item occupies one hand when held" +text = "Two handed" + [node name="TypesLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 text = "Type(s)" diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn index aadaacf4..219f960d 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemRangedEditor.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://Scripts/ItemRangedEditor.gd" id="1_my1v7"] -[node name="ItemRangedEditor" type="Control" node_paths=PackedStringArray("UsedAmmoTextEdit", "UsedMagazineTextEdit", "RangeNumberBox", "SpreadNumberBox", "SwayNumberBox", "RecoilNumberBox", "UsedSkillTextEdit", "ReloadSpeedNumberBox", "FiringSpeedNumberBox", "TwoHandedCheckBox")] +[node name="ItemRangedEditor" type="Control" node_paths=PackedStringArray("UsedAmmoTextEdit", "UsedMagazineTextEdit", "RangeNumberBox", "SpreadNumberBox", "SwayNumberBox", "RecoilNumberBox", "UsedSkillTextEdit", "ReloadSpeedNumberBox", "FiringSpeedNumberBox")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -19,7 +19,6 @@ RecoilNumberBox = NodePath("Ranged/RecoilNumber") UsedSkillTextEdit = NodePath("Ranged/UsedSkillTextEdit") ReloadSpeedNumberBox = NodePath("Ranged/ReloadSpeedNumber") FiringSpeedNumberBox = NodePath("Ranged/FiringSpeedNumber") -TwoHandedCheckBox = NodePath("Ranged/TwoHandedCheckBox") [node name="Ranged" type="GridContainer" parent="."] layout_mode = 1 @@ -131,12 +130,3 @@ tooltip_text = "The maximum number of this item that will fit in a stack" min_value = 0.01 step = 0.01 value = 0.25 - -[node name="TwoHandedLabel" type="Label" parent="Ranged"] -layout_mode = 2 -text = "Two handed" - -[node name="TwoHandedCheckBox" type="CheckBox" parent="Ranged"] -layout_mode = 2 -tooltip_text = "Enable this if the ranged weapon occupies both hands. Disable this if the equipped weapon occupies one hand" -text = "Two handed" diff --git a/Scripts/InventoryWindow.gd b/Scripts/InventoryWindow.gd index abadfd5e..028e6545 100644 --- a/Scripts/InventoryWindow.gd +++ b/Scripts/InventoryWindow.gd @@ -191,16 +191,44 @@ func remove_container_from_list(container: Node3D): proximity_inventory_control.visible = false +# This function is called when an item is equipped in the left hand equipment slot func _on_left_hand_equipment_slot_item_equipped(): - item_was_equipped.emit(LeftHandEquipmentSlot.get_item(), "LeftHand") - - + var equipped_item_left = LeftHandEquipmentSlot.get_item() + var equipped_item_right = RightHandEquipmentSlot.get_item() + # If we have a weapon in the right hand and it's a two handed weapon, + # We clear the left handed slot again + if equipped_item_right and equipped_item_right.get_property("two_handed", false): + LeftHandEquipmentSlot.clear() + item_was_cleared.emit("LeftHand") + return + # If the weapon we equip is a two handed weapon, clear the weapon in the other weapon slot + if equipped_item_left and equipped_item_left.get_property("two_handed", false): + # If the item is two-handed, clear the right hand slot + RightHandEquipmentSlot.clear() + item_was_cleared.emit("RightHand") + item_was_equipped.emit(equipped_item_left, "LeftHand") + +# This function is called when an item is equipped in the right hand equipment slot func _on_right_hand_equipment_slot_item_equipped(): - item_was_equipped.emit(RightHandEquipmentSlot.get_item(), "RightHand") - - + var equipped_item_left = LeftHandEquipmentSlot.get_item() + var equipped_item_right = RightHandEquipmentSlot.get_item() + # If we have a weapon in the left hand and it's a two handed weapon, + # We clear the right handed slot again + if equipped_item_left and equipped_item_left.get_property("two_handed", false): + RightHandEquipmentSlot.clear() + item_was_cleared.emit("RightHand") + return + elif equipped_item_right and equipped_item_right.get_property("two_handed", false): + # If the item is two-handed, clear the left hand slot + LeftHandEquipmentSlot.clear() + item_was_cleared.emit("LeftHand") + item_was_equipped.emit(equipped_item_right, "RightHand") + + +# This function is called when an item is removed from the left hand equipment slot func _on_left_hand_equipment_slot_cleared(): item_was_cleared.emit("LeftHand") +# This function is called when an item is removed from the right hand equipment slot func _on_right_hand_equipment_slot_cleared(): item_was_cleared.emit("RightHand") diff --git a/Scripts/ItemEditor.gd b/Scripts/ItemEditor.gd index 021e9db2..ab3f3fb1 100644 --- a/Scripts/ItemEditor.gd +++ b/Scripts/ItemEditor.gd @@ -30,6 +30,7 @@ extends Control @export var MaxStackSizeNumberBox: SpinBox = null @export var typesContainer: HFlowContainer = null +@export var TwoHandedCheckBox: CheckBox = null @@ -71,6 +72,8 @@ func load_item_data() -> void: StackSizeNumberBox.get_line_edit().text = contentData["stack_size"] if MaxStackSizeNumberBox != null and contentData.has("max_stack_size"): MaxStackSizeNumberBox.get_line_edit().text = contentData["max_stack_size"] + if TwoHandedCheckBox != null and contentData.has("two_handed"): + TwoHandedCheckBox.button_pressed = contentData["two_handed"] # Loop through typesContainer children to load additional properties and set button_pressed for i in range(typesContainer.get_child_count()): @@ -104,6 +107,7 @@ func _on_save_button_button_up() -> void: contentData["weight"] = WeightNumberBox.get_line_edit().text contentData["stack_size"] = StackSizeNumberBox.get_line_edit().text contentData["max_stack_size"] = MaxStackSizeNumberBox.get_line_edit().text + contentData["two_handed"] = TwoHandedCheckBox.button_pressed # Loop through typesContainer children to save additional properties for i in range(typesContainer.get_child_count()): diff --git a/Scripts/ItemRangedEditor.gd b/Scripts/ItemRangedEditor.gd index c43e2671..952da4d0 100644 --- a/Scripts/ItemRangedEditor.gd +++ b/Scripts/ItemRangedEditor.gd @@ -13,7 +13,6 @@ extends Control @export var UsedSkillTextEdit: TextEdit = null @export var ReloadSpeedNumberBox: SpinBox = null @export var FiringSpeedNumberBox: SpinBox = null -@export var TwoHandedCheckBox: CheckBox = null func get_properties() -> Dictionary: return { @@ -25,8 +24,7 @@ func get_properties() -> Dictionary: "recoil": RecoilNumberBox.get_line_edit().text, "used_skill": UsedSkillTextEdit.text, "reload_speed": ReloadSpeedNumberBox.get_line_edit().text, - "firing_speed": FiringSpeedNumberBox.get_line_edit().text, - "two_handed": TwoHandedCheckBox.button_pressed + "firing_speed": FiringSpeedNumberBox.get_line_edit().text } func set_properties(properties: Dictionary) -> void: @@ -48,5 +46,3 @@ func set_properties(properties: Dictionary) -> void: ReloadSpeedNumberBox.get_line_edit().text = properties["reload_speed"] if properties.has("firing_speed"): FiringSpeedNumberBox.get_line_edit().text = properties["firing_speed"] - if properties.has("two_handed"): - TwoHandedCheckBox.button_pressed = properties["two_handed"] diff --git a/Scripts/PlayerShooting.gd b/Scripts/PlayerShooting.gd index 512cfae7..df0c608c 100644 --- a/Scripts/PlayerShooting.gd +++ b/Scripts/PlayerShooting.gd @@ -186,12 +186,6 @@ func _on_hud_item_was_equipped(equippedItem: InventoryItem, slotName: String): max_right_ammo = int(right_hand_magazine.Magazine["max_ammo"]) current_right_ammo = max_right_ammo ammo_changed.emit(current_right_ammo, max_right_ammo, false) - # Check for two-handed weapon and adjust accordingly. - if weaponData.Ranged.two_handed: - if slotName == "LeftHand": - right_hand_weapon = null # Clear the right hand if a two-handed weapon is equipped in the left hand. - elif slotName == "RightHand": - left_hand_weapon = null # Clear the left hand if a two-handed weapon is equipped in the right hand. else: # Reset weapon, magazine, and ammo if the equipped item is not a weapon. if slotName == "LeftHand": From cd84ae2272138d686e5fd18514cb2c532bebe38e Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 25 Jan 2024 22:54:37 +0100 Subject: [PATCH 124/138] Switch to list based inventory instead of grid --- Defaults/Mobs/mob_corpse.tscn | 9 +- ItemProtosets.tres | 10 +- Mods/Core/Items/Items.json | 8 +- Mods/Core/Items/pistol_32.png | Bin 0 -> 1291 bytes ...tol_64.png.import => pistol_32.png.import} | 8 +- Mods/Core/Items/pistol_64.png | Bin 2902 -> 0 bytes Mods/Core/Items/plank.png | Bin 764 -> 2633 bytes Mods/Core/Items/rifle_128_64.png | Bin 5209 -> 0 bytes Mods/Core/Items/rifle_64_32.png | Bin 0 -> 1738 bytes ...8_64.png.import => rifle_64_32.png.import} | 8 +- Mods/Core/Items/steel_scrap.png | Bin 2207 -> 2812 bytes .../Custom_Editors/ItemEditor/ItemEditor.tscn | 6 - Scenes/ContentManager/Scripts/content_list.gd | 2 +- Scenes/InventoryWindow.tscn | 131 +++++++++--------- Scripts/InventoryWindow.gd | 33 +++-- Scripts/ItemEditor.gd | 2 +- Scripts/hud.gd | 2 +- Textures/steel_scrap.png | Bin 2207 -> 2812 bytes hud.tscn | 7 +- 19 files changed, 121 insertions(+), 105 deletions(-) create mode 100644 Mods/Core/Items/pistol_32.png rename Mods/Core/Items/{pistol_64.png.import => pistol_32.png.import} (68%) delete mode 100644 Mods/Core/Items/pistol_64.png delete mode 100644 Mods/Core/Items/rifle_128_64.png create mode 100644 Mods/Core/Items/rifle_64_32.png rename Mods/Core/Items/{rifle_128_64.png.import => rifle_64_32.png.import} (67%) diff --git a/Defaults/Mobs/mob_corpse.tscn b/Defaults/Mobs/mob_corpse.tscn index 662defea..1c4dfb37 100644 --- a/Defaults/Mobs/mob_corpse.tscn +++ b/Defaults/Mobs/mob_corpse.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=6 format=3 uid="uid://mu6nbyuq02o5"] [ext_resource type="Script" path="res://Scripts/container.gd" id="1_4celg"] +[ext_resource type="Script" path="res://addons/gloot/core/inventory_stacked.gd" id="2_3htey"] [ext_resource type="Texture2D" uid="uid://cy56wx4qynp3m" path="res://Textures/enemy.png" id="2_pvjek"] -[ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="3_131gg"] [ext_resource type="Resource" uid="uid://b1tngttyk4w2s" path="res://ItemProtosets.tres" id="4_ehn4b"] [sub_resource type="SphereShape3D" id="SphereShape3D_0pnwx"] @@ -10,11 +10,10 @@ radius = 0.2 [node name="Node3D" type="Node3D" groups=["Containers"]] script = ExtResource("1_4celg") -inventory = NodePath("InventoryGridStacked") +inventory = NodePath("InventoryStacked") -[node name="InventoryGridStacked" type="Node" parent="."] -script = ExtResource("3_131gg") -size = Vector2i(12, 8) +[node name="InventoryStacked" type="Node" parent="."] +script = ExtResource("2_3htey") item_protoset = ExtResource("4_ehn4b") [node name="Sprite3D" type="Sprite3D" parent="."] diff --git a/ItemProtosets.tres b/ItemProtosets.tres index 910fd61e..360bafaf 100644 --- a/ItemProtosets.tres +++ b/ItemProtosets.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="ItemProtoset" load_steps=2 format=3 uid="uid://b1tngttyk4w2s"] +[gd_resource type="Resource" script_class="ItemProtoset" load_steps=2 format=3] [ext_resource type="Script" path="res://addons/gloot/core/item_protoset.gd" id="1_o35lu"] @@ -76,10 +76,10 @@ json_data = "[ \"description\": \"A standard issue pistol that uses 9mm ammunition\", \"height\": \"2\", \"id\": \"pistol_9mm\", - \"image\": \"./Mods/Core/Items/pistol_64.png\", + \"image\": \"./Mods/Core/Items/pistol_32.png\", \"max_stack_size\": \"1\", \"name\": \"Pistol 9mm\", - \"sprite\": \"pistol_64.png\", + \"sprite\": \"pistol_32.png\", \"stack_size\": \"1\", \"two_handed\": false, \"weight\": \"2\", @@ -100,10 +100,10 @@ json_data = "[ \"description\": \"A standard issue rifle that uses 9mm ammunition\", \"height\": \"2\", \"id\": \"rifle_m4a1\", - \"image\": \"./Mods/Core/Items/rifle_128_64.png\", + \"image\": \"./Mods/Core/Items/rifle_64_32.png\", \"max_stack_size\": \"1\", \"name\": \"M4a1 rifle\", - \"sprite\": \"rifle_128_64.png\", + \"sprite\": \"rifle_64_32.png\", \"stack_size\": \"1\", \"two_handed\": true, \"weight\": \"4\", diff --git a/Mods/Core/Items/Items.json b/Mods/Core/Items/Items.json index 34ba4acc..fb027b15 100644 --- a/Mods/Core/Items/Items.json +++ b/Mods/Core/Items/Items.json @@ -70,10 +70,10 @@ "description": "A standard issue pistol that uses 9mm ammunition", "height": "2", "id": "pistol_9mm", - "image": "./Mods/Core/Items/pistol_64.png", + "image": "./Mods/Core/Items/pistol_32.png", "max_stack_size": "1", "name": "Pistol 9mm", - "sprite": "pistol_64.png", + "sprite": "pistol_32.png", "stack_size": "1", "two_handed": false, "weight": "2", @@ -94,10 +94,10 @@ "description": "A standard issue rifle that uses 9mm ammunition", "height": "2", "id": "rifle_m4a1", - "image": "./Mods/Core/Items/rifle_128_64.png", + "image": "./Mods/Core/Items/rifle_64_32.png", "max_stack_size": "1", "name": "M4a1 rifle", - "sprite": "rifle_128_64.png", + "sprite": "rifle_64_32.png", "stack_size": "1", "two_handed": true, "weight": "4", diff --git a/Mods/Core/Items/pistol_32.png b/Mods/Core/Items/pistol_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b42af2696605c849ed0f39385b7b4837fdfdca04 GIT binary patch literal 1291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=G_YAk0{w55h!W6e$o~-pb#%e$QdY7l*j;~GXB2@d7c|25uBWwm&yPppDM;q0}2a+goD5y zLRg|_VCEU}yM%#(d6K7#V@QPi+px3VA%PP&+{@C_nP$`K5?Ss`iprIv(9gk&`nNCdUWN~DX*?yhYuevZ{2Wi zW!As8tGl+J=Q?n%PvBs}1l75IpJl#sn((oGwUjkkzg|$pb?37Ji)SXjhi6{C4c3%<;#~dpH<#|+qOH}Qjlv_+6iYx|BWw|Zmo}y z=W2D@-sz(^J=ozHE02ih{rfv!jyjEXxw`5k}|f|rEsW+M_;}YKbF!j@!{}Sp~gf}ekvUMwJNn9b8AG(%nPmiXvI-}7apARjkLd4tJ z*dFb`JVECJF?*B{{A14#!a;j*09(t)lhj-va~gd?{Vz zuT!h_m21ViMgO$h=4CGUWX<Y2C>gS&MlmD;$wGu-wRG{%w9bF!M5a My85}Sb4q9e052;j#Q*>R literal 0 HcmV?d00001 diff --git a/Mods/Core/Items/pistol_64.png.import b/Mods/Core/Items/pistol_32.png.import similarity index 68% rename from Mods/Core/Items/pistol_64.png.import rename to Mods/Core/Items/pistol_32.png.import index 7bad1fae..7bc8e2d3 100644 --- a/Mods/Core/Items/pistol_64.png.import +++ b/Mods/Core/Items/pistol_32.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://hktpdnah1cbg" -path="res://.godot/imported/pistol_64.png-feaeec3d09921e141e026bd860429ada.ctex" +uid="uid://jk28o4rmnbkx" +path="res://.godot/imported/pistol_32.png-21ecb4834f397de0a205dcb99066d31f.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://Mods/Core/Items/pistol_64.png" -dest_files=["res://.godot/imported/pistol_64.png-feaeec3d09921e141e026bd860429ada.ctex"] +source_file="res://Mods/Core/Items/pistol_32.png" +dest_files=["res://.godot/imported/pistol_32.png-21ecb4834f397de0a205dcb99066d31f.ctex"] [params] diff --git a/Mods/Core/Items/pistol_64.png b/Mods/Core/Items/pistol_64.png deleted file mode 100644 index 4091748ce5917e2e92288ddce0863fdd90bcb151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2902 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 B6pa7? diff --git a/Mods/Core/Items/rifle_64_32.png b/Mods/Core/Items/rifle_64_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d052f826ec1c81c530c6f19e999f5119f388e5a5 GIT binary patch literal 1738 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 diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn index 60c1a238..b1fa23a0 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn @@ -226,11 +226,6 @@ layout_mode = 2 tooltip_text = "If this is checked, the item can be disassembled and disassembly tab will be visible. Otherwise, this item cannot be disassembled and the disassembly tab will not be visible" text = "Disassemble" -[node name="ContainerCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] -layout_mode = 2 -tooltip_text = "If this is checked, the item can contain items and the container tab will be visible. Otherwise, this item cannot contain items and the container tab will not be visible" -text = "Container" - [node name="ClothingCheck" type="CheckBox" parent="VBoxContainer/TabContainer/Basic/TypesContainer"] layout_mode = 2 tooltip_text = "If this is checked, the item functions as clothing and the clothing properties tab will be visible. Otherwise, this item will not function as clothing and the clothing properties tab will not be visible" @@ -267,7 +262,6 @@ visible = false [connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/BookCheck" to="." method="_on_type_check_button_up"] [connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/CraftableCheck" to="." method="_on_type_check_button_up"] [connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/DisassembleCheck" to="." method="_on_type_check_button_up"] -[connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/ContainerCheck" to="." method="_on_type_check_button_up"] [connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/ClothingCheck" to="." method="_on_type_check_button_up"] [connection signal="button_up" from="VBoxContainer/TabContainer/Basic/TypesContainer/Food" to="." method="_on_type_check_button_up"] [connection signal="sprite_selected_ok" from="Sprite_selector" to="." method="_on_sprite_selector_sprite_selected_ok"] diff --git a/Scenes/ContentManager/Scripts/content_list.gd b/Scenes/ContentManager/Scripts/content_list.gd index 51042c7d..f5666951 100644 --- a/Scenes/ContentManager/Scripts/content_list.gd +++ b/Scenes/ContentManager/Scripts/content_list.gd @@ -52,7 +52,7 @@ func make_item_list(): var item_index: int = contentItems.add_item(item_id) contentItems.set_item_metadata(item_index, item_id) - if item.has("sprite"): + if item.has("sprite") and contentData.sprites.has(item["sprite"]): var mySprite: Resource = contentData.sprites[item["sprite"]] if mySprite is BaseMaterial3D: contentItems.set_item_icon(item_index,mySprite.albedo_texture) diff --git a/Scenes/InventoryWindow.tscn b/Scenes/InventoryWindow.tscn index f227777a..acfa5569 100644 --- a/Scenes/InventoryWindow.tscn +++ b/Scenes/InventoryWindow.tscn @@ -1,16 +1,16 @@ [gd_scene load_steps=14 format=3 uid="uid://e0ebcv1n8jnq"] [ext_resource type="Script" path="res://Scripts/InventoryWindow.gd" id="1_7kqbx"] -[ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="2_alcyo"] [ext_resource type="PackedScene" uid="uid://crck2fhgayxhn" path="res://Scenes/InventoryContainerListItem.tscn" id="2_xfgb3"] +[ext_resource type="Script" path="res://addons/gloot/core/inventory_stacked.gd" id="3_l8xgt"] [ext_resource type="Resource" uid="uid://b1tngttyk4w2s" path="res://ItemProtosets.tres" id="3_sqsc0"] -[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_grid_ex.gd" id="4_8j4xb"] [ext_resource type="Script" path="res://addons/gloot/core/inventory_item.gd" id="5_qidb6"] -[ext_resource type="Texture2D" uid="uid://cwmsngeoc631h" path="res://Textures/Screenshot_167.png" id="5_wixd1"] [ext_resource type="FontFile" uid="uid://chm7lbcdeyo0h" path="res://Roboto-Bold.ttf" id="6_xpf2l"] [ext_resource type="Script" path="res://addons/gloot/ui/ctrl_item_slot_ex.gd" id="7_kcmi5"] [ext_resource type="Texture2D" uid="uid://dfmrlie57qrbo" path="res://Mods/Core/Items/9mm.png" id="8_0yr0i"] +[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_stacked.gd" id="9_8a8sx"] [ext_resource type="Script" path="res://addons/gloot/core/item_slot.gd" id="9_qoep6"] +[ext_resource type="Texture2D" uid="uid://df2n5aculnj82" path="res://addons/gloot/images/icon_inventory.svg" id="10_6ygdg"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hyt2o"] bg_color = Color(0.584314, 0.588235, 0.737255, 1) @@ -21,17 +21,18 @@ default_font_size = 13 [node name="InventoryWindow" type="Control" node_paths=PackedStringArray("proximity_inventory", "proximity_inventory_control", "inventory_control", "inventory", "containerList", "LeftHandEquipmentSlot", "RightHandEquipmentSlot", "tooltip", "tooltip_item_name", "tooltip_item_description")] layout_mode = 3 -anchors_preset = 0 -offset_top = 150.0 -offset_right = 462.0 -offset_bottom = 719.0 +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_7kqbx") -proximity_inventory = NodePath("InventoryGridStackedProx") -proximity_inventory_control = NodePath("HBoxContainer/Inventories/CtrlInventoryGridExProx") -inventory_control = NodePath("HBoxContainer/Inventories/CtrlInventoryGridEx") -inventory = NodePath("InventoryGridStacked") +proximity_inventory = NodePath("InventoryStackedProx") +proximity_inventory_control = NodePath("HBoxContainer/CtrlInventoryStackedProx") +inventory_control = NodePath("HBoxContainer/CtrlInventoryStacked") +inventory = NodePath("InventoryStacked") containerList = NodePath("HBoxContainer/ContainersList") containerListItem = ExtResource("2_xfgb3") LeftHandEquipmentSlot = NodePath("HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentSlot") @@ -45,93 +46,88 @@ layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 -offset_right = 133.0 -offset_bottom = 29.0 grow_horizontal = 2 grow_vertical = 2 color = Color(0.698039, 0.729412, 0.788235, 1) -[node name="InventoryGridStacked" type="Node" parent="."] -script = ExtResource("2_alcyo") -size = Vector2i(12, 8) +[node name="InventoryStacked" type="Node" parent="."] +script = ExtResource("3_l8xgt") +capacity = 1000.0 item_protoset = ExtResource("3_sqsc0") -[node name="_Node_50375" type="Node" parent="InventoryGridStacked"] +[node name="_Node_23278" type="Node" parent="InventoryStacked"] script = ExtResource("5_qidb6") protoset = ExtResource("3_sqsc0") -prototype_id = "pistol_9mm" +prototype_id = "bullet_9mm" -[node name="_Node_51104" type="Node" parent="InventoryGridStacked"] +[node name="_Node_23288" type="Node" parent="InventoryStacked"] script = ExtResource("5_qidb6") protoset = ExtResource("3_sqsc0") prototype_id = "pistol_magazine" -properties = { -"grid_position": Vector2i(0, 2) -} -[node name="_Node_52218" type="Node" parent="InventoryGridStacked"] +[node name="_Node_23298" type="Node" parent="InventoryStacked"] script = ExtResource("5_qidb6") protoset = ExtResource("3_sqsc0") -prototype_id = "bullet_9mm" -properties = { -"grid_position": Vector2i(0, 3) -} +prototype_id = "rifle_m4a1" -[node name="_Node_27438" type="Node" parent="InventoryGridStacked"] +[node name="_Node_23311" type="Node" parent="InventoryStacked"] script = ExtResource("5_qidb6") protoset = ExtResource("3_sqsc0") -prototype_id = "rifle_m4a1" -properties = { -"grid_position": Vector2i(0, 4) -} +prototype_id = "pistol_9mm" -[node name="_Node_28997" type="Node" parent="InventoryGridStacked"] +[node name="_Node_65384" type="Node" parent="InventoryStacked"] script = ExtResource("5_qidb6") protoset = ExtResource("3_sqsc0") prototype_id = "pistol_9mm" -properties = { -"grid_position": Vector2i(0, 6) -} -[node name="InventoryGridStackedProx" type="Node" parent="."] -script = ExtResource("2_alcyo") -size = Vector2i(12, 8) +[node name="InventoryStackedProx" type="Node" parent="."] +script = ExtResource("3_l8xgt") +capacity = 1000.0 item_protoset = ExtResource("3_sqsc0") [node name="HBoxContainer" type="HBoxContainer" parent="."] -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 [node name="ContainersList" type="VBoxContainer" parent="HBoxContainer"] custom_minimum_size = Vector2(64, 0) layout_mode = 2 -[node name="Inventories" type="VBoxContainer" parent="HBoxContainer"] +[node name="CtrlInventoryStackedProx" type="Control" parent="HBoxContainer"] +visible = false +custom_minimum_size = Vector2(300, 400) +layout_mode = 2 +size_flags_horizontal = 3 +script = ExtResource("9_8a8sx") +inventory_path = NodePath("../../InventoryStackedProx") +default_item_icon = ExtResource("10_6ygdg") + +[node name="HBoxContainer" type="VBoxContainer" parent="HBoxContainer"] layout_mode = 2 -[node name="CtrlInventoryGridEx" type="Control" parent="HBoxContainer/Inventories"] -custom_minimum_size = Vector2(384, 256) +[node name="TransferRightButton" type="Button" parent="HBoxContainer/HBoxContainer"] layout_mode = 2 -size_flags_vertical = 3 -script = ExtResource("4_8j4xb") -grid_color = Color(0.309804, 0.309804, 0.309804, 1) -selection_color = Color(0.745098, 0.745098, 0.745098, 0.941176) -inventory_path = NodePath("../../../InventoryGridStacked") -default_item_texture = ExtResource("5_wixd1") +text = "->" -[node name="Label" type="Label" parent="HBoxContainer/Inventories"] +[node name="TransferLeftButton" type="Button" parent="HBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "<-" + +[node name="Label" type="Label" parent="HBoxContainer/HBoxContainer"] layout_mode = 2 text = "Nearby container:" -[node name="CtrlInventoryGridExProx" type="Control" parent="HBoxContainer/Inventories"] -custom_minimum_size = Vector2(384, 256) +[node name="CtrlInventoryStacked" type="Control" parent="HBoxContainer"] +custom_minimum_size = Vector2(300, 400) layout_mode = 2 -size_flags_vertical = 3 -script = ExtResource("4_8j4xb") -grid_color = Color(0.305882, 0.305882, 0.305882, 1) -inventory_path = NodePath("../../../InventoryGridStackedProx") -default_item_texture = ExtResource("5_wixd1") +size_flags_horizontal = 3 +script = ExtResource("9_8a8sx") +inventory_path = NodePath("../../InventoryStacked") +default_item_icon = ExtResource("10_6ygdg") [node name="EquipmentSlotList" type="VBoxContainer" parent="HBoxContainer"] custom_minimum_size = Vector2(64, 0) @@ -140,6 +136,10 @@ layout_mode = 2 [node name="LeftHandEquipment" type="HBoxContainer" parent="HBoxContainer/EquipmentSlotList"] layout_mode = 2 +[node name="EquipLeftButton" type="Button" parent="HBoxContainer/EquipmentSlotList/LeftHandEquipment"] +layout_mode = 2 +text = "->" + [node name="LeftHandEquipmentSlot" type="Node" parent="HBoxContainer/EquipmentSlotList/LeftHandEquipment"] script = ExtResource("9_qoep6") item_protoset = ExtResource("3_sqsc0") @@ -160,6 +160,10 @@ text = "Left hand" [node name="RightHandEquipment" type="HBoxContainer" parent="HBoxContainer/EquipmentSlotList"] layout_mode = 2 +[node name="EquipRightButton" type="Button" parent="HBoxContainer/EquipmentSlotList/RightHandEquipment"] +layout_mode = 2 +text = "->" + [node name="RightHandEquipmentSlot" type="Node" parent="HBoxContainer/EquipmentSlotList/RightHandEquipment"] script = ExtResource("9_qoep6") item_protoset = ExtResource("3_sqsc0") @@ -229,12 +233,11 @@ theme_override_font_sizes/font_size = 13 text = "Item description" autowrap_mode = 3 -[connection signal="item_added" from="InventoryGridStacked" to="." method="_on_inventory_grid_stacked_item_added"] -[connection signal="item_mouse_entered" from="HBoxContainer/Inventories/CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_entered"] -[connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridEx" to="." method="_on_inventory_item_mouse_exited"] -[connection signal="item_mouse_entered" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_entered"] -[connection signal="item_mouse_exited" from="HBoxContainer/Inventories/CtrlInventoryGridExProx" to="." method="_on_inventory_item_mouse_exited"] +[connection signal="button_up" from="HBoxContainer/HBoxContainer/TransferRightButton" to="." method="_on_transfer_right_button_button_up"] +[connection signal="button_up" from="HBoxContainer/HBoxContainer/TransferLeftButton" to="." method="_on_transfer_left_button_button_up"] +[connection signal="button_up" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/EquipLeftButton" to="." method="_on_equip_left_button_button_up"] [connection signal="cleared" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentSlot" to="." method="_on_left_hand_equipment_slot_cleared"] [connection signal="item_equipped" from="HBoxContainer/EquipmentSlotList/LeftHandEquipment/LeftHandEquipmentSlot" to="." method="_on_left_hand_equipment_slot_item_equipped"] +[connection signal="button_up" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/EquipRightButton" to="." method="_on_equip_right_button_button_up"] [connection signal="cleared" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentSlot" to="." method="_on_right_hand_equipment_slot_cleared"] [connection signal="item_equipped" from="HBoxContainer/EquipmentSlotList/RightHandEquipment/RightHandEquipmentSlot" to="." method="_on_right_hand_equipment_slot_item_equipped"] diff --git a/Scripts/InventoryWindow.gd b/Scripts/InventoryWindow.gd index 028e6545..3cf549a5 100644 --- a/Scripts/InventoryWindow.gd +++ b/Scripts/InventoryWindow.gd @@ -1,14 +1,14 @@ extends Control # This node holds the data of the items in the container that is selected in the containerList -@export var proximity_inventory: InventoryGridStacked +@export var proximity_inventory: InventoryStacked # This node visualizes the items in the container that is selected in the containerList -@export var proximity_inventory_control: CtrlInventoryGridEx +@export var proximity_inventory_control: CtrlInventoryStacked # The node that visualizes the player inventory -@export var inventory_control : CtrlInventoryGridEx +@export var inventory_control : CtrlInventoryStacked # The player inventory -@export var inventory : InventoryGridStacked +@export var inventory : InventoryStacked # Holds a list of containers represented by their sprite @export var containerList : VBoxContainer @export var containerListItem : PackedScene @@ -58,7 +58,7 @@ func check_if_resources_are_available(item_id, amount_to_spend: int): var current_amount_to_spend = amount_to_spend var items = inventory_node.get_items_by_id(item_id) for item in items: - item_total_amount += InventoryGridStacked.get_item_stack_size(item) + item_total_amount += InventoryStacked.get_item_stack_size(item) if item_total_amount >= current_amount_to_spend: return true return false @@ -71,7 +71,7 @@ func try_to_spend_item(item_id, amount_to_spend : int): var items = inventory_node.get_items_by_id(item_id) for item in items: - item_total_amount += InventoryGridStacked.get_item_stack_size(item) + item_total_amount += InventoryStacked.get_item_stack_size(item) if item_total_amount >= amount_to_spend: merge_items_to_total_amount(items, inventory_node, item_total_amount - current_amount_to_spend) @@ -109,7 +109,7 @@ func _on_crafting_menu_start_craft(recipe): #adding a new item(s) to the inventory based on the recipe var item item = inventory.create_and_add_item(recipe["crafts"]) - InventoryGridStacked.set_item_stack_size(item, recipe["craft_amount"]) + InventoryStacked.set_item_stack_size(item, recipe["craft_amount"]) # When an item is added to the player inventory @@ -122,7 +122,7 @@ func _on_inventory_grid_stacked_item_added(item): if original_parent and original_parent.has_method("remove_item"): original_parent.remove_item(original_item) # Remove from original parent -func get_inventory() -> InventoryGridStacked: +func get_inventory() -> InventoryStacked: return inventory # Signal handler for adding a container to the proximity @@ -232,3 +232,20 @@ func _on_left_hand_equipment_slot_cleared(): # This function is called when an item is removed from the right hand equipment slot func _on_right_hand_equipment_slot_cleared(): item_was_cleared.emit("RightHand") + + +func _on_equip_right_button_button_up(): + RightHandEquipmentSlot.equip(inventory_control.get_selected_inventory_item()) + + +func _on_equip_left_button_button_up(): + LeftHandEquipmentSlot.equip(inventory_control.get_selected_inventory_item()) + + +func _on_transfer_left_button_button_up(): + inventory.transfer(inventory_control.get_selected_inventory_item(), proximity_inventory_control.inventory) + + +func _on_transfer_right_button_button_up(): + var selected_inventory_item: InventoryItem = proximity_inventory_control.get_selected_inventory_item() + proximity_inventory_control.inventory.transfer(selected_inventory_item, inventory) diff --git a/Scripts/ItemEditor.gd b/Scripts/ItemEditor.gd index ab3f3fb1..d8ef912b 100644 --- a/Scripts/ItemEditor.gd +++ b/Scripts/ItemEditor.gd @@ -53,7 +53,7 @@ func _ready(): #This function update the form based on the contentData that has been loaded func load_item_data() -> void: - if itemImageDisplay != null and contentData.has("sprite"): + if itemImageDisplay != null and contentData.has("sprite") and Gamedata.data.items.sprites.has(contentData["sprite"]): itemImageDisplay.texture = Gamedata.data.items.sprites[contentData["sprite"]] PathTextLabel.text = contentData["sprite"] if IDTextLabel != null: diff --git a/Scripts/hud.gd b/Scripts/hud.gd index 5cd3815f..ff647185 100644 --- a/Scripts/hud.gd +++ b/Scripts/hud.gd @@ -102,7 +102,7 @@ func _on_concrete_button_down(): func check_if_resources_are_available(item_id, amount_to_spend: int): - var inventory_node: InventoryGridStacked = inventoryWindow.get_inventory() + var inventory_node: InventoryStacked = inventoryWindow.get_inventory() print("checking if we have the item id in inv") if inventory_node.get_item_by_id(item_id): print("we have the item id") diff --git a/Textures/steel_scrap.png b/Textures/steel_scrap.png index cef5566616205dde732be609786ff1a3e4a96ea7..4fde92c0a6c4965356ef342097384e318b43a23d 100644 GIT binary patch literal 2812 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 diff --git a/hud.tscn b/hud.tscn index 918fd865..0504c13a 100644 --- a/hud.tscn +++ b/hud.tscn @@ -334,8 +334,11 @@ visible = false [node name="InventoryWindow" parent="." instance=ExtResource("20_0l505")] visible = false -offset_top = 200.0 -offset_bottom = 720.0 +anchors_preset = -1 +anchor_left = 0.1 +anchor_top = 0.1 +anchor_right = 0.9 +anchor_bottom = 0.9 [node name="GameOver" parent="." instance=ExtResource("20_jlthm")] visible = false From e85bf086c78c6b927a5b5262c9cad0d9db197583 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 25 Jan 2024 23:03:34 +0100 Subject: [PATCH 125/138] Fix inventory window layout --- Defaults/Mobs/mob_corpse.tscn | 1 + Scenes/InventoryWindow.tscn | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Defaults/Mobs/mob_corpse.tscn b/Defaults/Mobs/mob_corpse.tscn index 1c4dfb37..96f52a25 100644 --- a/Defaults/Mobs/mob_corpse.tscn +++ b/Defaults/Mobs/mob_corpse.tscn @@ -14,6 +14,7 @@ inventory = NodePath("InventoryStacked") [node name="InventoryStacked" type="Node" parent="."] script = ExtResource("2_3htey") +capacity = 1000.0 item_protoset = ExtResource("4_ehn4b") [node name="Sprite3D" type="Sprite3D" parent="."] diff --git a/Scenes/InventoryWindow.tscn b/Scenes/InventoryWindow.tscn index acfa5569..580c085f 100644 --- a/Scenes/InventoryWindow.tscn +++ b/Scenes/InventoryWindow.tscn @@ -30,7 +30,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 script = ExtResource("1_7kqbx") proximity_inventory = NodePath("InventoryStackedProx") -proximity_inventory_control = NodePath("HBoxContainer/CtrlInventoryStackedProx") +proximity_inventory_control = NodePath("HBoxContainer/VBoxContainer/CtrlInventoryStackedProx") inventory_control = NodePath("HBoxContainer/CtrlInventoryStacked") inventory = NodePath("InventoryStacked") containerList = NodePath("HBoxContainer/ContainersList") @@ -97,13 +97,21 @@ grow_vertical = 2 custom_minimum_size = Vector2(64, 0) layout_mode = 2 -[node name="CtrlInventoryStackedProx" type="Control" parent="HBoxContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Label" type="Label" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Nearby container:" + +[node name="CtrlInventoryStackedProx" type="Control" parent="HBoxContainer/VBoxContainer"] visible = false custom_minimum_size = Vector2(300, 400) layout_mode = 2 size_flags_horizontal = 3 script = ExtResource("9_8a8sx") -inventory_path = NodePath("../../InventoryStackedProx") +inventory_path = NodePath("../../../InventoryStackedProx") default_item_icon = ExtResource("10_6ygdg") [node name="HBoxContainer" type="VBoxContainer" parent="HBoxContainer"] @@ -117,10 +125,6 @@ text = "->" layout_mode = 2 text = "<-" -[node name="Label" type="Label" parent="HBoxContainer/HBoxContainer"] -layout_mode = 2 -text = "Nearby container:" - [node name="CtrlInventoryStacked" type="Control" parent="HBoxContainer"] custom_minimum_size = Vector2(300, 400) layout_mode = 2 From 06ad2072be51c5bc038d38ba566238b84de0d03f Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 25 Jan 2024 23:32:45 +0100 Subject: [PATCH 126/138] Add volume to item editor --- ItemProtosets.tres | 14 +++++++-- Mods/Core/Items/Items.json | 12 +++++++- .../Custom_Editors/ItemEditor/ItemEditor.tscn | 29 ++++++------------- Scripts/ItemEditor.gd | 12 +++----- 4 files changed, 36 insertions(+), 31 deletions(-) diff --git a/ItemProtosets.tres b/ItemProtosets.tres index 360bafaf..7cf63aa9 100644 --- a/ItemProtosets.tres +++ b/ItemProtosets.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="ItemProtoset" load_steps=2 format=3] +[gd_resource type="Resource" script_class="ItemProtoset" load_steps=2 format=3 uid="uid://b1tngttyk4w2s"] [ext_resource type="Script" path="res://addons/gloot/core/item_protoset.gd" id="1_o35lu"] @@ -14,7 +14,9 @@ json_data = "[ \"max_stack_size\": \"3\", \"name\": \"Plank 2x4\", \"sprite\": \"plank.png\", - \"stack_size\": \"3\", + \"stack_size\": \"1\", + \"two_handed\": false, + \"volume\": \"300\", \"weight\": \"2\", \"width\": \"4\" }, @@ -27,6 +29,8 @@ json_data = "[ \"name\": \"Steel scrap\", \"sprite\": \"steel_scrap.png\", \"stack_size\": \"2\", + \"two_handed\": false, + \"volume\": \"15\", \"weight\": \"0.25\", \"width\": \"2\" }, @@ -42,6 +46,8 @@ json_data = "[ \"name\": \"bullet 9mm\", \"sprite\": \"9mm.png\", \"stack_size\": \"20\", + \"two_handed\": false, + \"volume\": \"0.1\", \"weight\": \"0.01\", \"width\": \"1\" }, @@ -58,6 +64,8 @@ json_data = "[ \"name\": \"Pistol magazine\", \"sprite\": \"pistol_magazine.png\", \"stack_size\": \"1\", + \"two_handed\": false, + \"volume\": \"10\", \"weight\": \"0.25\", \"width\": \"1\" }, @@ -82,6 +90,7 @@ json_data = "[ \"sprite\": \"pistol_32.png\", \"stack_size\": \"1\", \"two_handed\": false, + \"volume\": \"150\", \"weight\": \"2\", \"width\": \"2\" }, @@ -106,6 +115,7 @@ json_data = "[ \"sprite\": \"rifle_64_32.png\", \"stack_size\": \"1\", \"two_handed\": true, + \"volume\": \"300\", \"weight\": \"4\", \"width\": \"4\" } diff --git a/Mods/Core/Items/Items.json b/Mods/Core/Items/Items.json index fb027b15..fa581c83 100644 --- a/Mods/Core/Items/Items.json +++ b/Mods/Core/Items/Items.json @@ -8,7 +8,9 @@ "max_stack_size": "3", "name": "Plank 2x4", "sprite": "plank.png", - "stack_size": "3", + "stack_size": "1", + "two_handed": false, + "volume": "300", "weight": "2", "width": "4" }, @@ -21,6 +23,8 @@ "name": "Steel scrap", "sprite": "steel_scrap.png", "stack_size": "2", + "two_handed": false, + "volume": "15", "weight": "0.25", "width": "2" }, @@ -36,6 +40,8 @@ "name": "bullet 9mm", "sprite": "9mm.png", "stack_size": "20", + "two_handed": false, + "volume": "0.1", "weight": "0.01", "width": "1" }, @@ -52,6 +58,8 @@ "name": "Pistol magazine", "sprite": "pistol_magazine.png", "stack_size": "1", + "two_handed": false, + "volume": "10", "weight": "0.25", "width": "1" }, @@ -76,6 +84,7 @@ "sprite": "pistol_32.png", "stack_size": "1", "two_handed": false, + "volume": "150", "weight": "2", "width": "2" }, @@ -100,6 +109,7 @@ "sprite": "rifle_64_32.png", "stack_size": "1", "two_handed": true, + "volume": "300", "weight": "4", "width": "4" } diff --git a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn index b1fa23a0..1945abe5 100644 --- a/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn +++ b/Scenes/ContentManager/Custom_Editors/ItemEditor/ItemEditor.tscn @@ -7,7 +7,7 @@ [ext_resource type="PackedScene" uid="uid://27f4k2pq2odn" path="res://Scenes/ContentManager/Custom_Editors/ItemEditor/ItemMagazineEditor.tscn" id="4_x8xa3"] [ext_resource type="PackedScene" uid="uid://c2uiumyeepree" path="res://Scenes/ContentManager/Custom_Editors/ItemEditor/ItemAmmoEditor.tscn" id="5_mr1dn"] -[node name="ItemEditor" type="Control" node_paths=PackedStringArray("tabContainer", "itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector", "WidthNumberBox", "HeightNumberBox", "WeightNumberBox", "StackSizeNumberBox", "MaxStackSizeNumberBox", "typesContainer", "TwoHandedCheckBox")] +[node name="ItemEditor" type="Control" node_paths=PackedStringArray("tabContainer", "itemImageDisplay", "IDTextLabel", "PathTextLabel", "NameTextEdit", "DescriptionTextEdit", "itemSelector", "VolumeNumberBox", "WeightNumberBox", "StackSizeNumberBox", "MaxStackSizeNumberBox", "typesContainer", "TwoHandedCheckBox")] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -22,8 +22,7 @@ PathTextLabel = NodePath("VBoxContainer/TabContainer/Basic/PathTextLabel") NameTextEdit = NodePath("VBoxContainer/TabContainer/Basic/NameTextEdit") DescriptionTextEdit = NodePath("VBoxContainer/TabContainer/Basic/DescriptionTextEdit") itemSelector = NodePath("Sprite_selector") -WidthNumberBox = NodePath("VBoxContainer/TabContainer/Basic/WidthNumber") -HeightNumberBox = NodePath("VBoxContainer/TabContainer/Basic/HeightNumber") +VolumeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/VolumeNumber") WeightNumberBox = NodePath("VBoxContainer/TabContainer/Basic/WeightNumber") StackSizeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/StackSizeNumber") MaxStackSizeNumberBox = NodePath("VBoxContainer/TabContainer/Basic/MaxStackSizeNumber") @@ -116,26 +115,16 @@ focus_previous = NodePath("../NameTextEdit") placeholder_text = "A very dangerous land animal often found in dry climates" wrap_mode = 1 -[node name="WidthLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] +[node name="VolumeLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 -text = "Width" +text = "Volume" -[node name="WidthNumber" type="SpinBox" parent="VBoxContainer/TabContainer/Basic"] +[node name="VolumeNumber" type="SpinBox" parent="VBoxContainer/TabContainer/Basic"] layout_mode = 2 -tooltip_text = "The width of this item in the inventory. A larger number means it will take up more horizontal inventory slots" -min_value = 1.0 -max_value = 8.0 -value = 1.0 - -[node name="HeightLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] -layout_mode = 2 -text = "Height" - -[node name="HeightNumber" type="SpinBox" parent="VBoxContainer/TabContainer/Basic"] -layout_mode = 2 -tooltip_text = "The height of this item in the inventory. A larger number means it will take up more vertical inventory slots" -min_value = 1.0 -max_value = 8.0 +tooltip_text = "The volume of this item. For reference, a grain of sand is 0.01, a bullet is 0,1 and a rifle is 300" +min_value = 0.01 +max_value = 1000.0 +step = 0.01 value = 1.0 [node name="WeightLabel" type="Label" parent="VBoxContainer/TabContainer/Basic"] diff --git a/Scripts/ItemEditor.gd b/Scripts/ItemEditor.gd index d8ef912b..a9880074 100644 --- a/Scripts/ItemEditor.gd +++ b/Scripts/ItemEditor.gd @@ -23,8 +23,7 @@ extends Control @export var itemSelector: Popup = null # Inventory propeties -@export var WidthNumberBox: SpinBox = null -@export var HeightNumberBox: SpinBox = null +@export var VolumeNumberBox: SpinBox = null @export var WeightNumberBox: SpinBox = null @export var StackSizeNumberBox: SpinBox = null @export var MaxStackSizeNumberBox: SpinBox = null @@ -62,10 +61,8 @@ func load_item_data() -> void: NameTextEdit.text = contentData["name"] if DescriptionTextEdit != null and contentData.has("description"): DescriptionTextEdit.text = contentData["description"] - if WidthNumberBox != null and contentData.has("width"): - WidthNumberBox.get_line_edit().text = contentData["width"] - if HeightNumberBox != null and contentData.has("height"): - HeightNumberBox.get_line_edit().text = contentData["height"] + if VolumeNumberBox != null and contentData.has("volume"): + VolumeNumberBox.get_line_edit().text = contentData["volume"] if WeightNumberBox != null and contentData.has("weight"): WeightNumberBox.get_line_edit().text = contentData["weight"] if StackSizeNumberBox != null and contentData.has("stack_size"): @@ -102,8 +99,7 @@ func _on_save_button_button_up() -> void: contentData["image"] = Gamedata.data.items.spritePath + PathTextLabel.text contentData["name"] = NameTextEdit.text contentData["description"] = DescriptionTextEdit.text - contentData["width"] = WidthNumberBox.get_line_edit().text - contentData["height"] = HeightNumberBox.get_line_edit().text + contentData["volume"] = VolumeNumberBox.get_line_edit().text contentData["weight"] = WeightNumberBox.get_line_edit().text contentData["stack_size"] = StackSizeNumberBox.get_line_edit().text contentData["max_stack_size"] = MaxStackSizeNumberBox.get_line_edit().text From 0931938b537a4adf19808c817b9ed25b7f1099eb Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 26 Jan 2024 01:07:38 +0100 Subject: [PATCH 127/138] Change player sprite, apply rotation --- Defaults/Player/player_300.png | Bin 0 -> 23614 bytes Defaults/Player/player_300.png.import | 35 ++++++++++++++++++++++++++ Scripts/player.gd | 31 ++++++++++++++++------- level_generation.tscn | 9 +++---- 4 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 Defaults/Player/player_300.png create mode 100644 Defaults/Player/player_300.png.import diff --git a/Defaults/Player/player_300.png b/Defaults/Player/player_300.png new file mode 100644 index 0000000000000000000000000000000000000000..8c74dc1a7e68d65c8df9f0c2797451f7075a5f68 GIT binary patch literal 23614 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 AP5=M^ literal 0 HcmV?d00001 diff --git a/Defaults/Player/player_300.png.import b/Defaults/Player/player_300.png.import new file mode 100644 index 00000000..0343c7b7 --- /dev/null +++ b/Defaults/Player/player_300.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://db0xwhrm0sliq" +path.s3tc="res://.godot/imported/player_300.png-a00e9cfa286016869f973cd324026833.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Defaults/Player/player_300.png" +dest_files=["res://.godot/imported/player_300.png-a00e9cfa286016869f973cd324026833.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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=0 diff --git a/Scripts/player.gd b/Scripts/player.gd index c7726f1b..0d9918bc 100644 --- a/Scripts/player.gd +++ b/Scripts/player.gd @@ -68,19 +68,32 @@ func _ready(): current_torso_health = torso_health current_stamina = stamina Helper.save_helper.load_player_state(self) - - + + + + func _process(_delta): + # Get the 2D screen position of the player + var camera = get_tree().get_first_node_in_group("Camera") + var player_screen_pos = camera.unproject_position(global_position) + + # Get the mouse position in 2D screen space + var mouse_pos_2d = get_viewport().get_mouse_position() + + # Calculate the direction vector from the player to the mouse position + var dir = (mouse_pos_2d - player_screen_pos).normalized() + + # Calculate the angle between the player and the mouse position + # Since the sprite is rotating in the opposite direction, change the sign of the angle + var angle = atan2(-dir.y, -dir.x) # This negates both components of the direction vector + + sprite.rotation.y = -angle # Inverts the angle for rotation + $CollisionShape3D.rotation.y = -angle # Inverts the angle for rotation + + # if is_progress_bar_well_progressing_i_guess: # get_node(progress_bar_filling).scale.x = lerp(1, 0, get_node(progress_bar_timer).time_left / progress_bar_timer_max_time) - - # player facing the mouse position - var mouse_position : Vector3 = get_tree().get_first_node_in_group("Camera").project_ray_origin(get_viewport().get_mouse_position()) - if mouse_position.x > global_position.x: - sprite.flip_h = true - else: - sprite.flip_h = false func _physics_process(delta): diff --git a/level_generation.tscn b/level_generation.tscn index a3c22fd5..76f1e341 100644 --- a/level_generation.tscn +++ b/level_generation.tscn @@ -9,7 +9,7 @@ [ext_resource type="Script" path="res://Scripts/BuildManager.gd" id="6_y7rk5"] [ext_resource type="Script" path="res://Scripts/player.gd" id="8_gposs"] [ext_resource type="Script" path="res://Scripts/Camera.gd" id="9_gi6l6"] -[ext_resource type="Texture2D" uid="uid://8uwpq1ai8qi4" path="res://Textures/survivor.png" id="10_alql8"] +[ext_resource type="Texture2D" uid="uid://db0xwhrm0sliq" path="res://Defaults/Player/player_300.png" id="10_ghgoh"] [ext_resource type="Script" path="res://Scripts/PlayerShooting.gd" id="11_6i2sa"] [ext_resource type="PackedScene" uid="uid://doyjc25kl7104" path="res://bullet_line.tscn" id="12_dip38"] [ext_resource type="AudioStream" uid="uid://gdwwxc0yvg5g" path="res://Sounds/Weapons/Shooting/pistol_shot.wav" id="13_fjasp"] @@ -138,12 +138,9 @@ spot_angle = 83.32 spot_angle_attenuation = 0.183011 [node name="Sprite3D" type="Sprite3D" parent="TacticalMap/Entities/Player"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.277026, 0) +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, -0.277026, 0) pixel_size = 0.002 -billboard = 1 -double_sided = false -no_depth_test = true -texture = ExtResource("10_alql8") +texture = ExtResource("10_ghgoh") [node name="Shooting" type="Node3D" parent="TacticalMap/Entities/Player" node_paths=PackedStringArray("left_attack_cooldown", "right_attack_cooldown", "left_reload_timer", "right_reload_timer", "shoot_audio_player", "reload_audio_player")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.25, 0) From 0879cc4b00674e36473479ca9205e25cde3379ed Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 26 Jan 2024 10:15:54 +0100 Subject: [PATCH 128/138] Slopes are slopes instead of blocks --- Defaults/Blocks/default_slope.gd | 8 ++++++-- Defaults/Blocks/default_slope.tscn | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Defaults/Blocks/default_slope.gd b/Defaults/Blocks/default_slope.gd index b71cc759..782a2d0d 100644 --- a/Defaults/Blocks/default_slope.gd +++ b/Defaults/Blocks/default_slope.gd @@ -3,8 +3,12 @@ extends StaticBody3D var id: String = "" func update_texture(material: BaseMaterial3D) -> void: - $MeshInstance3D.mesh = BoxMesh.new() - $MeshInstance3D.mesh.surface_set_material(0, material) + var prism_mesh = PrismMesh.new() + prism_mesh.left_to_right = 1 + prism_mesh.surface_set_material(0, material) + + $MeshInstance3D.mesh = prism_mesh # Assign the new PrismMesh to the MeshInstance3D + func get_texture_string() -> String: return $MeshInstance3D.mesh.material.albedo_texture.resource_path diff --git a/Defaults/Blocks/default_slope.tscn b/Defaults/Blocks/default_slope.tscn index d469c2ac..288f8b6c 100644 --- a/Defaults/Blocks/default_slope.tscn +++ b/Defaults/Blocks/default_slope.tscn @@ -4,6 +4,7 @@ [ext_resource type="Material" uid="uid://pdqqtb1s8g6n" path="res://Defaults/Blocks/Materials/stairs1.tres" id="2_qnimx"] [sub_resource type="PrismMesh" id="PrismMesh_7xabc"] +lightmap_size_hint = Vector2i(14, 21) material = ExtResource("2_qnimx") left_to_right = 1.0 @@ -16,7 +17,6 @@ disable_mode = 1 script = ExtResource("1_x2ar8") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] -transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0) mesh = SubResource("PrismMesh_7xabc") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] From 3591084ae02b98fc42a4eb3f7801ae84dd195cc8 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:14:59 +0100 Subject: [PATCH 129/138] Add rocky hill map, json function --- Mods/Core/Maps/RockyHill_NE.json | 27709 +++++++++++++++ Mods/Core/Maps/RockyHill_NE.png | Bin 0 -> 4974 bytes Mods/Core/Maps/RockyHill_NE.png.import | 34 + Mods/Core/Maps/RockyHill_NW.json | 27715 +++++++++++++++ Mods/Core/Maps/RockyHill_NW.png | Bin 0 -> 5282 bytes Mods/Core/Maps/RockyHill_NW.png.import | 34 + Mods/Core/Maps/RockyHill_SE.json | 27704 +++++++++++++++ Mods/Core/Maps/RockyHill_SE.png | Bin 0 -> 5024 bytes Mods/Core/Maps/RockyHill_SE.png.import | 34 + Mods/Core/Maps/RockyHill_SW.json | 27718 ++++++++++++++++ Mods/Core/Maps/RockyHill_SW.png | Bin 0 -> 3533 bytes Mods/Core/Maps/RockyHill_SW.png.import | 34 + Mods/Core/TacticalMaps/RockyHill_00.json | 22 + Scenes/ContentManager/Scripts/content_list.gd | 5 + Scripts/gamedata.gd | 28 + 15 files changed, 111037 insertions(+) create mode 100644 Mods/Core/Maps/RockyHill_NE.json create mode 100644 Mods/Core/Maps/RockyHill_NE.png create mode 100644 Mods/Core/Maps/RockyHill_NE.png.import create mode 100644 Mods/Core/Maps/RockyHill_NW.json create mode 100644 Mods/Core/Maps/RockyHill_NW.png create mode 100644 Mods/Core/Maps/RockyHill_NW.png.import create mode 100644 Mods/Core/Maps/RockyHill_SE.json create mode 100644 Mods/Core/Maps/RockyHill_SE.png create mode 100644 Mods/Core/Maps/RockyHill_SE.png.import create mode 100644 Mods/Core/Maps/RockyHill_SW.json create mode 100644 Mods/Core/Maps/RockyHill_SW.png create mode 100644 Mods/Core/Maps/RockyHill_SW.png.import create mode 100644 Mods/Core/TacticalMaps/RockyHill_00.json diff --git a/Mods/Core/Maps/RockyHill_NE.json b/Mods/Core/Maps/RockyHill_NE.json new file mode 100644 index 00000000..99a62a12 --- /dev/null +++ b/Mods/Core/Maps/RockyHill_NE.json @@ -0,0 +1,27709 @@ +{ + "levels": [ + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_flowers_01" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_center_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_02" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_flowers_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 180 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "furniture": { + "id": "chair_wood" + }, + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [], + [] + ], + "mapheight": 32, + "mapwidth": 32 +} \ No newline at end of file diff --git a/Mods/Core/Maps/RockyHill_NE.png b/Mods/Core/Maps/RockyHill_NE.png new file mode 100644 index 0000000000000000000000000000000000000000..1b90d84d874338277503b1fd62583b2004875157 GIT binary patch literal 4974 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 literal 0 HcmV?d00001 diff --git a/Mods/Core/Maps/RockyHill_NW.png.import b/Mods/Core/Maps/RockyHill_NW.png.import new file mode 100644 index 00000000..f3f3c4ec --- /dev/null +++ b/Mods/Core/Maps/RockyHill_NW.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bq548i1i2tgae" +path="res://.godot/imported/RockyHill_NW.png-8e45fb52ef18faf30191f731c1508d76.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Maps/RockyHill_NW.png" +dest_files=["res://.godot/imported/RockyHill_NW.png-8e45fb52ef18faf30191f731c1508d76.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Mods/Core/Maps/RockyHill_SE.json b/Mods/Core/Maps/RockyHill_SE.json new file mode 100644 index 00000000..213c7cb6 --- /dev/null +++ b/Mods/Core/Maps/RockyHill_SE.json @@ -0,0 +1,27704 @@ +{ + "levels": [ + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_flowers_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_flowers_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + } + ], + [ + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02", + "mob": { + "id": "scrapwalker" + } + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_05" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_06" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_slope_00", + "rotation": 270 + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [], + [] + ], + "mapheight": 32, + "mapwidth": 32 +} \ No newline at end of file diff --git a/Mods/Core/Maps/RockyHill_SE.png b/Mods/Core/Maps/RockyHill_SE.png new file mode 100644 index 0000000000000000000000000000000000000000..024562d0001e2fabe70ef06176c4627eae833c59 GIT binary patch literal 5024 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 literal 0 HcmV?d00001 diff --git a/Mods/Core/Maps/RockyHill_SE.png.import b/Mods/Core/Maps/RockyHill_SE.png.import new file mode 100644 index 00000000..22a24bc4 --- /dev/null +++ b/Mods/Core/Maps/RockyHill_SE.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2fx3e776ellm" +path="res://.godot/imported/RockyHill_SE.png-ffe0c8446fe1466be3262e1db27c1825.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Maps/RockyHill_SE.png" +dest_files=["res://.godot/imported/RockyHill_SE.png-ffe0c8446fe1466be3262e1db27c1825.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Mods/Core/Maps/RockyHill_SW.json b/Mods/Core/Maps/RockyHill_SW.json new file mode 100644 index 00000000..10933fa7 --- /dev/null +++ b/Mods/Core/Maps/RockyHill_SW.json @@ -0,0 +1,27718 @@ +{ + "levels": [ + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01", + "rotation": 90 + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01", + "rotation": 90 + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_02" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01", + "rotation": 90 + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_02" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01", + "rotation": 90 + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01", + "rotation": 90 + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_02" + }, + { + "id": "grass_medium_dirt_01", + "rotation": 90 + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_02" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_01", + "rotation": 90 + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_flowers_03" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_01", + "rotation": 90 + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_north_00", + "rotation": 90 + }, + { + "id": "grass_medium_dirt_01", + "rotation": 90 + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "rock_floor_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_flowers_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_medium_dirt_00" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_dirt_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + }, + { + "id": "grass_plain_01" + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_02" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_04" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00", + "rotation": 90 + }, + { + "id": "rock_floor_00", + "rotation": 90 + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03", + "mob": { + "id": "scrapwalker", + "rotation": 90 + } + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_00" + }, + { + "id": "rock_floor_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [ + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_slope_00", + "rotation": 90 + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_floor_03" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + "id": "rock_floor_03" + }, + { + "id": "rock_slope_00" + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + }, + { + + } + ], + [], + [] + ], + "mapheight": 32, + "mapwidth": 32 +} \ No newline at end of file diff --git a/Mods/Core/Maps/RockyHill_SW.png b/Mods/Core/Maps/RockyHill_SW.png new file mode 100644 index 0000000000000000000000000000000000000000..d4394bbe970f63c3539a87952cdcfd9e4e486518 GIT binary patch literal 3533 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 void: + var data_path: String = contentData.dataPath + var original_file_path: String = data_path + original_id + ".json" + var new_file_path: String = data_path + new_id + ".json" + + if not FileAccess.file_exists(original_file_path): + print_debug("Original file not found: " + original_file_path) + return + + # Load the original file content. + var original_content = Helper.json_helper.load_json_dictionary_file(original_file_path) + + # Write the original content to a new file with the new ID. + var save_result = Helper.json_helper.write_json_file(new_file_path, JSON.stringify(original_content)) + if save_result == OK: + print_debug("File duplicated successfully: " + new_file_path) + # Add the new ID to the data array if it's managed as an array of IDs. + if contentData.data is Array and typeof(contentData.data[0]) == TYPE_STRING: + contentData.data.append(new_id) + save_data_to_file(contentData) # Save the updated data array to file. + else: + print_debug("Failed to duplicate file to: " + new_file_path) + + + # This function appends a new object to an existing array # Pass the contentData dictionary to this function and the value of the ID # If the data directory ends in .json, it will append an object From c0e2acfedbe5f6c810bea08980d16b6e0c59dd3f Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 26 Jan 2024 14:24:09 +0100 Subject: [PATCH 130/138] Add tree, pinetree, willowtree --- Mods/Core/Furniture/Furniture.json | 30 + Mods/Core/Furniture/PineTree_100.png | Bin 0 -> 15133 bytes Mods/Core/Furniture/PineTree_100.png.import | 34 + Mods/Core/Furniture/Tree_100.png | Bin 0 -> 15840 bytes Mods/Core/Furniture/Tree_100.png.import | 34 + Mods/Core/Furniture/WillowTree_100.png | Bin 0 -> 20153 bytes Mods/Core/Furniture/WillowTree_100.png.import | 34 + Mods/Core/Maps/RockyHill_NE.json | 34 +- Mods/Core/Maps/RockyHill_NE.png | Bin 4974 -> 5031 bytes Mods/Core/Maps/RockyHill_NW.json | 42 +- Mods/Core/Maps/RockyHill_NW.png | Bin 5282 -> 5501 bytes Mods/Core/Maps/RockyHill_SE.json | 27 + Mods/Core/Maps/RockyHill_SW.json | 109 +- Mods/Core/Maps/RockyHill_SW.png | Bin 3533 -> 4131 bytes Mods/Core/Maps/urbanroad.json | 3119 ++++++----------- Mods/Core/Maps/urbanroad.png | Bin 598 -> 3546 bytes 16 files changed, 1376 insertions(+), 2087 deletions(-) create mode 100644 Mods/Core/Furniture/PineTree_100.png create mode 100644 Mods/Core/Furniture/PineTree_100.png.import create mode 100644 Mods/Core/Furniture/Tree_100.png create mode 100644 Mods/Core/Furniture/Tree_100.png.import create mode 100644 Mods/Core/Furniture/WillowTree_100.png create mode 100644 Mods/Core/Furniture/WillowTree_100.png.import diff --git a/Mods/Core/Furniture/Furniture.json b/Mods/Core/Furniture/Furniture.json index 557e194d..b4f9464c 100644 --- a/Mods/Core/Furniture/Furniture.json +++ b/Mods/Core/Furniture/Furniture.json @@ -32,5 +32,35 @@ "moveable": false, "name": "Wooden countertop", "sprite": "countertop_100_52.png" + }, + { + "categories": [ + "Nature" + ], + "description": "A common tree", + "id": "Tree_00", + "moveable": false, + "name": "Tree", + "sprite": "Tree_100.png" + }, + { + "categories": [ + "Nature" + ], + "description": "A common pine tree", + "id": "PineTree_00", + "moveable": false, + "name": "Pine tree", + "sprite": "PineTree_100.png" + }, + { + "categories": [ + "Nature" + ], + "description": "A common willow tree", + "id": "WillowTree_00", + "moveable": false, + "name": "Willow tree", + "sprite": "WillowTree_100.png" } ] \ No newline at end of file diff --git a/Mods/Core/Furniture/PineTree_100.png b/Mods/Core/Furniture/PineTree_100.png new file mode 100644 index 0000000000000000000000000000000000000000..90c0e0d997d738f3236ef8022f101cb2066ae537 GIT binary patch literal 15133 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 o(<j@zvsVGq`W*Gc`02k)T_W%F@ literal 0 HcmV?d00001 diff --git a/Mods/Core/Furniture/PineTree_100.png.import b/Mods/Core/Furniture/PineTree_100.png.import new file mode 100644 index 00000000..cc744e07 --- /dev/null +++ b/Mods/Core/Furniture/PineTree_100.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpkfudhpobkjy" +path="res://.godot/imported/PineTree_100.png-03621d872154e5e5556368b5dc8326f5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Furniture/PineTree_100.png" +dest_files=["res://.godot/imported/PineTree_100.png-03621d872154e5e5556368b5dc8326f5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Mods/Core/Furniture/Tree_100.png b/Mods/Core/Furniture/Tree_100.png new file mode 100644 index 0000000000000000000000000000000000000000..a8cc96b3b929995187aaa555ed0aaf097f969ab4 GIT binary patch literal 15840 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 U$9%tk>B>M-V)CN3!UjSA2RP`-!2kdN literal 0 HcmV?d00001 diff --git a/Mods/Core/Furniture/Tree_100.png.import b/Mods/Core/Furniture/Tree_100.png.import new file mode 100644 index 00000000..e23b6a4f --- /dev/null +++ b/Mods/Core/Furniture/Tree_100.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1vlen4jitypn" +path="res://.godot/imported/Tree_100.png-0f2017c5b1fdf0b82b4ff621fba44187.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Furniture/Tree_100.png" +dest_files=["res://.godot/imported/Tree_100.png-0f2017c5b1fdf0b82b4ff621fba44187.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Mods/Core/Furniture/WillowTree_100.png b/Mods/Core/Furniture/WillowTree_100.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d8979ab97c0dfdeff712e6c6cac1f64f4fdbd2 GIT binary patch literal 20153 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