From 33b686b1a4d98b8b861c27d0d555551ba4f96d24 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:28:37 +0100 Subject: [PATCH 01/18] Fix genericmap --- ItemProtosets.tres | 2 +- Mods/Core/Maps/Generichouse.json | 564 ++++++++++++++-------------- Mods/Core/Tiles/Tiles.json | 21 ++ Mods/Core/Tiles/concrete.png | Bin 0 -> 7270 bytes Mods/Core/Tiles/concrete.png.import | 34 ++ Mods/Core/Tiles/sidewalk.png | Bin 0 -> 4343 bytes Mods/Core/Tiles/sidewalk.png.import | 34 ++ 7 files changed, 369 insertions(+), 286 deletions(-) create mode 100644 Mods/Core/Tiles/concrete.png create mode 100644 Mods/Core/Tiles/concrete.png.import create mode 100644 Mods/Core/Tiles/sidewalk.png create mode 100644 Mods/Core/Tiles/sidewalk.png.import diff --git a/ItemProtosets.tres b/ItemProtosets.tres index f6afc95f..4713c156 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://bfgx7w13q3rno"] +[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"] diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index fd46955a..f518495b 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -4142,196 +4142,196 @@ "id": "grass_plain_01" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { "id": "road_asphalt_basic" @@ -4814,196 +4814,196 @@ "id": "road_asphalt_basic" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { - "id": "beehive_stones_00" + "id": "sidewalk_00" }, { "id": "grass_plain_01" @@ -5156,31 +5156,31 @@ "id": "dirt_light_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_01" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_00" @@ -5268,31 +5268,31 @@ "id": "dirt_light_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_01" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_00" @@ -5388,31 +5388,31 @@ "id": "dirt_light_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_01" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_00" @@ -5507,31 +5507,31 @@ "id": "dirt_light_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_01" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_00" @@ -5622,35 +5622,35 @@ "id": "cabinet_wood_00", "rotation": 270 }, - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_01" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "furniture": { "id": "cabinet_wood_00", "rotation": 90 }, - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_00" @@ -5705,7 +5705,7 @@ "id": "kitchen_tiles_mint_02" }, { - "id": "dirt_light_00" + "id": "kitchen_tiles_mint_02" }, { "id": "red_carpet_00" @@ -5744,50 +5744,49 @@ "id": "cabinet_wood_00", "rotation": 270 }, - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_01" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "furniture": { "id": "cabinet_wood_00", "rotation": 90 }, - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_00" }, { "id": "blue_carpet_00", - "rotation": 90 + "rotation": 180 }, { "id": "blue_carpet_00", "rotation": 90 }, { - "id": "dirt_light_00", - "rotation": 90 + "id": "blue_carpet_00" }, { "id": "dirt_light_00", @@ -5856,35 +5855,35 @@ "id": "cabinet_wood_00", "rotation": 270 }, - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_01" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "furniture": { "id": "cabinet_wood_00", "rotation": 90 }, - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_00" @@ -5894,12 +5893,10 @@ "rotation": 90 }, { - "id": "dirt_light_00", - "rotation": 90 + "id": "blue_carpet_00" }, { - "id": "dirt_light_00", - "rotation": 90 + "id": "blue_carpet_00" }, { "id": "dirt_light_00", @@ -5972,31 +5969,31 @@ "id": "dirt_light_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_01" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { - "id": "beehive_stones_00" + "id": "concrete_00" }, { "id": "dirt_light_00" @@ -9530,11 +9527,10 @@ }, { - "id": "brick_wall_00" + }, { - "id": "brick_wall_00", - "rotation": 90 + }, { "id": "brick_wall_01", @@ -9639,15 +9635,14 @@ "id": "brick_wall_01" }, { - + "id": "wood_stairs", + "rotation": 180 }, { - "id": "wood_stairs", - "rotation": 90 + }, { - "id": "red_carpet_00", - "rotation": 90 + }, { "id": "brick_wall_01", @@ -9761,7 +9756,8 @@ "id": "brick_wall_01" }, { - + "id": "floor_wood_boards_02", + "rotation": 90 }, { @@ -12892,6 +12888,9 @@ "id": "brick_wall_01" }, { + "furniture": { + "id": "table_round_wood" + }, "id": "floor_wood_boards_06" }, { @@ -12902,12 +12901,13 @@ }, { "furniture": { - "id": "cabinet_wood_00" + "id": "bed_wood_single_00" }, "id": "floor_wood_boards_06" }, { - "id": "floor_wood_boards_06" + "id": "brick_wall_00", + "rotation": 180 }, { "furniture": { @@ -13020,6 +13020,9 @@ "id": "brick_wall_01" }, { + "furniture": { + "id": "chair_wood" + }, "id": "floor_wood_boards_06" }, { @@ -13029,7 +13032,8 @@ "id": "floor_wood_boards_06" }, { - "id": "floor_wood_boards_06" + "id": "brick_wall_00", + "rotation": 180 }, { "furniture": { @@ -13166,7 +13170,8 @@ "id": "brick_wall_00" }, { - "id": "brick_wall_00" + "id": "floor_wood_boards_05", + "rotation": 180 }, { "id": "brick_wall_01" @@ -13271,14 +13276,10 @@ "id": "floor_wood_boards_07" }, { - "id": "floor_wood_boards_04" + "id": "floor_wood_boards_07" }, { - "furniture": { - "id": "table_round_wood", - "rotation": 270 - }, - "id": "floor_wood_boards_04" + "id": "floor_wood_boards_07" }, { "id": "floor_wood_boards_04" @@ -13378,25 +13379,23 @@ "id": "brick_wall_01" }, { - "id": "orange_carpet_00" + }, { - "id": "brick_wall_00" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "wood_stairs" + "id": "brick_wall_00" }, { "id": "brick_wall_00" }, { - "id": "floor_wood_boards_04" + "id": "brick_wall_00" }, { - "furniture": { - "id": "chair_wood" - }, - "id": "floor_wood_boards_02" + "id": "brick_wall_00" }, { "id": "floor_wood_boards_02" @@ -13487,18 +13486,24 @@ { "id": "brick_wall_01" }, - { - "id": "orange_carpet_00" - }, { }, { - + "id": "orange_carpet_00", + "rotation": 180 }, { "id": "brick_wall_00" }, + { + "furniture": { + "id": "plant_pot_00", + "rotation": 90 + }, + "id": "floor_wood_boards_04", + "rotation": 180 + }, { "id": "floor_wood_boards_04" }, @@ -13506,10 +13511,6 @@ "id": "floor_wood_boards_02" }, { - "furniture": { - "id": "bookcase_wood_00", - "rotation": 90 - }, "id": "floor_wood_boards_04" }, { @@ -13608,21 +13609,12 @@ "id": "brick_wall_01" }, { - "furniture": { - "id": "chair_wood", - "rotation": 180 - }, - "id": "orange_carpet_00" - }, - { - "id": "orange_carpet_00" + "id": "wood_stairs", + "rotation": 180 }, { - "furniture": { - "id": "bookcase_wood_00", - "rotation": 90 - }, - "id": "orange_carpet_00" + "id": "orange_carpet_00", + "rotation": 180 }, { "id": "brick_wall_00" @@ -13630,16 +13622,28 @@ { "furniture": { "id": "bed_wood_single_00", - "rotation": 270 + "rotation": 180 + }, + "id": "floor_wood_boards_04", + "rotation": 180 + }, + { + "furniture": { + "id": "table_round_wood", + "rotation": 180 }, "id": "floor_wood_boards_04" }, { + "furniture": { + "id": "chair_wood", + "rotation": 270 + }, "id": "floor_wood_boards_02" }, { "furniture": { - "id": "bookcase_wood_00", + "id": "cabinet_wood_00", "rotation": 90 }, "id": "floor_wood_boards_04" @@ -13734,24 +13738,23 @@ }, { "furniture": { - "id": "table_round_wood", - "rotation": 90 + "id": "bookcase_wood_00", + "rotation": 180 }, - "id": "orange_carpet_00" + "id": "orange_carpet_00", + "rotation": 180 }, { "furniture": { - "id": "plant_pot_00", - "rotation": 90 + "id": "bookcase_wood_00", + "rotation": 180 }, - "id": "orange_carpet_00" + "id": "orange_carpet_00", + "rotation": 180 }, { - "furniture": { - "id": "bed_wood_single_00", - "rotation": 90 - }, - "id": "orange_carpet_00" + "id": "brick_wall_00", + "rotation": 180 }, { "id": "brick_wall_01" @@ -16747,8 +16750,8 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 90 }, { "id": "", @@ -16861,8 +16864,8 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 90 }, { "id": "", @@ -16985,8 +16988,7 @@ "rotation": 180 }, { - "id": "brick_wall_01", - "rotation": 180 + }, { "id": "brick_wall_01", @@ -17208,23 +17210,19 @@ "rotation": 0 }, { - "id": "brick_wall_00" + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "brick_wall_01", - "rotation": 180 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { "id": "", @@ -17337,11 +17335,10 @@ }, { - + "id": "brick_wall_00" }, { - "id": "brick_wall_01", - "rotation": 180 + }, { "id": "", @@ -17463,12 +17460,10 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "brick_wall_01", - "rotation": 180 + }, { "id": "", @@ -17587,8 +17582,7 @@ "rotation": 0 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { "id": "brick_wall_01", diff --git a/Mods/Core/Tiles/Tiles.json b/Mods/Core/Tiles/Tiles.json index a712ea82..b78cbe58 100644 --- a/Mods/Core/Tiles/Tiles.json +++ b/Mods/Core/Tiles/Tiles.json @@ -1204,5 +1204,26 @@ "name": "Arc stones floor", "shape": "cube", "sprite": "arcstones1.png" + }, + { + "categories": [ + "Urban", + "Road" + ], + "description": "Part of the street that indicates this is a zone for pedestrians to walk on", + "id": "sidewalk_00", + "name": "Sidewalk", + "shape": "cube", + "sprite": "sidewalk.png" + }, + { + "categories": [ + "Urban" + ], + "description": "Concrete provides a smooth floor for wheels and is hard to break", + "id": "concrete_00", + "name": "Concrete", + "shape": "cube", + "sprite": "concrete.png" } ] \ No newline at end of file diff --git a/Mods/Core/Tiles/concrete.png b/Mods/Core/Tiles/concrete.png new file mode 100644 index 0000000000000000000000000000000000000000..5869203e9a0370071b739b152ed10168d72bba41 GIT binary patch literal 7270 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 AtpET3 literal 0 HcmV?d00001 diff --git a/Mods/Core/Tiles/concrete.png.import b/Mods/Core/Tiles/concrete.png.import new file mode 100644 index 00000000..aea8dbd5 --- /dev/null +++ b/Mods/Core/Tiles/concrete.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://doi6fvtigp2u7" +path="res://.godot/imported/concrete.png-748bc930d37803ba4723bd796f957c4f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Mods/Core/Tiles/concrete.png" +dest_files=["res://.godot/imported/concrete.png-748bc930d37803ba4723bd796f957c4f.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/sidewalk.png b/Mods/Core/Tiles/sidewalk.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb778907ab627c2591b89b1baa0610b15b84acb GIT binary patch literal 4343 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 Date: Tue, 6 Feb 2024 22:09:53 +0100 Subject: [PATCH 02/18] fix tiles_in_rectangle function --- .../Mapeditor/Scripts/GridContainer.gd | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 8cea48a7..207f10c7 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -158,6 +158,7 @@ func paint_single_tile(clicked_tile) -> void: clicked_tile.set_tile_id(selected_brush.tileID) clicked_tile.set_rotation_amount(rotationAmount) + func storeLevelData() -> void: currentLevelData.clear() var has_significant_data = false @@ -229,6 +230,19 @@ func _on_level_scrollbar_value_changed(value) -> void: change_level(10+0-value) +# Function to check if any corner of a tile or its edges are within or on the boundary of the normalized rectangle +func is_tile_in_rect(tile: Control, normalized_start: Vector2, normalized_end: Vector2, zoom_level: float) -> bool: + var tile_size = tile.get_size() / zoom_level + var tile_global_pos = tile.global_position / zoom_level + var tile_bottom_right = tile_global_pos + tile_size + + # Adjusting checks to be inclusive of the boundary conditions + var overlaps_top_left = tile_global_pos.x <= normalized_end.x and tile_global_pos.y <= normalized_end.y + var overlaps_bottom_right = tile_bottom_right.x >= normalized_start.x and tile_bottom_right.y >= normalized_start.y + + return overlaps_top_left and overlaps_bottom_right + + # 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. @@ -244,12 +258,9 @@ func get_tiles_in_rectangle(rect_start: Vector2, rect_end: Vector2) -> Array: normalized_end /= mapEditor.zoom_level for tile in get_children(): - # 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) + if is_tile_in_rect(tile, normalized_start, normalized_end, mapEditor.zoom_level): + tiles_in_rectangle.append(tile) + return tiles_in_rectangle @@ -264,6 +275,7 @@ func highlight_tiles_in_rect() -> void: 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 From f1ab33f77a85627d149a4dab1016d37bbec37df4 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Wed, 7 Feb 2024 19:24:52 +0100 Subject: [PATCH 03/18] Copy selected tiles to memory --- Images/Icons/IconCopyChecked.png | Bin 0 -> 214 bytes Images/Icons/IconCopyChecked.png.import | 34 +++ Images/Icons/IconCopyUnchecked.png | Bin 0 -> 217 bytes Images/Icons/IconCopyUnchecked.png.import | 34 +++ .../Mapeditor/Scripts/GridContainer.gd | 206 ++++++++++++++++-- .../Mapeditor/Scripts/mapeditor.gd | 2 + .../ContentManager/Mapeditor/mapeditor.tscn | 15 +- Scripts/Helper/save_helper.gd | 2 +- 8 files changed, 270 insertions(+), 23 deletions(-) create mode 100644 Images/Icons/IconCopyChecked.png create mode 100644 Images/Icons/IconCopyChecked.png.import create mode 100644 Images/Icons/IconCopyUnchecked.png create mode 100644 Images/Icons/IconCopyUnchecked.png.import diff --git a/Images/Icons/IconCopyChecked.png b/Images/Icons/IconCopyChecked.png new file mode 100644 index 0000000000000000000000000000000000000000..8dbc7a7cb07238270e0dc8a15a14ba52aea27bc3 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`iFx%6`F~q|=`42w}j|q!Uz^t@}XJQX{mE7Fi zG`dR|jHfMNtyogXlv3+#&-X(7_%p%+uM1{LjVm_UCw0NSA0MF)>u6arh zNl%z&L{{i3uykBBmO9D8=zB^jg<*R`Si*|qjLggoa=Csi%U;Qa0Ig;4boFyt=akR{ E0MfWU(f|Me literal 0 HcmV?d00001 diff --git a/Images/Icons/IconCopyChecked.png.import b/Images/Icons/IconCopyChecked.png.import new file mode 100644 index 00000000..a98d16a2 --- /dev/null +++ b/Images/Icons/IconCopyChecked.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1u77thx3r5so" +path="res://.godot/imported/IconCopyChecked.png-71fce9f4e334c8ab799fe59026853422.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Images/Icons/IconCopyChecked.png" +dest_files=["res://.godot/imported/IconCopyChecked.png-71fce9f4e334c8ab799fe59026853422.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/IconCopyUnchecked.png b/Images/Icons/IconCopyUnchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..96a8fdbc0bdc02c75be04768ff8b7044fc0d1844 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`iFwfJ)F~q|=*{0^lhk7%dl_dGL$C*z!!`3Sj~nVH`sB4Fbt^xyNMM{C(6DYsfQs void: columns = mapEditor.mapWidth levelgrid_below.columns = mapEditor.mapWidth levelgrid_above.columns = mapEditor.mapWidth - createTiles() + create_tiles() snapAmount = 1.28*mapEditor.zoom_level levelgrid_below.hide() levelgrid_above.hide() @@ -49,18 +53,21 @@ func _on_mapeditor_ready() -> void: # 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): - for y in range(mapEditor.mapHeight): - var tileInstance: Control = tileScene.instantiate() - add_child(tileInstance) - tileInstance.connect("tile_clicked",grid_tile_clicked) - var tileBelow: Control = tileScene.instantiate() - tileBelow.set_clickable(false) - levelgrid_below.add_child(tileBelow) - var tileAbove: Control = tileScene.instantiate() - tileAbove.set_clickable(false) - levelgrid_above.add_child(tileAbove) +func create_tiles(): + create_level_tiles(self, mapEditor.mapWidth, mapEditor.mapHeight, true) + create_level_tiles(levelgrid_below, mapEditor.mapWidth, mapEditor.mapHeight, false) + create_level_tiles(levelgrid_above, mapEditor.mapWidth, mapEditor.mapHeight, false) + + +# Helper function to create tiles for a specific level grid +func create_level_tiles(grid: GridContainer, width: int, height: int, connect_signals: bool): + for x in range(width): + for y in range(height): + var tile_instance = tileScene.instantiate() + grid.add_child(tile_instance) + if connect_signals: + tile_instance.tile_clicked.connect(grid_tile_clicked) + tile_instance.set_clickable(connect_signals) #When the user presses and holds the middle mousebutton and moves the mouse, change the parent's scroll_horizontal and scroll_vertical properties appropriately @@ -97,10 +104,16 @@ func _input(event) -> void: is_drawing = true start_point = event.global_position.snapped(snapLevel) else: + # Finalize drawing/copying operation end_point = event.global_position.snapped(snapLevel) - if is_drawing == true: - if drawRectangle: + if is_drawing: + if drawRectangle and not copyRectangle: + # Paint in the rectangle if drawRectangle is enabled paint_in_rectangle() + elif copyRectangle and !drawRectangle: + # Copy selected tiles to memory if copyRectangle is + # enabled and not in drawRectangle mode + copy_selected_tiles_to_memory() unhighlight_tiles() is_drawing = false @@ -108,9 +121,9 @@ func _input(event) -> void: if event is InputEventMouseMotion: end_point = event.global_position if is_drawing: - if drawRectangle: + if drawRectangle or copyRectangle: 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 @@ -123,7 +136,7 @@ func _input(event) -> void: # Highlight tiles that are in the rectangle that the user has drawn with the mouse func update_rectangle() -> void: - if is_drawing and drawRectangle: + if is_drawing and (drawRectangle or copyRectangle): highlight_tiles_in_rect() #When one of the grid tiles is clicked, we paint the tile accordingly @@ -134,7 +147,7 @@ func grid_tile_clicked(clicked_tile) -> void: # 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) -> void: - if drawRectangle or !clicked_tile: + if copyRectangle or drawRectangle or !clicked_tile: return if erase: if selected_brush: @@ -264,6 +277,44 @@ func get_tiles_in_rectangle(rect_start: Vector2, rect_end: Vector2) -> Array: return tiles_in_rectangle + +# This function calculates the dimensions of the selected tiles in terms of how many tiles were selected horizontally (width) and vertically (height). +func get_selection_dimensions(rect_start: Vector2, rect_end: Vector2) -> Dictionary: + var selected_tiles = get_tiles_in_rectangle(rect_start, rect_end) + var x_positions = [] + var y_positions = [] + + # Normalize the rectangle coordinates based on the zoom level + rect_start /= mapEditor.zoom_level + rect_end /= mapEditor.zoom_level + + for tile in selected_tiles: + # Assuming the position is based on the tile's position in the grid container + var tile_pos = tile.get_position() / (snapAmount * mapEditor.zoom_level) + var x_position = tile_pos.x + var y_position = tile_pos.y + + # Add the positions to the lists if they're not already there + if not x_positions.has(x_position): + x_positions.append(x_position) + if not y_positions.has(y_position): + y_positions.append(y_position) + + # Sort the positions in ascending order for consistency + x_positions.sort() + y_positions.sort() + + # Calculate the selection width and height based on the unique positions + var selection_width = x_positions.size() + var selection_height = y_positions.size() + + # Return the dimensions as a dictionary + return {"width": selection_width, "height": selection_height} + + + + + func unhighlight_tiles() -> void: for tile in get_children(): tile.unhighlight() @@ -468,3 +519,120 @@ func rotate_level_clockwise() -> void: # Update the current level data currentLevelData = new_level_data + + +func _on_copy_rectangle_toggled(toggled_on): + copyRectangle = toggled_on + + + + +func copy_selected_tiles_to_memory1(): + + var selection_dimensions = get_selection_dimensions(start_point, end_point) + print("Selected width (horizontal tiles): ", selection_dimensions["width"]) + print("Selected height (vertical tiles): ", selection_dimensions["height"]) + + copied_tiles_info["tiles_data"].clear() # Clear previous data + var selected_tiles = get_tiles_in_rectangle(start_point, end_point) + + # Calculate dimensions of the copied area + var min_x = 999999 + var max_x = -999999 + var min_y = 999999 + var max_y = -999999 + + print_debug("selected_tiles.size = " + str(selected_tiles.size())) + for tile in selected_tiles: + var tile_pos = tile.get_position() + min_x = min(min_x, tile_pos.x) + max_x = max(max_x, tile_pos.x) + min_y = min(min_y, tile_pos.y) + max_y = max(max_y, tile_pos.y) + + # Assuming each tile has a script with a property 'tileData' that contains its data + var tile_data = tile.tileData.duplicate() # Duplicate the dictionary to ensure a deep copy + copied_tiles_info["tiles_data"].append(tile_data) + + # Store the width and height of the copied area + copied_tiles_info["width"] = int((max_x - min_x) / snapAmount) + 1 + copied_tiles_info["height"] = int((max_y - min_y) / snapAmount) + 1 + + #print("Copied tiles info: ", copied_tiles_info) # For debugging purposes + # Optionally, update a preview texture or other UI element to visualize the copied data + update_preview_texture_with_copied_data() + + + + +func copy_selected_tiles_to_memory(): + # Get selection dimensions from the new function + var selection_dimensions = get_selection_dimensions(start_point, end_point) + + # Clear previous copied tiles info + copied_tiles_info["tiles_data"].clear() + + # Get all tiles within the selected rectangle + var selected_tiles = get_tiles_in_rectangle(start_point, end_point) + + # Update copied_tiles_info with the new dimensions + copied_tiles_info["width"] = selection_dimensions["width"] + copied_tiles_info["height"] = selection_dimensions["height"] + + # Copy each tile's data to the copied_tiles_info dictionary + for tile in selected_tiles: + # Assuming each tile has a script with a property 'tileData' that contains its data + var tile_data = tile.tileData.duplicate() # Duplicate the dictionary to ensure a deep copy + copied_tiles_info["tiles_data"].append(tile_data) + + # For debugging purposes, you might print out the copied_tiles_info to verify + #print("Copied tiles info: ", copied_tiles_info) + + # Optionally, update a preview texture or other UI element to visualize the copied data + update_preview_texture_with_copied_data() + + + +func update_preview_texture_with_copied_data(): + var preview_size = Vector2(512, 512) # Size of the preview texture + var tiles_width = copied_tiles_info["width"] + var tiles_height = copied_tiles_info["height"] + print_debug("tiles_width = " + str(tiles_width) + ", tiles_height = " + str(tiles_height)) + + # Calculate size for each tile in the preview to fit all copied tiles + var tile_size_x = preview_size.x / tiles_width + var tile_size_y = preview_size.y / tiles_height + var tile_size = Vector2(tile_size_x, tile_size_y) + + # Create a new Image with a size of 128x128 pixels + var image = Image.create(preview_size.x, preview_size.y, false, Image.FORMAT_RGBA8) + #image.fill(Color(0, 0, 0, 0)) # Fill with transparent color + + var idx = 0 # Tile index + for tile_data in copied_tiles_info["tiles_data"]: + # Assuming tile_data contains a key for 'texture_id' or similar + var texture_id = tile_data["id"] + # You need a way to map 'texture_id' to an actual texture; this is just a conceptual placeholder + var tile_texture: Texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles, texture_id).albedo_texture + + if tile_texture: + var tile_image = tile_texture.get_image() + tile_image.resize(tile_size.x, tile_size.y) # Resize image to fit the preview + + # Calculate position in the preview based on the tile index and copied area dimensions + var pos_x = (idx % tiles_width) * tile_size.x + var pos_y = (idx / tiles_width) * tile_size.y + var pos_in_preview = Vector2(pos_x, pos_y) + + # 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()), pos_in_preview) + + idx += 1 # Move to the next tile + + # Convert the Image to a Texture and assign it to brushPreviewTexture + var texture = ImageTexture.create_from_image(image) + brushPreviewTexture.texture = texture + + diff --git a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd index 88895f3a..81143a4c 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/mapeditor.gd @@ -69,3 +69,5 @@ func _on_close_button_button_up(): func _on_rotate_map_button_up(): tileGrid.rotate_map() + + diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index f7dc8ed9..a1b7ec80 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=23 format=3 uid="uid://d3001f5xxpup1"] +[gd_scene load_steps=25 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"] @@ -10,8 +10,10 @@ [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://d1u77thx3r5so" path="res://Images/Icons/IconCopyChecked.png" id="5_i6bxh"] [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="Texture2D" uid="uid://bqpbqvxtxey17" path="res://Images/Icons/IconCopyUnchecked.png" id="6_0266o"] [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"] @@ -103,7 +105,13 @@ theme_override_icons/unchecked = ExtResource("3_8q2iq") shortcut = SubResource("Shortcut_1tryc") text = "0" -[node name="DrawRectangle" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] +[node name="CopyRectangle" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] +layout_mode = 2 +tooltip_text = "Copy tiles in a rectangle. Select this tool and draw a rectangle on the grid. The tiles in your selection will be copied and can be pasted at a later moment." +theme_override_icons/checked = ExtResource("5_i6bxh") +theme_override_icons/unchecked = ExtResource("6_0266o") + +[node name="DrawRectangle2" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 tooltip_text = "Paint in a rectangle" theme_override_icons/checked = ExtResource("3_eu7pp") @@ -248,7 +256,8 @@ offset_bottom = 40.0 [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"] +[connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/CopyRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_copy_rectangle_toggled"] +[connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle2" 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"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/ShowAbove" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_show_above_toggled"] diff --git a/Scripts/Helper/save_helper.gd b/Scripts/Helper/save_helper.gd index 41b1e99a..4f224c36 100644 --- a/Scripts/Helper/save_helper.gd +++ b/Scripts/Helper/save_helper.gd @@ -146,11 +146,11 @@ func save_map_data(target_folder: String) -> void: 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 = 0 var myRotation: int = int(block.rotation_degrees.y) 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(): From 5be85196aa64ba759d743187434e2850d922cc93 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 8 Feb 2024 19:40:32 +0100 Subject: [PATCH 04/18] Basic copy paste --- .../Mapeditor/Scripts/GridContainer.gd | 119 +++++++++++------- 1 file changed, 73 insertions(+), 46 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 1d1987c6..0b4a022f 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -70,6 +70,7 @@ func create_level_tiles(grid: GridContainer, width: int, height: int, connect_si tile_instance.set_clickable(connect_signals) + #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) -> void: #The mapeditor may be invisible if the user selects another tab in the content editor @@ -107,7 +108,11 @@ func _input(event) -> void: # Finalize drawing/copying operation end_point = event.global_position.snapped(snapLevel) if is_drawing: - if drawRectangle and not copyRectangle: + var drag_threshold: int = 5 # Pixels + var distance_dragged = start_point.distance_to(end_point) + if distance_dragged <= drag_threshold and copyRectangle: + print_debug("Released the mouse button, but clicked instead of dragged") + elif drawRectangle and not copyRectangle: # Paint in the rectangle if drawRectangle is enabled paint_in_rectangle() elif copyRectangle and !drawRectangle: @@ -117,6 +122,7 @@ func _input(event) -> void: unhighlight_tiles() is_drawing = false + #When the users presses and holds the mouse wheel, we scoll the grid if event is InputEventMouseMotion: end_point = event.global_position @@ -147,8 +153,17 @@ func grid_tile_clicked(clicked_tile) -> void: # 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) -> void: - if copyRectangle or drawRectangle or !clicked_tile: + if drawRectangle or !clicked_tile: return + + # New condition to check if copyRectangle is true and copied_tiles_info has data + if copyRectangle: + if copied_tiles_info["tiles_data"].size() > 0: + paste_copied_tile_data(clicked_tile) + return # Return after pasting to avoid executing further code + else: + return + if erase: if selected_brush: if selected_brush.entityType == "mob": @@ -211,6 +226,7 @@ func loadLevelData(newLevel: int) -> void: levelgrid_above.hide() loadLevel(newLevel, self) + func loadLevel(level: int, grid: GridContainer) -> void: if mapData.is_empty(): print_debug("Tried to load data from an empty mapData dictionary") @@ -238,6 +254,7 @@ func change_level(newlevel: int) -> void: currentLevel = newlevel storeLevelData() + # We need to add 10 since the scrollbar starts at -10 func _on_level_scrollbar_value_changed(value) -> void: change_level(10+0-value) @@ -312,9 +329,6 @@ func get_selection_dimensions(rect_start: Vector2, rect_end: Vector2) -> Diction return {"width": selection_width, "height": selection_height} - - - func unhighlight_tiles() -> void: for tile in get_children(): tile.unhighlight() @@ -400,6 +414,7 @@ func save_map_json_file(): 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 mapData = Helper.json_helper.load_json_dictionary_file(fileToLoad) @@ -525,46 +540,6 @@ func _on_copy_rectangle_toggled(toggled_on): copyRectangle = toggled_on - - -func copy_selected_tiles_to_memory1(): - - var selection_dimensions = get_selection_dimensions(start_point, end_point) - print("Selected width (horizontal tiles): ", selection_dimensions["width"]) - print("Selected height (vertical tiles): ", selection_dimensions["height"]) - - copied_tiles_info["tiles_data"].clear() # Clear previous data - var selected_tiles = get_tiles_in_rectangle(start_point, end_point) - - # Calculate dimensions of the copied area - var min_x = 999999 - var max_x = -999999 - var min_y = 999999 - var max_y = -999999 - - print_debug("selected_tiles.size = " + str(selected_tiles.size())) - for tile in selected_tiles: - var tile_pos = tile.get_position() - min_x = min(min_x, tile_pos.x) - max_x = max(max_x, tile_pos.x) - min_y = min(min_y, tile_pos.y) - max_y = max(max_y, tile_pos.y) - - # Assuming each tile has a script with a property 'tileData' that contains its data - var tile_data = tile.tileData.duplicate() # Duplicate the dictionary to ensure a deep copy - copied_tiles_info["tiles_data"].append(tile_data) - - # Store the width and height of the copied area - copied_tiles_info["width"] = int((max_x - min_x) / snapAmount) + 1 - copied_tiles_info["height"] = int((max_y - min_y) / snapAmount) + 1 - - #print("Copied tiles info: ", copied_tiles_info) # For debugging purposes - # Optionally, update a preview texture or other UI element to visualize the copied data - update_preview_texture_with_copied_data() - - - - func copy_selected_tiles_to_memory(): # Get selection dimensions from the new function var selection_dimensions = get_selection_dimensions(start_point, end_point) @@ -592,7 +567,6 @@ func copy_selected_tiles_to_memory(): update_preview_texture_with_copied_data() - func update_preview_texture_with_copied_data(): var preview_size = Vector2(512, 512) # Size of the preview texture var tiles_width = copied_tiles_info["width"] @@ -636,3 +610,56 @@ func update_preview_texture_with_copied_data(): brushPreviewTexture.texture = texture +func get_index_of_child(clicked_tile: Node) -> int: + var children = get_children() # Get all children of this GridContainer + for i in range(len(children)): + if children[i] == clicked_tile: + return i # Return the index if the child matches the clicked_tile + return -1 # Return -1 if the clicked_tile is not found among the children + + + +# Function to paste copied tile data starting from the clicked tile +func paste_copied_tile_data(clicked_tile): + # Check if we have copied tile data + if copied_tiles_info.is_empty(): + print("No tile data to paste.") + return + + # Get the starting point from the clicked tile's grid position + #var start_x = clicked_tile.grid_position.x + #var start_y = clicked_tile.grid_position.y + # + + # Assuming `clicked_tile` is a direct child of this GridContainer + var tile_index = get_index_of_child(clicked_tile) + var num_columns = columns # Assuming `columns` is defined as the number of columns in the grid + + # Calculate the grid position from the tile index + var start_x = tile_index % num_columns + var start_y = tile_index / num_columns + + + # Calculate the ending points based on the width and height from copied_tiles_info + var end_x = min(start_x + copied_tiles_info["width"], 32) + var end_y = min(start_y + copied_tiles_info["height"], 32) + + # Tile data index + var tile_data_index = 0 + + # Loop through the grid starting from the clicked tile position + for y in range(start_y, end_y): + for x in range(start_x, end_x): + # Calculate the index for the current tile in the grid + var current_tile_index = y * 32 + x + # Get the current tile + var current_tile: Control = get_child(current_tile_index) + # Check if the current tile and tile data index are valid + if current_tile and tile_data_index < copied_tiles_info["tiles_data"].size(): + # Update the current tile with the copied data + current_tile.tileData = copied_tiles_info["tiles_data"][tile_data_index] + tile_data_index += 1 + + # Clear copied_tiles_info after pasting + copied_tiles_info = {"tiles_data": [], "width": 0, "height": 0} + print("Pasted tile data and cleared copied_tiles_info.") From e5c32456af852b6f99adb0dfa01704c258050475 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 8 Feb 2024 20:09:42 +0100 Subject: [PATCH 05/18] Add button, hotkey --- .../Mapeditor/Scripts/GridContainer.gd | 6 +++++- Scenes/ContentManager/Mapeditor/mapeditor.tscn | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 0b4a022f..2acfd1aa 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -434,7 +434,7 @@ func _on_zoom_level_changed(zoom_level: int): # When the user releases the mouse button on the rotate right button -func _on_rotate_right_button_up(): +func _on_rotate_right_pressed(): rotationAmount += 90 rotationAmount = rotationAmount % 360 # Keep rotation within 0-359 degrees buttonRotateRight.text = str(rotationAmount) @@ -663,3 +663,7 @@ func paste_copied_tile_data(clicked_tile): # Clear copied_tiles_info after pasting copied_tiles_info = {"tiles_data": [], "width": 0, "height": 0} print("Pasted tile data and cleared copied_tiles_info.") + + +func _on_copy_all_levels_toggled(toggled_on): + pass # Replace with function body. diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index a1b7ec80..662ff2e7 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -97,9 +97,10 @@ shortcut = SubResource("Shortcut_1tryc") layout_mode = 2 size_flags_horizontal = 3 -[node name="RotateRight" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] +[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") @@ -111,6 +112,14 @@ tooltip_text = "Copy tiles in a rectangle. Select this tool and draw a rectangle theme_override_icons/checked = ExtResource("5_i6bxh") theme_override_icons/unchecked = ExtResource("6_0266o") +[node name="CopyAllLevels" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] +self_modulate = Color(0.745098, 0.92549, 0.552941, 1) +layout_mode = 2 +tooltip_text = "Copy tiles in a rectangle. All layers will be copied, not just the current one. Select this tool and draw + a rectangle on the grid. The tiles in your selection will be copied and can be pasted at a later moment." +theme_override_icons/checked = ExtResource("5_i6bxh") +theme_override_icons/unchecked = ExtResource("6_0266o") + [node name="DrawRectangle2" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 tooltip_text = "Paint in a rectangle" @@ -255,8 +264,9 @@ offset_bottom = 40.0 [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="pressed" from="HSplitContainer/MapeditorContainer/Toolbar/RotateRight" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_rotate_right_pressed"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/CopyRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_copy_rectangle_toggled"] +[connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/CopyAllLevels" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_copy_all_levels_toggled"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle2" 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"] From fbd466d34894ab86dce51c7eb9ace2b25aa32dd1 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 8 Feb 2024 21:44:34 +0100 Subject: [PATCH 06/18] Allow the rotation of tile selection --- Mods/Core/Maps/Generichouse.json | 6031 +++++++++-------- Mods/Core/Maps/Generichouse.png | Bin 2936 -> 4637 bytes .../Mapeditor/Scripts/GridContainer.gd | 80 +- .../ContentManager/Mapeditor/mapeditor.tscn | 22 +- 4 files changed, 3169 insertions(+), 2964 deletions(-) diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index f518495b..47231fa2 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -3086,1156 +3086,1718 @@ [ { "id": "grass_plain_01", - "rotation": 90 + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_flowers_01", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_medium_dirt_02", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_flowers_01", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "Tree_00", + "rotation": 270 + }, + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_medium_dirt_02", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_flowers_01", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "WillowTree_00", + "rotation": 270 + }, + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_medium_dirt_02", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "Tree_00", + "rotation": 270 + }, + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_medium_dirt_02", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "cabinet_wood_00", + "rotation": 270 + }, + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_05", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_05", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_05", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_05", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_05", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "WillowTree_00", + "rotation": 270 + }, + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_08", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "chair_wood", + "rotation": 180 + }, + "id": "floor_wood_boards_08", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_08", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "furniture": { + "id": "cabinet_wood_00", + "rotation": 270 + }, + "id": "blue_carpet_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "furniture": { + "id": "plant_pot_00", + "rotation": 90 + }, + "id": "blue_carpet_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_flowers_01", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "chair_wood", + "rotation": 90 + }, + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "table_round_wood", + "rotation": 0 + }, + "id": "floor_wood_boards_08", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "chair_wood", + "rotation": 270 + }, + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "cabinet_wood_00", + "rotation": 270 + }, + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "cabinet_wood_00", + "rotation": 90 + }, + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_flowers_03", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_08", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "chair_wood", + "rotation": 0 + }, + "id": "floor_wood_boards_08", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" - }, - { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00" }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "cabinet_wood_00", + "rotation": 270 + }, + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "cabinet_wood_00", + "rotation": 90 + }, + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "bookcase_wood_00", + "rotation": 0 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "bookcase_wood_00", + "rotation": 0 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "kitchen_tiles_mint_02", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "kitchen_tiles_mint_02", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "kitchen_tiles_mint_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_medium_dirt_02", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "grass_medium_dirt_02", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "bookcase_wood_00", + "rotation": 270 + }, + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "floor_wood_boards_05", + "rotation": 270 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 270 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "cabinet_wood_00", + "rotation": 270 + }, + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "cabinet_wood_00", + "rotation": 90 + }, + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "chair_wood", + "rotation": 180 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "kitchen_tiles_mint_02", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "bed_wood_single_00", + "rotation": 90 + }, + "id": "kitchen_tiles_mint_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "countertop_wood", + "rotation": 270 + }, + "id": "bathroom_tiles_blue_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "bathroom_tiles_blue_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "cabinet_wood_00", + "rotation": 90 + }, + "id": "bathroom_tiles_blue_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "countertop_wood", + "rotation": 270 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "chair_wood", + "rotation": 90 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" - }, + "furniture": { + "id": "table_round_wood", + "rotation": 0 + }, + "id": "orange_carpet_00", + "rotation": 180 + }, { - "id": "grass_plain_01" + "furniture": { + "id": "chair_wood", + "rotation": 270 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "plant_pot_00", + "rotation": 270 + }, + "id": "kitchen_tiles_mint_02", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "kitchen_tiles_mint_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "countertop_wood", + "rotation": 270 + }, + "id": "bathroom_tiles_blue_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "bathroom_tiles_blue_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "bathroom_tiles_blue_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "kitchen_tiles_mint_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "kitchen_tiles_mint_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "countertop_wood", + "rotation": 270 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "chair_wood", + "rotation": 0 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "WillowTree_00", + "rotation": 270 + }, + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "countertop_wood", + "rotation": 180 + }, + "id": "bathroom_tiles_blue_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "countertop_wood", + "rotation": 180 + }, + "id": "bathroom_tiles_blue_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "refrigerator_00", + "rotation": 180 + }, + "id": "bathroom_tiles_blue_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "plant_pot_00", + "rotation": 0 + }, + "id": "kitchen_tiles_mint_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "countertop_wood", + "rotation": 180 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "countertop_wood", + "rotation": 180 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "countertop_wood", + "rotation": 180 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "refrigerator_00", + "rotation": 180 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "furniture": { + "id": "plant_pot_00", + "rotation": 270 + }, + "id": "orange_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_flowers_03", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_01", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "concrete_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "red_carpet_00", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "dirt_light_00", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_flowers_03", + "rotation": 180 }, { - "id": "grass_plain_01" + "id": "grass_flowers_01", + "rotation": 90 }, { - "id": "grass_plain_01" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_flowers_01", + "rotation": 90 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "furniture": { + "id": "Tree_00", + "rotation": 270 + }, + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "cobblestone_02", + "rotation": 90 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_flowers_01", + "rotation": 90 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_medium_dirt_02", + "rotation": 90 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "furniture": { + "id": "Tree_00", + "rotation": 270 + }, + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "cobblestone_00", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_medium_dirt_02", + "rotation": 90 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 }, { - "id": "sidewalk_00" + "id": "grass_plain_01", + "rotation": 180 + }, + { + "id": "grass_plain_01", + "rotation": 180 }, { "id": "sidewalk_00" @@ -4910,100 +5472,100 @@ "id": "sidewalk_00" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "cobblestone_02" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "cobblestone_02" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { - "id": "sidewalk_00" + "id": "grass_plain_01" }, { "id": "grass_plain_01" @@ -5242,25 +5804,29 @@ }, { "furniture": { - "id": "refrigerator_00" + "id": "refrigerator_00", + "rotation": 180 }, "id": "orange_carpet_00" }, { "furniture": { - "id": "countertop_wood" + "id": "countertop_wood", + "rotation": 0 }, "id": "orange_carpet_00" }, { "furniture": { - "id": "countertop_wood" + "id": "countertop_wood", + "rotation": 0 }, "id": "orange_carpet_00" }, { "furniture": { - "id": "cabinet_wood_00" + "id": "countertop_wood", + "rotation": 0 }, "id": "orange_carpet_00" }, @@ -5305,7 +5871,8 @@ }, { "furniture": { - "id": "plant_pot_00" + "id": "plant_pot_00", + "rotation": 0 }, "id": "kitchen_tiles_mint_00" }, @@ -5314,19 +5881,22 @@ }, { "furniture": { - "id": "refrigerator_00" + "id": "refrigerator_00", + "rotation": 0 }, "id": "bathroom_tiles_blue_00" }, { "furniture": { - "id": "countertop_wood" + "id": "countertop_wood", + "rotation": 0 }, "id": "bathroom_tiles_blue_00" }, { "furniture": { - "id": "countertop_wood" + "id": "countertop_wood", + "rotation": 0 }, "id": "bathroom_tiles_blue_00" }, @@ -5485,7 +6055,8 @@ }, { "furniture": { - "id": "table_round_wood" + "id": "table_round_wood", + "rotation": 0 }, "id": "orange_carpet_00" }, @@ -5560,7 +6131,7 @@ }, { "furniture": { - "id": "cabinet_wood_00", + "id": "countertop_wood", "rotation": 90 }, "id": "bathroom_tiles_blue_00" @@ -5604,7 +6175,8 @@ }, { "furniture": { - "id": "chair_wood" + "id": "chair_wood", + "rotation": 0 }, "id": "orange_carpet_00" }, @@ -5724,7 +6296,7 @@ }, { "furniture": { - "id": "cabinet_wood_00", + "id": "bookcase_wood_00", "rotation": 180 }, "id": "orange_carpet_00" @@ -5911,7 +6483,8 @@ }, { "furniture": { - "id": "table_round_wood" + "id": "table_round_wood", + "rotation": 0 }, "id": "floor_wood_boards_08" }, @@ -6027,7 +6600,8 @@ }, { "furniture": { - "id": "chair_wood" + "id": "chair_wood", + "rotation": 0 }, "id": "floor_wood_boards_08" }, @@ -6359,1244 +6933,1179 @@ [ { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 - }, + "id": "brick_wall_01", + "rotation": 180 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 270 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_02", + "rotation": 270 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "red_carpet_00", + "rotation": 270 }, { - "id": "", - "rotation": 0 + "id": "wood_stairs", + "rotation": 270 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 270 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "wood_stairs" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 270 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 270 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 270 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 270 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 270 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { }, { - + "id": "brick_wall_01", + "rotation": 180 }, { }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 270 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 270 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { @@ -7605,284 +8114,263 @@ }, { - + "id": "brick_wall_01", + "rotation": 180 }, { }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - + "id": "brick_wall_01", + "rotation": 180 }, { }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "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": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", @@ -10141,1535 +10629,1537 @@ [ { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bookcase_wood_00", + "rotation": 0 + }, + "id": "orange_carpet_00" }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bookcase_wood_00", + "rotation": 0 + }, + "id": "orange_carpet_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "cabinet_wood_00", + "rotation": 270 + }, + "id": "floor_wood_boards_04", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "chair_wood", + "rotation": 90 + }, + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "table_round_wood", + "rotation": 0 + }, + "id": "floor_wood_boards_04", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bed_wood_single_00", + "rotation": 0 + }, + "id": "floor_wood_boards_04" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "", - "rotation": 0 + "id": "wood_stairs" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_04", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_04", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "plant_pot_00", + "rotation": 270 + }, + "id": "floor_wood_boards_04" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "wood_stairs", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "orange_carpet_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bookcase_wood_00", + "rotation": 0 + }, + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bookcase_wood_00", + "rotation": 0 + }, + "id": "floor_wood_boards_03", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_04", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_07", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "chair_wood", + "rotation": 180 + }, + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_03", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_05" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_07", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "plant_pot_00", + "rotation": 90 + }, + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "table_round_wood", + "rotation": 0 + }, + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_03", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bed_wood_single_00", + "rotation": 180 + }, + "id": "floor_wood_boards_03", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "cabinet_wood_00", + "rotation": 90 + }, + "id": "floor_wood_boards_02", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "plant_pot_00", + "rotation": 180 + }, + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "chair_wood", + "rotation": 180 + }, + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "chair_wood", + "rotation": 180 + }, + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "chair_wood", + "rotation": 180 + }, + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bench_wood", + "rotation": 90 + }, + "id": "blue_carpet_00", + "rotation": 180 }, { - + "id": "brick_wall_01", + "rotation": 180 }, { - + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bed_wood_single_00", + "rotation": 270 + }, + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "table_round_wood", + "rotation": 270 + }, + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bed_wood_single_00", + "rotation": 180 + }, + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bookcase_wood_00", + "rotation": 180 + }, + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "table_round_wood", + "rotation": 180 + }, + "id": "floor_wood_boards_06", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "plant_pot_00", + "rotation": 180 + }, + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bed_wood_single_00", + "rotation": 180 + }, + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "table_round_wood", + "rotation": 180 + }, + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "blue_carpet_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "furniture": { + "id": "bookcase_wood_00", + "rotation": 90 + }, + "id": "blue_carpet_00", + "rotation": 180 }, { - + "id": "brick_wall_01", + "rotation": 180 }, { }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 270 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "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": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", @@ -12829,7 +13319,8 @@ }, { "furniture": { - "id": "table_round_wood" + "id": "table_round_wood", + "rotation": 180 }, "id": "blue_carpet_00" }, @@ -12841,7 +13332,8 @@ }, { "furniture": { - "id": "plant_pot_00" + "id": "plant_pot_00", + "rotation": 180 }, "id": "blue_carpet_00" }, @@ -12889,7 +13381,8 @@ }, { "furniture": { - "id": "table_round_wood" + "id": "table_round_wood", + "rotation": 180 }, "id": "floor_wood_boards_06" }, @@ -12912,7 +13405,7 @@ { "furniture": { "id": "table_round_wood", - "rotation": 90 + "rotation": 270 }, "id": "floor_wood_boards_06" }, @@ -13046,7 +13539,8 @@ }, { "furniture": { - "id": "plant_pot_00" + "id": "plant_pot_00", + "rotation": 180 }, "id": "floor_wood_boards_06" }, @@ -13083,7 +13577,7 @@ { "furniture": { "id": "table_round_wood", - "rotation": 180 + "rotation": 0 }, "id": "floor_wood_boards_02" }, @@ -13093,7 +13587,7 @@ { "furniture": { "id": "plant_pot_00", - "rotation": 270 + "rotation": 90 }, "id": "blue_carpet_00" }, @@ -13499,7 +13993,7 @@ { "furniture": { "id": "plant_pot_00", - "rotation": 90 + "rotation": 270 }, "id": "floor_wood_boards_04", "rotation": 180 @@ -13630,7 +14124,7 @@ { "furniture": { "id": "table_round_wood", - "rotation": 180 + "rotation": 0 }, "id": "floor_wood_boards_04" }, @@ -13700,11 +14194,12 @@ }, { - + "id": "brick_wall_01", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 180 }, { "id": "brick_wall_01" @@ -14024,1535 +14519,1384 @@ [ { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "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_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "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_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 270 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "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_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { }, { - + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_00", + "rotation": 270 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "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_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { }, { - + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "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_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "brick_wall_01", + "rotation": 90 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "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": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", @@ -17868,1251 +18212,1079 @@ [ { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 + }, + { + "id": "", + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 + }, + { + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { @@ -19122,123 +19294,105 @@ }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + "id": "beehive_stones_00" }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { - "id": "", - "rotation": 0 + "id": "arc_stones_floor_00", + "rotation": 90 }, { @@ -19248,155 +19402,126 @@ }, { "id": "", - "rotation": 0 - }, - { - "id": "", - "rotation": 0 - }, - { - "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "id": "", - "rotation": 0 + }, { - "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": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", - "rotation": 0 + "rotation": 180 }, { "id": "", diff --git a/Mods/Core/Maps/Generichouse.png b/Mods/Core/Maps/Generichouse.png index dc5635b98d6d444eb43aeae56aa2121fe5871b4f..aa53eac750b5ec6030b1b460c18493ed8be72228 100644 GIT binary patch literal 4637 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 literal 2936 zcmc(h`8U-2AICpTjI|V9VuloH5N$U*lW0tqY}Znj(8NvI%~-+=m6mHsmM+GYtu)z+ ztYb~GW*hr7lo^HwgTWZ{o%_T0ocsL?zURE(@7E9S*K(eZ^E~hKerj!n5EqdZ0RTW8 zX=Y-}i`aj*kRb1DH}vS?1-@WggfZ~GAF>DlqUVt&m+ix{SMZkipa^J7%mwz^)DiskI3RH`SNT?W22Ec_5 z+_gEBHaYmLAU#F(59G}f%lV}7X!dNhc>JdM-h!#WGdkDR`;OIqcw=>S^}s$Cjb88% z+}OTcbi`CvP2#)Yk)DN$5EmRN^2Iywgl81yrupB zx<>maDVQk5UbO745+jA4k?XJ(!coI7?g<_{mM%V@yT47n8;UxrDB$Jg1vp)b?|f~f z{T?`V>c$5>wcAhIs&v$&w>b(h#Sbzb6EZvmC@`mq5f|SRjfX@N2uy?SMHy*sQVKT zG>Pj>o5)86J8c;X(-p+kv)b2(R6J&ev8dqje%?H^JdY!j$2Cg&e_^u5GlX-Oz=PRKtd-f{ZQbg&a;^<@vR^ws8I}Ubz5%DSt=}|V>8D3=*t2?MWqmv_ zIL!!}8=RNZH5^zrvK!+2@M^u*h%2xt(ij+j&(R|Dj!EFxpoaFuMdU^SDJiqeP#RP4 zioP`sA7%;bJJ%UB#ZVR>E<|VW)@n!elTt6nd zpi`5(;kJKM!K|MsJ9hvIar}Ns**X32wxRJgjhc3x=m;IrXCp<~ksltOGOPM@(VQ>w zWME<3d_>yRFq_2gV{nwmX=~pY{uHjL_GX)Eq6+T`330Uj#hxw+|1~lkX8AOXgPi3yG&abk3A{m$mJ(ujy0lnU-(?Kl5Zo&s6cy| zX9+@^A*u21hvMtof0Z@3bn`_7&)5-QSlj6*LEtAZ4?IGgwIMXEwyn|`Ita#tO4~w_ zAu)$)u@7{ny|Eso9VJ{#p**EP(1Org9FBSjfG_*+^k!ki5i^_=Rsz(8@lqh0cl#Vx zu~N)HW8+gAgfl);&G6*L-j@wMI`A1&|ClnJmbq{Ktj;~{KC@KM2KrD!3U2LcqoqjG6Fu-Pm+9su?!=hVa%WWfr7M<cLYAjf-lq2IapuQS{kS_-sC>A^DTv#AY!^7Aj>nPzts{(T{Jb8D0Bx(xWr ziMUd$KuXS6Eq(zgvcQOIO+Dzr$_9yTC;?aCZhcOY>>9K>-u-?5S2?YCb&S6Q_P{4S zUq5`?iM&%zzH~*^D@D6KA&L%UtpKL_Btgem6_2m+wHfQ>7>kzsBxz>Lwy&=e0aU?5 zXn#XK#5S4VL6X+7y1+k;0e*9M9_}WWTbMRT3k$==&3i#_RYL)puPaK#9USPn>nA^1 zH+@l}p+Ggkb2jP;J24OTa}-JlMPr)VSf$98f6D9LV<0b2D-yQ*CsOu>FUWF^6X4oG`FS z-%q1kf^Dl$k4G`Sd$V#HrI?WeoObQ;sCRR-E&Q{zaBNv0-`9RoDFaqU4)}C~W*%*( zwbcAu@VY}T_;mej0d;?f3G4=YIRBGdK>a~5Jd{@*y|?=+rii*<#RNX;!ACjt+QeL? zehnfwN4T`ZhHf5p&K1>dwv$P^E}`aAl6?BrT4~2@tJlXw#usRwDxE>`f*K)AroD&%vX^$E32gO&LR!(upENx2W$8zz ziZAC)izmDFMi(o$cati#`}rj6tuB)`x+0-hqT-wIjhGc4eT8kb1Tp%9ZB!wD>os%x zXy?0nuZ^p$n2~dhsy+2gTH4QoI{zrYW>x void: # Update the position of the brush preview brushPreviewTexture.global_position = new_position + # Highlight tiles that are in the rectangle that the user has drawn with the mouse func update_rectangle() -> void: if is_drawing and (drawRectangle or copyRectangle): highlight_tiles_in_rect() + #When one of the grid tiles is clicked, we paint the tile accordingly func grid_tile_clicked(clicked_tile) -> void: 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) -> void: @@ -440,6 +443,8 @@ func _on_rotate_right_pressed(): buttonRotateRight.text = str(rotationAmount) brushPreviewTexture.rotation_degrees = rotationAmount brushPreviewTexture.pivot_offset = brushPreviewTexture.size / 2 + if copied_tiles_info["tiles_data"].size() > 0: + rotate_selection_clockwise() # Function to create a 128x128 miniature map of the current level @@ -536,11 +541,28 @@ func rotate_level_clockwise() -> void: currentLevelData = new_level_data -func _on_copy_rectangle_toggled(toggled_on): +# Called when the Copy Rectangle ToggleButton's state changes. +func _on_copy_rectangle_toggled(toggled_on: bool) -> void: copyRectangle = toggled_on + # If it was toggled off, clear the data from copied_tiles_info, clear rotation, and hide the brush preview + if not toggled_on: + copied_tiles_info = {"tiles_data": [], "width": 0, "height": 0} + reset_rotation() + brushPreviewTexture.visible = false + # If it was toggled on, show the brush preview (if there's something to preview) + else: + if copied_tiles_info["tiles_data"].size() > 0: + # You might want to update the brush preview to reflect the copied tiles + update_preview_texture_with_copied_data() + # If there's nothing to copy, perhaps alert the user + else: + print("No tiles copied to preview.") + func copy_selected_tiles_to_memory(): + # We want to start with 0 rotation, the user can rotate it later + reset_rotation() # Get selection dimensions from the new function var selection_dimensions = get_selection_dimensions(start_point, end_point) @@ -585,9 +607,13 @@ func update_preview_texture_with_copied_data(): var idx = 0 # Tile index for tile_data in copied_tiles_info["tiles_data"]: # Assuming tile_data contains a key for 'texture_id' or similar - var texture_id = tile_data["id"] - # You need a way to map 'texture_id' to an actual texture; this is just a conceptual placeholder - var tile_texture: Texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles, texture_id).albedo_texture + var tile_texture: Texture + if tile_data.has("id"): + var texture_id = tile_data["id"] + # You need a way to map 'texture_id' to an actual texture; this is just a conceptual placeholder + tile_texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles, texture_id).albedo_texture + else: + tile_texture = load("res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png") if tile_texture: var tile_image = tile_texture.get_image() @@ -608,6 +634,7 @@ func update_preview_texture_with_copied_data(): # Convert the Image to a Texture and assign it to brushPreviewTexture var texture = ImageTexture.create_from_image(image) brushPreviewTexture.texture = texture + brushPreviewTexture.visible = true func get_index_of_child(clicked_tile: Node) -> int: @@ -618,7 +645,6 @@ func get_index_of_child(clicked_tile: Node) -> int: return -1 # Return -1 if the clicked_tile is not found among the children - # Function to paste copied tile data starting from the clicked tile func paste_copied_tile_data(clicked_tile): # Check if we have copied tile data @@ -626,11 +652,6 @@ func paste_copied_tile_data(clicked_tile): print("No tile data to paste.") return - # Get the starting point from the clicked tile's grid position - #var start_x = clicked_tile.grid_position.x - #var start_y = clicked_tile.grid_position.y - # - # Assuming `clicked_tile` is a direct child of this GridContainer var tile_index = get_index_of_child(clicked_tile) var num_columns = columns # Assuming `columns` is defined as the number of columns in the grid @@ -667,3 +688,42 @@ func paste_copied_tile_data(clicked_tile): func _on_copy_all_levels_toggled(toggled_on): pass # Replace with function body. + + +# Function to rotate the selected tiles in copied_tiles_info 90 degrees clockwise +func rotate_selection_clockwise(): + var new_copied_tiles_info: Dictionary = {"tiles_data": [], "width": copied_tiles_info["height"], "height": copied_tiles_info["width"]} + + # We'll be rotating the tiles, so we need to change width and height + var new_width = copied_tiles_info["height"] + var new_height = copied_tiles_info["width"] + + for y in range(new_height): + for x in range(new_width): + var old_x = new_height - y - 1 + var old_y = x + var old_index = old_y * copied_tiles_info["width"] + old_x + var tile_data = copied_tiles_info["tiles_data"][old_index].duplicate() + + # Add rotation to the tile's data if it has an id + if tile_data.has("id"): + var tile_rotation = int(tile_data.get("rotation", 0)) + tile_data["rotation"] = (tile_rotation + 90) % 360 + + # Rotate furniture if present, initializing rotation to 0 if not set + if tile_data.has("furniture"): + var furniture_rotation = int(tile_data.get("furniture").get("rotation", 0)) + tile_data["furniture"]["rotation"] = (furniture_rotation + 90) % 360 + + # Add rotated tile data to new_copied_tiles_info + new_copied_tiles_info["tiles_data"].append(tile_data) + + # Assign the newly rotated tiles to copied_tiles_info + copied_tiles_info = new_copied_tiles_info + + +# Resets the rotation amount to 0 and updates relevant nodes +func reset_rotation() -> void: + rotationAmount = 0 + brushPreviewTexture.rotation_degrees = rotationAmount + buttonRotateRight.text = str(rotationAmount) diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 662ff2e7..110a58fc 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=25 format=3 uid="uid://d3001f5xxpup1"] +[gd_scene load_steps=29 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"] @@ -35,6 +35,22 @@ unicode = 114 [sub_resource type="Shortcut" id="Shortcut_1tryc"] events = [SubResource("InputEventKey_nrfa0")] +[sub_resource type="InputEventKey" id="InputEventKey_40cts"] +device = -1 +keycode = 67 +unicode = 99 + +[sub_resource type="Shortcut" id="Shortcut_o4ln1"] +events = [SubResource("InputEventKey_40cts")] + +[sub_resource type="InputEventKey" id="InputEventKey_rjlhc"] +device = -1 +keycode = 69 +unicode = 101 + +[sub_resource type="Shortcut" id="Shortcut_jlgdg"] +events = [SubResource("InputEventKey_rjlhc")] + [node name="mapeditor" type="Control" node_paths=PackedStringArray("panWindow", "mapScrollWindow", "gridContainer", "tileGrid")] layout_mode = 3 anchors_preset = 15 @@ -111,6 +127,7 @@ layout_mode = 2 tooltip_text = "Copy tiles in a rectangle. Select this tool and draw a rectangle on the grid. The tiles in your selection will be copied and can be pasted at a later moment." theme_override_icons/checked = ExtResource("5_i6bxh") theme_override_icons/unchecked = ExtResource("6_0266o") +shortcut = SubResource("Shortcut_o4ln1") [node name="CopyAllLevels" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] self_modulate = Color(0.745098, 0.92549, 0.552941, 1) @@ -129,8 +146,11 @@ theme_override_icons/unchecked = ExtResource("3_70koh") [node name="Erase" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 tooltip_text = "Erase tiles on the map" +focus_neighbor_left = NodePath("../DrawRectangle2") +focus_neighbor_right = NodePath("../ShowBelow") theme_override_icons/checked = ExtResource("5_n3fyt") theme_override_icons/unchecked = ExtResource("6_6lnwx") +shortcut = SubResource("Shortcut_jlgdg") [node name="ShowBelow" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 From a83e132af45311c9ce0bd2984c647a7c97a51d31 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 8 Feb 2024 22:28:13 +0100 Subject: [PATCH 07/18] copy selection from all levels --- .../Mapeditor/Scripts/GridContainer.gd | 43 +++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 05d36b17..35ad69ca 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -559,7 +559,6 @@ func _on_copy_rectangle_toggled(toggled_on: bool) -> void: print("No tiles copied to preview.") - func copy_selected_tiles_to_memory(): # We want to start with 0 rotation, the user can rotate it later reset_rotation() @@ -582,9 +581,6 @@ func copy_selected_tiles_to_memory(): var tile_data = tile.tileData.duplicate() # Duplicate the dictionary to ensure a deep copy copied_tiles_info["tiles_data"].append(tile_data) - # For debugging purposes, you might print out the copied_tiles_info to verify - #print("Copied tiles info: ", copied_tiles_info) - # Optionally, update a preview texture or other UI element to visualize the copied data update_preview_texture_with_copied_data() @@ -727,3 +723,42 @@ func reset_rotation() -> void: rotationAmount = 0 brushPreviewTexture.rotation_degrees = rotationAmount buttonRotateRight.text = str(rotationAmount) + + +# Function to get the tile data from mapData for a given index and level +func get_tile_data_from_mapData(index: int, level: int) -> Dictionary: + var level_data = mapData.levels[level] + if index >= 0 and index < level_data.size(): + return level_data[index] + else: + return {} # Return an empty dictionary if the index is out of range + + +func get_tile_indexes_in_rectangle(rect_start, rect_end) -> Array[int]: + var tile_indexes: Array[int] = [] + for tile in get_tiles_in_rectangle(start_point, end_point): + var index = get_index_of_child(tile) + if index != -1: + tile_indexes.append(index) + return tile_indexes + + +# Copies a column of tiles from all levels +# This column is represented by an array +func copy_tiles_from_all_levels(rect_start: Vector2, rect_end: Vector2) -> Array: + var all_levels_copied_data: Array = [] + var tile_indexes = get_tile_indexes_in_rectangle(rect_start, rect_end) + + for level in range(mapData.levels.size()): + var level_data = mapData.levels[level] + if level_data.size() > 0: + var level_copied_tiles: Array = [] + for tile_index in tile_indexes: + var tile_data = get_tile_data_from_mapData(tile_index, level) + if tile_data.size() > 0: # Make sure the tile has data before adding it + level_copied_tiles.append(tile_data) + all_levels_copied_data.append(level_copied_tiles) + + # Now you have all the copied tile data from all levels + # You can process it further as needed + return all_levels_copied_data From b678c792bf7cc0fd988fe10c474eb3acf8dcc19c Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Thu, 8 Feb 2024 23:00:54 +0100 Subject: [PATCH 08/18] Function to paste an entire column --- .../Mapeditor/Scripts/GridContainer.gd | 95 ++++++++++++++++++- 1 file changed, 92 insertions(+), 3 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 35ad69ca..c86b3396 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -758,7 +758,96 @@ func copy_tiles_from_all_levels(rect_start: Vector2, rect_end: Vector2) -> Array if tile_data.size() > 0: # Make sure the tile has data before adding it level_copied_tiles.append(tile_data) all_levels_copied_data.append(level_copied_tiles) - - # Now you have all the copied tile data from all levels - # You can process it further as needed + else: + all_levels_copied_data.append([]) + return all_levels_copied_data + + +# Function to get tiles in range based on the provided start tile index, width, and height +func get_tiles_in_range(start_tile_index: int, width: int, height: int, level_index: int) -> Array: + var tiles_in_range: Array = [] + + # Calculate the start row and column based on the tile index and map width + var start_row: int = start_tile_index / mapData["mapwidth"] + var start_col: int = start_tile_index % mapData["mapwidth"] + + # Calculate the end row and column based on the width and height + var end_row: int = start_row + height + var end_col: int = start_col + width + + # Ensure the range does not exceed the map boundaries + end_row = min(end_row, mapData["mapheight"]) + end_col = min(end_col, mapData["mapwidth"]) + + # Loop through the specified range and collect tile data + for row in range(start_row, end_row): + for col in range(start_col, end_col): + var tile_index: int = row * mapData["mapwidth"] + col + # Ensure the tile index is within the level's data range + if tile_index >= 0 and tile_index < mapData["levels"][level_index].size(): + tiles_in_range.append(mapData["levels"][level_index][tile_index]) + + return tiles_in_range + + +# Function to get tile indexes in range based on the provided start tile index, width, and height +func get_tile_indexes_in_range(start_tile_index: int, width: int, height: int, level_index: int) -> Array: + var tile_indexes: Array = [] + + # Calculate the start row and column based on the tile index and map width + var start_row: int = start_tile_index / mapData["mapwidth"] + var start_col: int = start_tile_index % mapData["mapwidth"] + + # Calculate the end row and column based on the width and height + var end_row: int = start_row + height + var end_col: int = start_col + width + + # Ensure the range does not exceed the map boundaries + end_row = min(end_row, mapData["mapheight"]) + end_col = min(end_col, mapData["mapwidth"]) + + # Loop through the specified range and collect tile indexes + for row in range(start_row, end_row): + for col in range(start_col, end_col): + var tile_index: int = row * mapData["mapwidth"] + col + # Ensure the tile index is within the map's total number of tiles + if tile_index < mapData["levels"][level_index].size(): + tile_indexes.append(tile_index) + + return tile_indexes + + +func apply_column_tiles_to_all_levels(clicked_tile: Control) -> void: + # Get the index of the clicked tile + var clicked_tile_index = get_index_of_child(clicked_tile) + + # Get selection dimensions from the new function + var selection_dimensions = get_selection_dimensions(start_point, end_point) + + # Update copied_tiles_info with the new dimensions + var width = selection_dimensions["width"] + var height = selection_dimensions["height"] + + # Copy tiles from all levels based on the clicked column + var copied_column_data = copy_tiles_from_all_levels(start_point, end_point) + + # Get the required tile indexes in range for the target location + # Assuming we use the same clicked_tile_index for simplicity; adjust as needed for the target location + var target_tile_indexes = get_tile_indexes_in_range(clicked_tile_index, width, height, currentLevel) + + # Loop over all levels in mapData + for level_index in range(mapData["levels"].size()): + var level_data = mapData["levels"][level_index] + # Ensure there's corresponding copied data for this level + if level_index < copied_column_data.size(): + var column_data_for_level = copied_column_data[level_index] + for i in range(min(target_tile_indexes.size(), column_data_for_level.size())): + var target_index = target_tile_indexes[i] + # Check if target index is within the current level data range + if target_index >= 0 and target_index < level_data.size(): + # Apply the copied tile data to the target tile index + level_data[target_index] = column_data_for_level[i] + + # After pasting, reload the current level's data + loadLevelData(currentLevel) From 14b1b31c86c4c724205229c7ef96b050795aa6f4 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 9 Feb 2024 13:28:38 +0100 Subject: [PATCH 09/18] add editormode --- .../Mapeditor/Scripts/GridContainer.gd | 58 +++++++++++++------ .../ContentManager/Mapeditor/mapeditor.tscn | 6 +- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index c86b3396..a94aa634 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -13,8 +13,14 @@ var currentLevelData: Array = [] @export var buttonRotateRight: Button var selected_brush: Control -var drawRectangle: bool = false -var copyRectangle: bool = false +enum EditorMode { + NONE, + DRAW_RECTANGLE, # When the user has clicked the DrawRectangle checkbox + COPY_RECTANGLE, # When the user has clicked the CopyRectangle checkbox + COPY_ALL_LEVELS # When the user has clicked the CopyAllLevels checkbox +} +# Replace your booleans with a single variable to track the current editor mode +var currentMode: EditorMode = EditorMode.NONE var erase: bool = false var showBelow: bool = false var showAbove: bool = false @@ -110,15 +116,21 @@ func _input(event) -> void: if is_drawing: var drag_threshold: int = 5 # Pixels var distance_dragged = start_point.distance_to(end_point) - if distance_dragged <= drag_threshold and copyRectangle: + + if distance_dragged <= drag_threshold: print_debug("Released the mouse button, but clicked instead of dragged") - elif drawRectangle and not copyRectangle: - # Paint in the rectangle if drawRectangle is enabled - paint_in_rectangle() - elif copyRectangle and !drawRectangle: - # Copy selected tiles to memory if copyRectangle is - # enabled and not in drawRectangle mode - copy_selected_tiles_to_memory() + else: + match currentMode: + EditorMode.DRAW_RECTANGLE: + # Paint in the rectangle if drawRectangle is enabled + paint_in_rectangle() + EditorMode.COPY_RECTANGLE: + # Copy selected tiles to memory if copyRectangle is + # enabled and not in drawRectangle mode + copy_selected_tiles_to_memory() + EditorMode.COPY_ALL_LEVELS: + # Handle new feature for copying all levels + pass unhighlight_tiles() is_drawing = false @@ -127,7 +139,7 @@ func _input(event) -> void: if event is InputEventMouseMotion: end_point = event.global_position if is_drawing: - if drawRectangle or copyRectangle: + if not currentMode == EditorMode.NONE: update_rectangle() # Calculate new position for the brush preview @@ -143,7 +155,7 @@ func _input(event) -> void: # Highlight tiles that are in the rectangle that the user has drawn with the mouse func update_rectangle() -> void: - if is_drawing and (drawRectangle or copyRectangle): + if is_drawing and not currentMode == EditorMode.NONE: highlight_tiles_in_rect() @@ -156,11 +168,11 @@ func grid_tile_clicked(clicked_tile) -> void: # 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) -> void: - if drawRectangle or !clicked_tile: + if currentMode == EditorMode.DRAW_RECTANGLE or !clicked_tile: return # New condition to check if copyRectangle is true and copied_tiles_info has data - if copyRectangle: + if currentMode == EditorMode.DRAW_RECTANGLE: if copied_tiles_info["tiles_data"].size() > 0: paste_copied_tile_data(clicked_tile) return # Return after pasting to avoid executing further code @@ -378,7 +390,10 @@ func _on_erase_toggled(button_pressed): func _on_draw_rectangle_toggled(button_pressed): - drawRectangle = button_pressed + if button_pressed: + currentMode = EditorMode.DRAW_RECTANGLE + else: + currentMode = EditorMode.NONE func _on_tilebrush_list_tile_brush_selection_change(tilebrush): @@ -541,16 +556,18 @@ func rotate_level_clockwise() -> void: currentLevelData = new_level_data + # Called when the Copy Rectangle ToggleButton's state changes. func _on_copy_rectangle_toggled(toggled_on: bool) -> void: - copyRectangle = toggled_on # If it was toggled off, clear the data from copied_tiles_info, clear rotation, and hide the brush preview if not toggled_on: + currentMode = EditorMode.NONE copied_tiles_info = {"tiles_data": [], "width": 0, "height": 0} reset_rotation() brushPreviewTexture.visible = false # If it was toggled on, show the brush preview (if there's something to preview) else: + currentMode = EditorMode.COPY_RECTANGLE if copied_tiles_info["tiles_data"].size() > 0: # You might want to update the brush preview to reflect the copied tiles update_preview_texture_with_copied_data() @@ -654,7 +671,7 @@ func paste_copied_tile_data(clicked_tile): # Calculate the grid position from the tile index var start_x = tile_index % num_columns - var start_y = tile_index / num_columns + var start_y = float(tile_index) / num_columns # Calculate the ending points based on the width and height from copied_tiles_info @@ -683,7 +700,10 @@ func paste_copied_tile_data(clicked_tile): func _on_copy_all_levels_toggled(toggled_on): - pass # Replace with function body. + if toggled_on: + currentMode = EditorMode.COPY_ALL_LEVELS + else: + currentMode = EditorMode.NONE # Function to rotate the selected tiles in copied_tiles_info 90 degrees clockwise @@ -736,7 +756,7 @@ func get_tile_data_from_mapData(index: int, level: int) -> Dictionary: func get_tile_indexes_in_rectangle(rect_start, rect_end) -> Array[int]: var tile_indexes: Array[int] = [] - for tile in get_tiles_in_rectangle(start_point, end_point): + for tile in get_tiles_in_rectangle(rect_start, rect_end): var index = get_index_of_child(tile) if index != -1: tile_indexes.append(index) diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 110a58fc..2dbf54d2 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -137,7 +137,7 @@ tooltip_text = "Copy tiles in a rectangle. All layers will be copied, not just t theme_override_icons/checked = ExtResource("5_i6bxh") theme_override_icons/unchecked = ExtResource("6_0266o") -[node name="DrawRectangle2" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] +[node name="DrawRectangle" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 tooltip_text = "Paint in a rectangle" theme_override_icons/checked = ExtResource("3_eu7pp") @@ -146,7 +146,7 @@ theme_override_icons/unchecked = ExtResource("3_70koh") [node name="Erase" type="CheckBox" parent="HSplitContainer/MapeditorContainer/Toolbar"] layout_mode = 2 tooltip_text = "Erase tiles on the map" -focus_neighbor_left = NodePath("../DrawRectangle2") +focus_neighbor_left = NodePath("../DrawRectangle") focus_neighbor_right = NodePath("../ShowBelow") theme_override_icons/checked = ExtResource("5_n3fyt") theme_override_icons/unchecked = ExtResource("6_6lnwx") @@ -287,7 +287,7 @@ offset_bottom = 40.0 [connection signal="pressed" from="HSplitContainer/MapeditorContainer/Toolbar/RotateRight" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_rotate_right_pressed"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/CopyRectangle" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_copy_rectangle_toggled"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/CopyAllLevels" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_copy_all_levels_toggled"] -[connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/DrawRectangle2" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_draw_rectangle_toggled"] +[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"] [connection signal="toggled" from="HSplitContainer/MapeditorContainer/Toolbar/ShowAbove" to="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer/TileGrid" method="_on_show_above_toggled"] From 8ee67cf81c5c9db4f7a107c15ee95daa27e81a36 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Fri, 9 Feb 2024 23:28:54 +0100 Subject: [PATCH 10/18] Copy paste a column works --- .../Mapeditor/Scripts/GridContainer.gd | 89 +++++++++++-------- 1 file changed, 53 insertions(+), 36 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index a94aa634..548b812c 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -33,7 +33,7 @@ var end_point = Vector2() var is_drawing = false var snapLevel: Vector2 = Vector2(snapAmount, snapAmount).round() # Variable to hold copied tile data along with dimensions -var copied_tiles_info: Dictionary = {"tiles_data": [], "width": 0, "height": 0} +var copied_tiles_info: Dictionary = {"tiles_data": [], "all_levels_data": [], "width": 0, "height": 0} #Contains map metadata like size as well as the data on all levels @@ -129,8 +129,8 @@ func _input(event) -> void: # enabled and not in drawRectangle mode copy_selected_tiles_to_memory() EditorMode.COPY_ALL_LEVELS: - # Handle new feature for copying all levels - pass + # Handle copying all levels + copy_tiles_from_all_levels(start_point, end_point) unhighlight_tiles() is_drawing = false @@ -161,24 +161,25 @@ func update_rectangle() -> void: #When one of the grid tiles is clicked, we paint the tile accordingly func grid_tile_clicked(clicked_tile) -> void: - if is_drawing: - paint_single_tile(clicked_tile) + if not clicked_tile or not is_drawing: + return + + match currentMode: + EditorMode.DRAW_RECTANGLE: + return + EditorMode.COPY_RECTANGLE: + if copied_tiles_info["tiles_data"].size() > 0: + paste_copied_tile_data(clicked_tile) + EditorMode.COPY_ALL_LEVELS: + if copied_tiles_info["all_levels_data"].size() > 0: + apply_column_tiles_to_all_levels(clicked_tile) + EditorMode.NONE: + 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) -> void: - if currentMode == EditorMode.DRAW_RECTANGLE or !clicked_tile: - return - - # New condition to check if copyRectangle is true and copied_tiles_info has data - if currentMode == EditorMode.DRAW_RECTANGLE: - if copied_tiles_info["tiles_data"].size() > 0: - paste_copied_tile_data(clicked_tile) - return # Return after pasting to avoid executing further code - else: - return - if erase: if selected_brush: if selected_brush.entityType == "mob": @@ -556,13 +557,12 @@ func rotate_level_clockwise() -> void: currentLevelData = new_level_data - # Called when the Copy Rectangle ToggleButton's state changes. func _on_copy_rectangle_toggled(toggled_on: bool) -> void: # If it was toggled off, clear the data from copied_tiles_info, clear rotation, and hide the brush preview if not toggled_on: currentMode = EditorMode.NONE - copied_tiles_info = {"tiles_data": [], "width": 0, "height": 0} + reset_copied_tiles_info() reset_rotation() brushPreviewTexture.visible = false # If it was toggled on, show the brush preview (if there's something to preview) @@ -583,7 +583,7 @@ func copy_selected_tiles_to_memory(): var selection_dimensions = get_selection_dimensions(start_point, end_point) # Clear previous copied tiles info - copied_tiles_info["tiles_data"].clear() + reset_copied_tiles_info() # Get all tiles within the selected rectangle var selected_tiles = get_tiles_in_rectangle(start_point, end_point) @@ -695,7 +695,7 @@ func paste_copied_tile_data(clicked_tile): tile_data_index += 1 # Clear copied_tiles_info after pasting - copied_tiles_info = {"tiles_data": [], "width": 0, "height": 0} + reset_copied_tiles_info() print("Pasted tile data and cleared copied_tiles_info.") @@ -763,25 +763,37 @@ func get_tile_indexes_in_rectangle(rect_start, rect_end) -> Array[int]: return tile_indexes +# Function to copy tiles from all levels based on a selection rectangle # Copies a column of tiles from all levels # This column is represented by an array -func copy_tiles_from_all_levels(rect_start: Vector2, rect_end: Vector2) -> Array: - var all_levels_copied_data: Array = [] - var tile_indexes = get_tile_indexes_in_rectangle(rect_start, rect_end) +func copy_tiles_from_all_levels(rect_start: Vector2, rect_end: Vector2) -> void: + reset_copied_tiles_info() + + # Calculate the dimensions of the selection + var selection_dimensions = get_selection_dimensions(rect_start, rect_end) + # Update copied_tiles_info with the dimensions of the selection + copied_tiles_info["width"] = selection_dimensions["width"] + copied_tiles_info["height"] = selection_dimensions["height"] + + var tile_indexes = get_tile_indexes_in_rectangle(rect_start, rect_end) + + # Iterate through all levels to copy tiles for level in range(mapData.levels.size()): var level_data = mapData.levels[level] + var level_copied_tiles: Array = [] + if level_data.size() > 0: - var level_copied_tiles: Array = [] for tile_index in tile_indexes: var tile_data = get_tile_data_from_mapData(tile_index, level) - if tile_data.size() > 0: # Make sure the tile has data before adding it + if tile_data.size() > 0: # Ensure the tile has data before adding level_copied_tiles.append(tile_data) - all_levels_copied_data.append(level_copied_tiles) + + # Add the copied data for this level to the all_levels_data + copied_tiles_info["all_levels_data"].append(level_copied_tiles) else: - all_levels_copied_data.append([]) + copied_tiles_info["all_levels_data"].append([]) - return all_levels_copied_data # Function to get tiles in range based on the provided start tile index, width, and height @@ -817,7 +829,7 @@ func get_tile_indexes_in_range(start_tile_index: int, width: int, height: int, l # Calculate the start row and column based on the tile index and map width var start_row: int = start_tile_index / mapData["mapwidth"] - var start_col: int = start_tile_index % mapData["mapwidth"] + var start_col: int = start_tile_index % int(mapData["mapwidth"]) # Calculate the end row and column based on the width and height var end_row: int = start_row + height @@ -842,15 +854,11 @@ func apply_column_tiles_to_all_levels(clicked_tile: Control) -> void: # Get the index of the clicked tile var clicked_tile_index = get_index_of_child(clicked_tile) - # Get selection dimensions from the new function - var selection_dimensions = get_selection_dimensions(start_point, end_point) - - # Update copied_tiles_info with the new dimensions - var width = selection_dimensions["width"] - var height = selection_dimensions["height"] + var width = copied_tiles_info["width"] + var height = copied_tiles_info["height"] # Copy tiles from all levels based on the clicked column - var copied_column_data = copy_tiles_from_all_levels(start_point, end_point) + var copied_column_data = copied_tiles_info["all_levels_data"] # Get the required tile indexes in range for the target location # Assuming we use the same clicked_tile_index for simplicity; adjust as needed for the target location @@ -871,3 +879,12 @@ func apply_column_tiles_to_all_levels(clicked_tile: Control) -> void: # After pasting, reload the current level's data loadLevelData(currentLevel) + reset_copied_tiles_info() + + +# Resets the copied_tiles_info dictionary to its default values. +func reset_copied_tiles_info() -> void: + copied_tiles_info["tiles_data"] = [] + copied_tiles_info["all_levels_data"] = [] + copied_tiles_info["width"] = 0 + copied_tiles_info["height"] = 0 From 5705c002301491fdef3a10cddcc5e6588b96a1d1 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 10 Feb 2024 13:36:13 +0100 Subject: [PATCH 11/18] Fix rotating the selection --- .../Mapeditor/Scripts/GridContainer.gd | 79 +++++++++++++------ 1 file changed, 56 insertions(+), 23 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 548b812c..0f0445c3 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -602,6 +602,14 @@ func copy_selected_tiles_to_memory(): update_preview_texture_with_copied_data() +func get_index_of_child(clicked_tile: Node) -> int: + var children = get_children() # Get all children of this GridContainer + for i in range(len(children)): + if children[i] == clicked_tile: + return i # Return the index if the child matches the clicked_tile + return -1 # Return -1 if the clicked_tile is not found among the children + + func update_preview_texture_with_copied_data(): var preview_size = Vector2(512, 512) # Size of the preview texture var tiles_width = copied_tiles_info["width"] @@ -613,20 +621,19 @@ func update_preview_texture_with_copied_data(): var tile_size_y = preview_size.y / tiles_height var tile_size = Vector2(tile_size_x, tile_size_y) - # Create a new Image with a size of 128x128 pixels + # Create a new Image with a size of 512x512 pixels var image = Image.create(preview_size.x, preview_size.y, false, Image.FORMAT_RGBA8) - #image.fill(Color(0, 0, 0, 0)) # Fill with transparent color - - var idx = 0 # Tile index - for tile_data in copied_tiles_info["tiles_data"]: - # Assuming tile_data contains a key for 'texture_id' or similar - var tile_texture: Texture - if tile_data.has("id"): - var texture_id = tile_data["id"] - # You need a way to map 'texture_id' to an actual texture; this is just a conceptual placeholder - tile_texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles, texture_id).albedo_texture - else: - tile_texture = load("res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png") + + # Determine the source of tile data based on current mode + var tile_data_source = [] + if currentMode == EditorMode.COPY_ALL_LEVELS and copied_tiles_info["all_levels_data"].size() > currentLevel: + tile_data_source = copied_tiles_info["all_levels_data"][currentLevel] + else: + tile_data_source = copied_tiles_info["tiles_data"] + + var idx = 0 # Tile index for positioning tiles in the preview + for tile_data in tile_data_source: + var tile_texture: Texture = get_texture_from_tile_data(tile_data) if tile_texture: var tile_image = tile_texture.get_image() @@ -637,25 +644,30 @@ func update_preview_texture_with_copied_data(): var pos_y = (idx / tiles_width) * tile_size.y var pos_in_preview = Vector2(pos_x, pos_y) - # Convert the tile image to the same format as the main image - tile_image.convert(Image.FORMAT_RGBA8) + # Ensure the tile image is in the correct format + if tile_image.get_format() != Image.FORMAT_RGBA8: + 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()), pos_in_preview) - idx += 1 # Move to the next tile + idx += 1 - # Convert the Image to a Texture and assign it to brushPreviewTexture + # Update the brushPreviewTexture with the generated image var texture = ImageTexture.create_from_image(image) brushPreviewTexture.texture = texture brushPreviewTexture.visible = true -func get_index_of_child(clicked_tile: Node) -> int: - var children = get_children() # Get all children of this GridContainer - for i in range(len(children)): - if children[i] == clicked_tile: - return i # Return the index if the child matches the clicked_tile - return -1 # Return -1 if the clicked_tile is not found among the children +func get_texture_from_tile_data(tile_data: Dictionary) -> Texture: + var tile_texture: Texture + if tile_data.has("id"): + var texture_id = tile_data["id"] + # You need a way to map 'texture_id' to an actual texture; this is just a conceptual placeholder + tile_texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles, texture_id).albedo_texture + else: + tile_texture = load("res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png") + return tile_texture # Function to paste copied tile data starting from the clicked tile @@ -706,6 +718,7 @@ func _on_copy_all_levels_toggled(toggled_on): currentMode = EditorMode.NONE + # Function to rotate the selected tiles in copied_tiles_info 90 degrees clockwise func rotate_selection_clockwise(): var new_copied_tiles_info: Dictionary = {"tiles_data": [], "width": copied_tiles_info["height"], "height": copied_tiles_info["width"]} @@ -736,6 +749,26 @@ func rotate_selection_clockwise(): # Assign the newly rotated tiles to copied_tiles_info copied_tiles_info = new_copied_tiles_info + mirror_copied_tiles_info() # Mirror the tiles after rotation + + +# Function to mirror copied_tiles_info in both directions +func mirror_copied_tiles_info(): + var mirrored_tiles_data: Array = [] + var width = copied_tiles_info["width"] + var height = copied_tiles_info["height"] + + # Mirror vertically and horizontally by iterating in reverse order + for y in range(height - 1, -1, -1): + for x in range(width - 1, -1, -1): + var original_index = y * width + x + var mirrored_data = copied_tiles_info["tiles_data"][original_index].duplicate() + + # Add the mirrored tile data to the new array + mirrored_tiles_data.append(mirrored_data) + + # Update copied_tiles_info with the mirrored tile data + copied_tiles_info["tiles_data"] = mirrored_tiles_data # Resets the rotation amount to 0 and updates relevant nodes From a979d7eff8cfd87bd7093a278e087a748a33d89f Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 10 Feb 2024 18:31:31 +0100 Subject: [PATCH 12/18] Tidy up the code --- .../Mapeditor/Scripts/GridContainer.gd | 115 ++++++++---------- 1 file changed, 50 insertions(+), 65 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 0f0445c3..702b3850 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -47,6 +47,7 @@ var mapData: Dictionary = defaultMapData.duplicate(): signal zoom_level_changed(zoom_level: int) +# This function is called when the parent mapeditor node is ready func _on_mapeditor_ready() -> void: columns = mapEditor.mapWidth levelgrid_below.columns = mapEditor.mapWidth @@ -76,7 +77,6 @@ func create_level_tiles(grid: GridContainer, width: int, height: int, connect_si tile_instance.set_clickable(connect_signals) - #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) -> void: #The mapeditor may be invisible if the user selects another tab in the content editor @@ -310,8 +310,8 @@ func get_tiles_in_rectangle(rect_start: Vector2, rect_end: Vector2) -> Array: return tiles_in_rectangle - -# This function calculates the dimensions of the selected tiles in terms of how many tiles were selected horizontally (width) and vertically (height). +# This function calculates the dimensions of the selected tiles in terms of +# how many tiles were selected horizontally (width) and vertically (height). func get_selection_dimensions(rect_start: Vector2, rect_end: Vector2) -> Dictionary: var selected_tiles = get_tiles_in_rectangle(rect_start, rect_end) var x_positions = [] @@ -390,6 +390,7 @@ func _on_erase_toggled(button_pressed): erase = button_pressed +# When the user toggles the draw rectangle button in the toolbar func _on_draw_rectangle_toggled(button_pressed): if button_pressed: currentMode = EditorMode.DRAW_RECTANGLE @@ -397,11 +398,13 @@ func _on_draw_rectangle_toggled(button_pressed): currentMode = EditorMode.NONE +# When the user has selected one of the tile brushes to paint with func _on_tilebrush_list_tile_brush_selection_change(tilebrush): selected_brush = tilebrush update_preview_texture() +# The cursor will have a preview of the texture that the user will paint with next to it func update_preview_texture(): if selected_brush: brushPreviewTexture.texture = selected_brush.get_texture() @@ -410,6 +413,7 @@ func update_preview_texture(): brushPreviewTexture.visible = false +# When the user presses the show below button, we show a transparant view of the level below the current level func _on_show_below_toggled(button_pressed): showBelow = button_pressed if showBelow: @@ -576,45 +580,47 @@ func _on_copy_rectangle_toggled(toggled_on: bool) -> void: print("No tiles copied to preview.") +# Called when the user has drawn a rectangle with the copy button toggled on +# This will store the data of the selected tiles to a variable func copy_selected_tiles_to_memory(): - # We want to start with 0 rotation, the user can rotate it later - reset_rotation() - # Get selection dimensions from the new function - var selection_dimensions = get_selection_dimensions(start_point, end_point) - - # Clear previous copied tiles info - reset_copied_tiles_info() + reset_rotation() # We want to start with 0 rotation, the user can rotate it later + reset_copied_tiles_info() # Clear previous copied tiles info + # Get selection dimensions represented by an amount of tiles + var selection_dimensions = get_selection_dimensions(start_point, end_point) # Get all tiles within the selected rectangle var selected_tiles = get_tiles_in_rectangle(start_point, end_point) - + # Update copied_tiles_info with the new dimensions copied_tiles_info["width"] = selection_dimensions["width"] copied_tiles_info["height"] = selection_dimensions["height"] - + # Copy each tile's data to the copied_tiles_info dictionary for tile in selected_tiles: # Assuming each tile has a script with a property 'tileData' that contains its data var tile_data = tile.tileData.duplicate() # Duplicate the dictionary to ensure a deep copy copied_tiles_info["tiles_data"].append(tile_data) - - # Optionally, update a preview texture or other UI element to visualize the copied data + + # Update a preview texture or other UI element to visualize the copied data update_preview_texture_with_copied_data() +# Return the index if the child matches the clicked_tile func get_index_of_child(clicked_tile: Node) -> int: var children = get_children() # Get all children of this GridContainer for i in range(len(children)): if children[i] == clicked_tile: - return i # Return the index if the child matches the clicked_tile + return i return -1 # Return -1 if the clicked_tile is not found among the children +# We create an image and put it as the brush preview texture +# THe image is made from tiles that were selected previously +# This provides a preview of what will be pasted func update_preview_texture_with_copied_data(): var preview_size = Vector2(512, 512) # Size of the preview texture var tiles_width = copied_tiles_info["width"] var tiles_height = copied_tiles_info["height"] - print_debug("tiles_width = " + str(tiles_width) + ", tiles_height = " + str(tiles_height)) # Calculate size for each tile in the preview to fit all copied tiles var tile_size_x = preview_size.x / tiles_width @@ -634,7 +640,6 @@ func update_preview_texture_with_copied_data(): var idx = 0 # Tile index for positioning tiles in the preview for tile_data in tile_data_source: var tile_texture: Texture = get_texture_from_tile_data(tile_data) - if tile_texture: var tile_image = tile_texture.get_image() tile_image.resize(tile_size.x, tile_size.y) # Resize image to fit the preview @@ -659,11 +664,11 @@ func update_preview_texture_with_copied_data(): brushPreviewTexture.visible = true +# Returns the texture associated with the tile id or the default empty tile if id is missing func get_texture_from_tile_data(tile_data: Dictionary) -> Texture: var tile_texture: Texture if tile_data.has("id"): var texture_id = tile_data["id"] - # You need a way to map 'texture_id' to an actual texture; this is just a conceptual placeholder tile_texture = Gamedata.get_sprite_by_id(Gamedata.data.tiles, texture_id).albedo_texture else: tile_texture = load("res://Scenes/ContentManager/Mapeditor/Images/emptyTile.png") @@ -674,18 +679,17 @@ func get_texture_from_tile_data(tile_data: Dictionary) -> Texture: func paste_copied_tile_data(clicked_tile): # Check if we have copied tile data if copied_tiles_info.is_empty(): - print("No tile data to paste.") + print_debug("No tile data to paste.") return - # Assuming `clicked_tile` is a direct child of this GridContainer + # `clicked_tile` is a direct child of this GridContainer var tile_index = get_index_of_child(clicked_tile) - var num_columns = columns # Assuming `columns` is defined as the number of columns in the grid + var num_columns = columns # `columns` is defined as the number of columns in the grid # Calculate the grid position from the tile index var start_x = tile_index % num_columns var start_y = float(tile_index) / num_columns - - + # Calculate the ending points based on the width and height from copied_tiles_info var end_x = min(start_x + copied_tiles_info["width"], 32) var end_y = min(start_y + copied_tiles_info["height"], 32) @@ -706,11 +710,11 @@ func paste_copied_tile_data(clicked_tile): current_tile.tileData = copied_tiles_info["tiles_data"][tile_data_index] tile_data_index += 1 - # Clear copied_tiles_info after pasting - reset_copied_tiles_info() - print("Pasted tile data and cleared copied_tiles_info.") + reset_copied_tiles_info() # Clear copied_tiles_info after pasting + brushPreviewTexture.visible = false +# When the user toggles the copy all levels button in the toolbar func _on_copy_all_levels_toggled(toggled_on): if toggled_on: currentMode = EditorMode.COPY_ALL_LEVELS @@ -718,10 +722,9 @@ func _on_copy_all_levels_toggled(toggled_on): currentMode = EditorMode.NONE - # Function to rotate the selected tiles in copied_tiles_info 90 degrees clockwise func rotate_selection_clockwise(): - var new_copied_tiles_info: Dictionary = {"tiles_data": [], "width": copied_tiles_info["height"], "height": copied_tiles_info["width"]} + var new_copied_tiles_info: Dictionary = {"tiles_data": [], "all_levels_data": [], "width": copied_tiles_info["height"], "height": copied_tiles_info["width"]} # We'll be rotating the tiles, so we need to change width and height var new_width = copied_tiles_info["height"] @@ -749,10 +752,12 @@ func rotate_selection_clockwise(): # Assign the newly rotated tiles to copied_tiles_info copied_tiles_info = new_copied_tiles_info - mirror_copied_tiles_info() # Mirror the tiles after rotation + # Mirror the tiles after rotation. This is required because the rotation function + # will mirror them, so we need to mirror them back + mirror_copied_tiles_info() -# Function to mirror copied_tiles_info in both directions +# Function to mirror copied_tiles_info in both directions (up, down, left, right) func mirror_copied_tiles_info(): var mirrored_tiles_data: Array = [] var width = copied_tiles_info["width"] @@ -787,6 +792,8 @@ func get_tile_data_from_mapData(index: int, level: int) -> Dictionary: return {} # Return an empty dictionary if the index is out of range +# Returns the index of tiles in the grid, a number between 0 an 1024 +# THe index is the location of the tile in the current level func get_tile_indexes_in_rectangle(rect_start, rect_end) -> Array[int]: var tile_indexes: Array[int] = [] for tile in get_tiles_in_rectangle(rect_start, rect_end): @@ -800,15 +807,16 @@ func get_tile_indexes_in_rectangle(rect_start, rect_end) -> Array[int]: # Copies a column of tiles from all levels # This column is represented by an array func copy_tiles_from_all_levels(rect_start: Vector2, rect_end: Vector2) -> void: - reset_copied_tiles_info() + reset_copied_tiles_info() # Clear the previous selection if there is any - # Calculate the dimensions of the selection + # Calculate the dimensions of the selection as an amount of tiles var selection_dimensions = get_selection_dimensions(rect_start, rect_end) # Update copied_tiles_info with the dimensions of the selection copied_tiles_info["width"] = selection_dimensions["width"] copied_tiles_info["height"] = selection_dimensions["height"] + # Keep track of the indexes of the tiles in the mapData level var tile_indexes = get_tile_indexes_in_rectangle(rect_start, rect_end) # Iterate through all levels to copy tiles @@ -825,38 +833,12 @@ func copy_tiles_from_all_levels(rect_start: Vector2, rect_end: Vector2) -> void: # Add the copied data for this level to the all_levels_data copied_tiles_info["all_levels_data"].append(level_copied_tiles) else: + # To make sure we always have 21 levels, we append an empty array for levels with no tiles copied_tiles_info["all_levels_data"].append([]) - -# Function to get tiles in range based on the provided start tile index, width, and height -func get_tiles_in_range(start_tile_index: int, width: int, height: int, level_index: int) -> Array: - var tiles_in_range: Array = [] - - # Calculate the start row and column based on the tile index and map width - var start_row: int = start_tile_index / mapData["mapwidth"] - var start_col: int = start_tile_index % mapData["mapwidth"] - - # Calculate the end row and column based on the width and height - var end_row: int = start_row + height - var end_col: int = start_col + width - - # Ensure the range does not exceed the map boundaries - end_row = min(end_row, mapData["mapheight"]) - end_col = min(end_col, mapData["mapwidth"]) - - # Loop through the specified range and collect tile data - for row in range(start_row, end_row): - for col in range(start_col, end_col): - var tile_index: int = row * mapData["mapwidth"] + col - # Ensure the tile index is within the level's data range - if tile_index >= 0 and tile_index < mapData["levels"][level_index].size(): - tiles_in_range.append(mapData["levels"][level_index][tile_index]) - - return tiles_in_range - - # Function to get tile indexes in range based on the provided start tile index, width, and height +# The level_index does not really matter, as long as it's a level with tiles in it func get_tile_indexes_in_range(start_tile_index: int, width: int, height: int, level_index: int) -> Array: var tile_indexes: Array = [] @@ -883,6 +865,10 @@ func get_tile_indexes_in_range(start_tile_index: int, width: int, height: int, l return tile_indexes +# This function will apply copied_tiles_info["all_levels_data"] to the map +# starting from the clicked tile and moving left to right, up to down +# The amount of tiles is determined by what was selected in copy_tiles_from_all_levels +# Each level in the data is applied to the same level that it was copied from func apply_column_tiles_to_all_levels(clicked_tile: Control) -> void: # Get the index of the clicked tile var clicked_tile_index = get_index_of_child(clicked_tile) @@ -890,11 +876,11 @@ func apply_column_tiles_to_all_levels(clicked_tile: Control) -> void: var width = copied_tiles_info["width"] var height = copied_tiles_info["height"] - # Copy tiles from all levels based on the clicked column + # We are using the tiles that were selected earlier var copied_column_data = copied_tiles_info["all_levels_data"] # Get the required tile indexes in range for the target location - # Assuming we use the same clicked_tile_index for simplicity; adjust as needed for the target location + # Since we are pasting a column of tiles, the indexes will be the same on every level var target_tile_indexes = get_tile_indexes_in_range(clicked_tile_index, width, height, currentLevel) # Loop over all levels in mapData @@ -910,9 +896,8 @@ func apply_column_tiles_to_all_levels(clicked_tile: Control) -> void: # Apply the copied tile data to the target tile index level_data[target_index] = column_data_for_level[i] - # After pasting, reload the current level's data - loadLevelData(currentLevel) - reset_copied_tiles_info() + loadLevelData(currentLevel) # After pasting, reload the current level's data + reset_copied_tiles_info() # Clear the selection # Resets the copied_tiles_info dictionary to its default values. From d12427ace2d97579f5945c4ea09ec2423b2c1a64 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sat, 10 Feb 2024 19:23:59 +0100 Subject: [PATCH 13/18] Refactor rotation --- .../Mapeditor/Scripts/GridContainer.gd | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 702b3850..da8cfa7d 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -729,51 +729,55 @@ func rotate_selection_clockwise(): # We'll be rotating the tiles, so we need to change width and height var new_width = copied_tiles_info["height"] var new_height = copied_tiles_info["width"] - - for y in range(new_height): - for x in range(new_width): - var old_x = new_height - y - 1 - var old_y = x - var old_index = old_y * copied_tiles_info["width"] + old_x - var tile_data = copied_tiles_info["tiles_data"][old_index].duplicate() - - # Add rotation to the tile's data if it has an id - if tile_data.has("id"): - var tile_rotation = int(tile_data.get("rotation", 0)) - tile_data["rotation"] = (tile_rotation + 90) % 360 - - # Rotate furniture if present, initializing rotation to 0 if not set - if tile_data.has("furniture"): - var furniture_rotation = int(tile_data.get("furniture").get("rotation", 0)) - tile_data["furniture"]["rotation"] = (furniture_rotation + 90) % 360 - - # Add rotated tile data to new_copied_tiles_info - new_copied_tiles_info["tiles_data"].append(tile_data) + var current_tiles_data = copied_tiles_info["tiles_data"] + new_copied_tiles_info["tiles_data"] = rotate_tiles_data(current_tiles_data, new_width, new_height) # Assign the newly rotated tiles to copied_tiles_info copied_tiles_info = new_copied_tiles_info # Mirror the tiles after rotation. This is required because the rotation function # will mirror them, so we need to mirror them back - mirror_copied_tiles_info() + copied_tiles_info["tiles_data"] = mirror_copied_tiles_info(copied_tiles_info["tiles_data"], new_width, new_height) + + +# Helper function to rotate an array of tiles data +func rotate_tiles_data(tiles_data: Array, width: int, height: int) -> Array: + var new_tiles_data: Array = [] + for y in range(height): + for x in range(width): + var old_x = height - y - 1 + var old_y = x + var old_index = old_y * height + old_x + if old_index < tiles_data.size(): + var tile_data = tiles_data[old_index].duplicate() + + # Add rotation to the tile's data if it has an id + if tile_data.has("id"): + var tile_rotation = int(tile_data.get("rotation", 0)) + tile_data["rotation"] = (tile_rotation + 90) % 360 + + # Rotate furniture if present, initializing rotation to 0 if not set + if tile_data.has("furniture"): + var furniture_rotation = int(tile_data.get("furniture").get("rotation", 0)) + tile_data["furniture"]["rotation"] = (furniture_rotation + 90) % 360 + + # Add rotated tile data to new array + new_tiles_data.append(tile_data) + return new_tiles_data # Function to mirror copied_tiles_info in both directions (up, down, left, right) -func mirror_copied_tiles_info(): +func mirror_copied_tiles_info(tiles_data: Array, width: int, height: int) -> Array: var mirrored_tiles_data: Array = [] - var width = copied_tiles_info["width"] - var height = copied_tiles_info["height"] # Mirror vertically and horizontally by iterating in reverse order for y in range(height - 1, -1, -1): for x in range(width - 1, -1, -1): var original_index = y * width + x - var mirrored_data = copied_tiles_info["tiles_data"][original_index].duplicate() + var mirrored_data = tiles_data[original_index].duplicate() # Add the mirrored tile data to the new array mirrored_tiles_data.append(mirrored_data) - - # Update copied_tiles_info with the mirrored tile data - copied_tiles_info["tiles_data"] = mirrored_tiles_data + return mirrored_tiles_data # Resets the rotation amount to 0 and updates relevant nodes From 01b956824fd501e8b141e6fe11c247a650b38e49 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 11 Feb 2024 00:07:40 +0100 Subject: [PATCH 14/18] Refactoring --- .../Mapeditor/Scripts/GridContainer.gd | 151 ++++++++++-------- 1 file changed, 83 insertions(+), 68 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index da8cfa7d..97eb2ea5 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -463,7 +463,9 @@ func _on_rotate_right_pressed(): buttonRotateRight.text = str(rotationAmount) brushPreviewTexture.rotation_degrees = rotationAmount brushPreviewTexture.pivot_offset = brushPreviewTexture.size / 2 - if copied_tiles_info["tiles_data"].size() > 0: + if copied_tiles_info["tiles_data"].size() > 0 and currentMode == EditorMode.COPY_RECTANGLE: + rotate_selection_clockwise() + if copied_tiles_info["all_levels_data"].size() > 0 and currentMode == EditorMode.COPY_ALL_LEVELS: rotate_selection_clockwise() @@ -675,45 +677,6 @@ func get_texture_from_tile_data(tile_data: Dictionary) -> Texture: return tile_texture -# Function to paste copied tile data starting from the clicked tile -func paste_copied_tile_data(clicked_tile): - # Check if we have copied tile data - if copied_tiles_info.is_empty(): - print_debug("No tile data to paste.") - return - - # `clicked_tile` is a direct child of this GridContainer - var tile_index = get_index_of_child(clicked_tile) - var num_columns = columns # `columns` is defined as the number of columns in the grid - - # Calculate the grid position from the tile index - var start_x = tile_index % num_columns - var start_y = float(tile_index) / num_columns - - # Calculate the ending points based on the width and height from copied_tiles_info - var end_x = min(start_x + copied_tiles_info["width"], 32) - var end_y = min(start_y + copied_tiles_info["height"], 32) - - # Tile data index - var tile_data_index = 0 - - # Loop through the grid starting from the clicked tile position - for y in range(start_y, end_y): - for x in range(start_x, end_x): - # Calculate the index for the current tile in the grid - var current_tile_index = y * 32 + x - # Get the current tile - var current_tile: Control = get_child(current_tile_index) - # Check if the current tile and tile data index are valid - if current_tile and tile_data_index < copied_tiles_info["tiles_data"].size(): - # Update the current tile with the copied data - current_tile.tileData = copied_tiles_info["tiles_data"][tile_data_index] - tile_data_index += 1 - - reset_copied_tiles_info() # Clear copied_tiles_info after pasting - brushPreviewTexture.visible = false - - # When the user toggles the copy all levels button in the toolbar func _on_copy_all_levels_toggled(toggled_on): if toggled_on: @@ -730,13 +693,23 @@ func rotate_selection_clockwise(): var new_width = copied_tiles_info["height"] var new_height = copied_tiles_info["width"] var current_tiles_data = copied_tiles_info["tiles_data"] - new_copied_tiles_info["tiles_data"] = rotate_tiles_data(current_tiles_data, new_width, new_height) - # Assign the newly rotated tiles to copied_tiles_info - copied_tiles_info = new_copied_tiles_info - # Mirror the tiles after rotation. This is required because the rotation function - # will mirror them, so we need to mirror them back - copied_tiles_info["tiles_data"] = mirror_copied_tiles_info(copied_tiles_info["tiles_data"], new_width, new_height) + # Rotate single level tiles_data if present + if copied_tiles_info["tiles_data"].size() > 0 and currentMode == EditorMode.COPY_RECTANGLE: + new_copied_tiles_info["tiles_data"] = rotate_tiles_data(current_tiles_data, new_width, new_height) + # Assign the newly rotated tiles to copied_tiles_info + copied_tiles_info = new_copied_tiles_info + # Mirror the tiles after rotation. This is required because the rotation function + # will mirror them, so we need to mirror them back + copied_tiles_info["tiles_data"] = mirror_copied_tiles_info(copied_tiles_info["tiles_data"], new_width, new_height) + + # Rotate all levels data if present + if copied_tiles_info["all_levels_data"].size() > 0 and currentMode == EditorMode.COPY_ALL_LEVELS: + for i in range(copied_tiles_info["all_levels_data"].size()): + var level_data = copied_tiles_info["all_levels_data"][i] + var rotated_level_data = rotate_tiles_data(level_data, new_width, new_height) + var mirrored_level_data = mirror_copied_tiles_info(rotated_level_data, new_width, new_height) + copied_tiles_info["all_levels_data"][i] = mirrored_level_data # Helper function to rotate an array of tiles data @@ -768,6 +741,8 @@ func rotate_tiles_data(tiles_data: Array, width: int, height: int) -> Array: # Function to mirror copied_tiles_info in both directions (up, down, left, right) func mirror_copied_tiles_info(tiles_data: Array, width: int, height: int) -> Array: var mirrored_tiles_data: Array = [] + if tiles_data.size() <= 0: + return mirrored_tiles_data # Mirror vertically and horizontally by iterating in reverse order for y in range(height - 1, -1, -1): @@ -812,6 +787,7 @@ func get_tile_indexes_in_rectangle(rect_start, rect_end) -> Array[int]: # This column is represented by an array func copy_tiles_from_all_levels(rect_start: Vector2, rect_end: Vector2) -> void: reset_copied_tiles_info() # Clear the previous selection if there is any + reset_rotation() # Calculate the dimensions of the selection as an amount of tiles var selection_dimensions = get_selection_dimensions(rect_start, rect_end) @@ -831,14 +807,15 @@ func copy_tiles_from_all_levels(rect_start: Vector2, rect_end: Vector2) -> void: if level_data.size() > 0: for tile_index in tile_indexes: var tile_data = get_tile_data_from_mapData(tile_index, level) - if tile_data.size() > 0: # Ensure the tile has data before adding - level_copied_tiles.append(tile_data) - + #if tile_data.size() > 0: # Ensure the tile has data before adding + level_copied_tiles.append(tile_data) + # Add the copied data for this level to the all_levels_data copied_tiles_info["all_levels_data"].append(level_copied_tiles) else: # To make sure we always have 21 levels, we append an empty array for levels with no tiles copied_tiles_info["all_levels_data"].append([]) + update_preview_texture_with_copied_data() # Function to get tile indexes in range based on the provided start tile index, width, and height @@ -874,34 +851,72 @@ func get_tile_indexes_in_range(start_tile_index: int, width: int, height: int, l # The amount of tiles is determined by what was selected in copy_tiles_from_all_levels # Each level in the data is applied to the same level that it was copied from func apply_column_tiles_to_all_levels(clicked_tile: Control) -> void: - # Get the index of the clicked tile - var clicked_tile_index = get_index_of_child(clicked_tile) - - var width = copied_tiles_info["width"] - var height = copied_tiles_info["height"] - # We are using the tiles that were selected earlier var copied_column_data = copied_tiles_info["all_levels_data"] - # Get the required tile indexes in range for the target location - # Since we are pasting a column of tiles, the indexes will be the same on every level - var target_tile_indexes = get_tile_indexes_in_range(clicked_tile_index, width, height, currentLevel) - # Loop over all levels in mapData for level_index in range(mapData["levels"].size()): - var level_data = mapData["levels"][level_index] # Ensure there's corresponding copied data for this level if level_index < copied_column_data.size(): var column_data_for_level = copied_column_data[level_index] - for i in range(min(target_tile_indexes.size(), column_data_for_level.size())): - var target_index = target_tile_indexes[i] - # Check if target index is within the current level data range - if target_index >= 0 and target_index < level_data.size(): - # Apply the copied tile data to the target tile index - level_data[target_index] = column_data_for_level[i] - - loadLevelData(currentLevel) # After pasting, reload the current level's data + apply_tiles_data_to_level(clicked_tile,level_index,column_data_for_level) + + #loadLevelData(currentLevel) # After pasting, reload the current level's data reset_copied_tiles_info() # Clear the selection + brushPreviewTexture.visible = false + + +# Function to paste copied tile data starting from the clicked tile +func paste_copied_tile_data(clicked_tile): + # Check if we have copied tile data + if copied_tiles_info.is_empty(): + print_debug("No tile data to paste.") + return + + # `clicked_tile` is a direct child of this GridContainer + apply_tiles_data_to_level(clicked_tile,currentLevel,copied_tiles_info["tiles_data"]) + reset_copied_tiles_info() # Clear copied_tiles_info after pasting + brushPreviewTexture.visible = false + + +# Applies tile data from an array to a specific area in a specified level +func apply_tiles_data_to_level(clicked_tile: Control, level_index: int, tiles_data: Array) -> void: + # Ensure level_index is within the valid range + if level_index < 0 or level_index >= mapData.levels.size(): + print_debug("Level index out of range.") + return + + # Ensure there is data to apply + if tiles_data.is_empty(): + print_debug("No tiles data to apply.") + return + + var tile_index = get_index_of_child(clicked_tile) + var width = copied_tiles_info["width"] + var height = copied_tiles_info["height"] + + var level_data = mapData.levels[level_index] + var num_columns = columns + + # Calculate the grid position from the starting tile index + var start_x = tile_index % num_columns + var start_y = float(tile_index) / num_columns + + # Loop through the specified width and height to apply tile data + var data_index = 0 # Index for iterating through tiles_data + for y in range(start_y, start_y + height): + for x in range(start_x, start_x + width): + var current_tile_index = y * num_columns + x + # Check bounds and ensure we do not exceed the level data or tiles_data size + if current_tile_index < level_data.size() and data_index < tiles_data.size(): + # Apply the tile data, Duplicate to ensure a deep copy + level_data[current_tile_index] = tiles_data[data_index].duplicate() + data_index += 1 + + # After applying changes, reload or update the level + if level_index == currentLevel: + loadLevelData(currentLevel) + print_debug("Applied tiles data to level %s." % level_index) # Resets the copied_tiles_info dictionary to its default values. From 6c314b38c6ce83a2344cf31fb5335ea5bf49264b Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 11 Feb 2024 01:43:31 +0100 Subject: [PATCH 15/18] Rotating a copied column works now --- .../Mapeditor/Scripts/GridContainer.gd | 91 ++++++++++++++++++- 1 file changed, 86 insertions(+), 5 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 97eb2ea5..377909ca 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -685,9 +685,34 @@ func _on_copy_all_levels_toggled(toggled_on): currentMode = EditorMode.NONE +func rotate_selection_clockwise1(): + # Rotate single-level data if present + if copied_tiles_info["tiles_data"].size() > 0: + copied_tiles_info["tiles_data"] = rotate_data(copied_tiles_info["tiles_data"], copied_tiles_info["width"], copied_tiles_info["height"]) + #copied_tiles_info["tiles_data"] = mirror_copied_tiles_info(copied_tiles_info["tiles_data"], copied_tiles_info["width"], copied_tiles_info["height"]) + + # Rotate multi-level data if present + if copied_tiles_info["all_levels_data"].size() > 0: + for i in range(copied_tiles_info["all_levels_data"].size()): + if copied_tiles_info["all_levels_data"][i].size() > 0: + copied_tiles_info["all_levels_data"][i] = rotate_data(copied_tiles_info["all_levels_data"][i], copied_tiles_info["width"], copied_tiles_info["height"]) + #copied_tiles_info["all_levels_data"][i] = mirror_copied_tiles_info(copied_tiles_info["all_levels_data"][i], copied_tiles_info["width"], copied_tiles_info["height"]) + + # Swap the dimensions + #var temp = copied_tiles_info["width"] + #copied_tiles_info["width"] = copied_tiles_info["height"] + #copied_tiles_info["height"] = temp + + # Update preview or any other necessary UI components + update_preview_texture_with_copied_data() + + + # Function to rotate the selected tiles in copied_tiles_info 90 degrees clockwise func rotate_selection_clockwise(): - var new_copied_tiles_info: Dictionary = {"tiles_data": [], "all_levels_data": [], "width": copied_tiles_info["height"], "height": copied_tiles_info["width"]} + #var new_copied_tiles_info: Dictionary = {"tiles_data": [], "all_levels_data": [], "width": copied_tiles_info["height"], "height": copied_tiles_info["width"]} + #new_copied_tiles_info.all_levels_data.resize(21) + var new_copied_tiles_info: Dictionary = {"tiles_data": [], "all_levels_data": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]], "width": copied_tiles_info["height"], "height": copied_tiles_info["width"]} # We'll be rotating the tiles, so we need to change width and height var new_width = copied_tiles_info["height"] @@ -706,10 +731,66 @@ func rotate_selection_clockwise(): # Rotate all levels data if present if copied_tiles_info["all_levels_data"].size() > 0 and currentMode == EditorMode.COPY_ALL_LEVELS: for i in range(copied_tiles_info["all_levels_data"].size()): - var level_data = copied_tiles_info["all_levels_data"][i] - var rotated_level_data = rotate_tiles_data(level_data, new_width, new_height) - var mirrored_level_data = mirror_copied_tiles_info(rotated_level_data, new_width, new_height) - copied_tiles_info["all_levels_data"][i] = mirrored_level_data + if copied_tiles_info["all_levels_data"][i].size() > 0: + print_debug("all level data i size = " + str(copied_tiles_info["all_levels_data"][i].size())) + + #current_tiles_data = copied_tiles_info["all_levels_data"][i].duplicate() + copied_tiles_info["all_levels_data"][i] = rotate_tiles_data(\ + copied_tiles_info["all_levels_data"][i], new_width, new_height) + copied_tiles_info["height"] = new_height + copied_tiles_info["width"] = new_width + copied_tiles_info["all_levels_data"][i] = mirror_copied_tiles_info(\ + copied_tiles_info["all_levels_data"][i], new_width, new_height) + + #new_copied_tiles_info["tiles_data"] = rotate_tiles_data(\ + #copied_tiles_info["all_levels_data"][i], new_width, new_height) + #copied_tiles_info["all_levels_data"][i] = new_copied_tiles_info["tiles_data"] + #new_copied_tiles_info["tiles_data"] = mirror_copied_tiles_info(\ + #copied_tiles_info["all_levels_data"][i], new_width, new_height) + #copied_tiles_info["all_levels_data"][i] = new_copied_tiles_info["tiles_data"] + + #new_copied_tiles_info["all_levels_data"][i] = rotate_tiles_data(\ + #copied_tiles_info["all_levels_data"][i], new_width, new_height) + ## Assign the newly rotated tiles to copied_tiles_info + #copied_tiles_info = new_copied_tiles_info + ## Mirror the tiles after rotation. This is required because the rotation function + ## will mirror them, so we need to mirror them back + #copied_tiles_info["all_levels_data"][i] = mirror_copied_tiles_info(\ + #copied_tiles_info["all_levels_data"][i], new_width, new_height) + + #var column_data = copied_tiles_info["all_levels_data"][i] + #var rotated_column_data = rotate_tiles_data(column_data, new_width, new_height) + #var mirrored_column_data = mirror_copied_tiles_info(rotated_column_data, new_width, new_height) + #copied_tiles_info["all_levels_data"][i] = mirrored_column_data + + + +func rotate_data(data: Array, width: int, height: int) -> Array: + var rotated_data = Array() + rotated_data.resize(width * height) # Ensure the array has the correct size + + for y in range(height): + for x in range(width): + var new_x = height - y - 1 + var new_index = new_x * width + x + var old_index = y * width + x + if old_index < data.size() and new_index < rotated_data.size(): + var tile_data = data[old_index].duplicate() + + # Add rotation to the tile's data if it has an id + if tile_data.has("id"): + var tile_rotation = int(tile_data.get("rotation", 0)) + tile_data["rotation"] = (tile_rotation + 90) % 360 + + # Rotate furniture if present, initializing rotation to 0 if not set + if tile_data.has("furniture"): + var furniture_rotation = int(tile_data.get("furniture").get("rotation", 0)) + tile_data["furniture"]["rotation"] = (furniture_rotation + 90) % 360 + + rotated_data[new_index] = tile_data + + print_debug("returning rotated data = " + str(rotated_data)) + return rotated_data # Helper function to rotate an array of tiles data From 45fffb76eaefaec960f77f12de56ac1c6e94ea67 Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Sun, 11 Feb 2024 02:30:30 +0100 Subject: [PATCH 16/18] Fix furniture rotation --- .../Mapeditor/Scripts/GridContainer.gd | 85 +------------------ 1 file changed, 4 insertions(+), 81 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 377909ca..097191c9 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -547,7 +547,7 @@ func rotate_level_clockwise() -> void: 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() + new_level_data[new_index] = currentLevelData[old_index].duplicate(true) # Add rotation to the tile's data if it has an id if new_level_data[new_index].has("id"): @@ -685,33 +685,8 @@ func _on_copy_all_levels_toggled(toggled_on): currentMode = EditorMode.NONE -func rotate_selection_clockwise1(): - # Rotate single-level data if present - if copied_tiles_info["tiles_data"].size() > 0: - copied_tiles_info["tiles_data"] = rotate_data(copied_tiles_info["tiles_data"], copied_tiles_info["width"], copied_tiles_info["height"]) - #copied_tiles_info["tiles_data"] = mirror_copied_tiles_info(copied_tiles_info["tiles_data"], copied_tiles_info["width"], copied_tiles_info["height"]) - - # Rotate multi-level data if present - if copied_tiles_info["all_levels_data"].size() > 0: - for i in range(copied_tiles_info["all_levels_data"].size()): - if copied_tiles_info["all_levels_data"][i].size() > 0: - copied_tiles_info["all_levels_data"][i] = rotate_data(copied_tiles_info["all_levels_data"][i], copied_tiles_info["width"], copied_tiles_info["height"]) - #copied_tiles_info["all_levels_data"][i] = mirror_copied_tiles_info(copied_tiles_info["all_levels_data"][i], copied_tiles_info["width"], copied_tiles_info["height"]) - - # Swap the dimensions - #var temp = copied_tiles_info["width"] - #copied_tiles_info["width"] = copied_tiles_info["height"] - #copied_tiles_info["height"] = temp - - # Update preview or any other necessary UI components - update_preview_texture_with_copied_data() - - - # Function to rotate the selected tiles in copied_tiles_info 90 degrees clockwise func rotate_selection_clockwise(): - #var new_copied_tiles_info: Dictionary = {"tiles_data": [], "all_levels_data": [], "width": copied_tiles_info["height"], "height": copied_tiles_info["width"]} - #new_copied_tiles_info.all_levels_data.resize(21) var new_copied_tiles_info: Dictionary = {"tiles_data": [], "all_levels_data": [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]], "width": copied_tiles_info["height"], "height": copied_tiles_info["width"]} # We'll be rotating the tiles, so we need to change width and height @@ -730,67 +705,15 @@ func rotate_selection_clockwise(): # Rotate all levels data if present if copied_tiles_info["all_levels_data"].size() > 0 and currentMode == EditorMode.COPY_ALL_LEVELS: + copied_tiles_info["height"] = new_height + copied_tiles_info["width"] = new_width for i in range(copied_tiles_info["all_levels_data"].size()): if copied_tiles_info["all_levels_data"][i].size() > 0: - print_debug("all level data i size = " + str(copied_tiles_info["all_levels_data"][i].size())) - #current_tiles_data = copied_tiles_info["all_levels_data"][i].duplicate() copied_tiles_info["all_levels_data"][i] = rotate_tiles_data(\ copied_tiles_info["all_levels_data"][i], new_width, new_height) - copied_tiles_info["height"] = new_height - copied_tiles_info["width"] = new_width copied_tiles_info["all_levels_data"][i] = mirror_copied_tiles_info(\ copied_tiles_info["all_levels_data"][i], new_width, new_height) - - #new_copied_tiles_info["tiles_data"] = rotate_tiles_data(\ - #copied_tiles_info["all_levels_data"][i], new_width, new_height) - #copied_tiles_info["all_levels_data"][i] = new_copied_tiles_info["tiles_data"] - #new_copied_tiles_info["tiles_data"] = mirror_copied_tiles_info(\ - #copied_tiles_info["all_levels_data"][i], new_width, new_height) - #copied_tiles_info["all_levels_data"][i] = new_copied_tiles_info["tiles_data"] - - #new_copied_tiles_info["all_levels_data"][i] = rotate_tiles_data(\ - #copied_tiles_info["all_levels_data"][i], new_width, new_height) - ## Assign the newly rotated tiles to copied_tiles_info - #copied_tiles_info = new_copied_tiles_info - ## Mirror the tiles after rotation. This is required because the rotation function - ## will mirror them, so we need to mirror them back - #copied_tiles_info["all_levels_data"][i] = mirror_copied_tiles_info(\ - #copied_tiles_info["all_levels_data"][i], new_width, new_height) - - #var column_data = copied_tiles_info["all_levels_data"][i] - #var rotated_column_data = rotate_tiles_data(column_data, new_width, new_height) - #var mirrored_column_data = mirror_copied_tiles_info(rotated_column_data, new_width, new_height) - #copied_tiles_info["all_levels_data"][i] = mirrored_column_data - - - -func rotate_data(data: Array, width: int, height: int) -> Array: - var rotated_data = Array() - rotated_data.resize(width * height) # Ensure the array has the correct size - - for y in range(height): - for x in range(width): - var new_x = height - y - 1 - var new_index = new_x * width + x - var old_index = y * width + x - if old_index < data.size() and new_index < rotated_data.size(): - var tile_data = data[old_index].duplicate() - - # Add rotation to the tile's data if it has an id - if tile_data.has("id"): - var tile_rotation = int(tile_data.get("rotation", 0)) - tile_data["rotation"] = (tile_rotation + 90) % 360 - - # Rotate furniture if present, initializing rotation to 0 if not set - if tile_data.has("furniture"): - var furniture_rotation = int(tile_data.get("furniture").get("rotation", 0)) - tile_data["furniture"]["rotation"] = (furniture_rotation + 90) % 360 - - rotated_data[new_index] = tile_data - - print_debug("returning rotated data = " + str(rotated_data)) - return rotated_data # Helper function to rotate an array of tiles data @@ -802,7 +725,7 @@ func rotate_tiles_data(tiles_data: Array, width: int, height: int) -> Array: var old_y = x var old_index = old_y * height + old_x if old_index < tiles_data.size(): - var tile_data = tiles_data[old_index].duplicate() + var tile_data = tiles_data[old_index].duplicate(true) # Add rotation to the tile's data if it has an id if tile_data.has("id"): From 37cf093eafa666ee8786877fb987a5c7092c7c9e Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 12 Feb 2024 05:44:05 +0100 Subject: [PATCH 17/18] Fix brush preview position --- Mods/Core/Maps/Generichouse.json | 3 +- .../Mapeditor/Scripts/GridContainer.gd | 112 +++++++++++------- Scenes/Overmap/Scripts/Overmap.gd | 4 +- 3 files changed, 72 insertions(+), 47 deletions(-) diff --git a/Mods/Core/Maps/Generichouse.json b/Mods/Core/Maps/Generichouse.json index 47231fa2..71138080 100644 --- a/Mods/Core/Maps/Generichouse.json +++ b/Mods/Core/Maps/Generichouse.json @@ -5804,8 +5804,7 @@ }, { "furniture": { - "id": "refrigerator_00", - "rotation": 180 + "id": "refrigerator_00" }, "id": "orange_carpet_00" }, diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index 097191c9..e699c0bb 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -142,15 +142,59 @@ func _input(event) -> void: if not currentMode == EditorMode.NONE: 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 + _update_brush_preview_position() + + +# Function to update the position of the brush preview based on the mouse event +func _update_brush_preview_position() -> void: + # Calculate the new scale based on zoom level + var scale_factor = mapEditor.zoom_level * 0.01 + brushPreviewTexture.scale = Vector2(scale_factor, scale_factor) + brushPreviewTexture.pivot_offset = calculate_scaled_center_distance() + + var mouse_position = get_viewport().get_mouse_position() + var constant_offset = Vector2(10, 10) # Constant offset from the cursor + var scalediff = brushPreviewTexture.size - brushPreviewTexture.size * brushPreviewTexture.scale.x + var new_position = mouse_position + new_position = new_position + constant_offset - scalediff/2 + + var scroll_global_pos = mapScrollWindow.get_global_position() + var mapScrollWindowRect = mapScrollWindow.get_rect() + 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) + brushPreviewTexture.global_position = new_position + + +func _on_zoom_level_changed(zoom_level: int): + _update_brush_preview_position() + for tile in get_children(): + tile.set_scale_amount(1.28*zoom_level) + for tile in levelgrid_below.get_children(): + tile.set_scale_amount(1.28*zoom_level) + for tile in levelgrid_above.get_children(): + tile.set_scale_amount(1.28*zoom_level) + + +# Function to calculate the distance from top-left to center based on scaling +func calculate_scaled_center_distance() -> Vector2: + var scaled_size = brushPreviewTexture.size + var distance_to_center = scaled_size / 2 + return distance_to_center + + +# When the user releases the mouse button on the rotate right button +func _on_rotate_right_pressed(): + rotationAmount += 90 + rotationAmount = rotationAmount % 360 # Keep rotation within 0-359 degrees + buttonRotateRight.text = str(rotationAmount) + brushPreviewTexture.rotation_degrees = rotationAmount + brushPreviewTexture.pivot_offset = calculate_scaled_center_distance() + _update_brush_preview_position() + if copied_tiles_info["tiles_data"].size() > 0 and currentMode == EditorMode.COPY_RECTANGLE: + rotate_selection_clockwise() + if copied_tiles_info["all_levels_data"].size() > 0 and currentMode == EditorMode.COPY_ALL_LEVELS: + rotate_selection_clockwise() + # Highlight tiles that are in the rectangle that the user has drawn with the mouse @@ -407,10 +451,9 @@ func _on_tilebrush_list_tile_brush_selection_change(tilebrush): # The cursor will have a preview of the texture that the user will paint with next to it func update_preview_texture(): if selected_brush: - brushPreviewTexture.texture = selected_brush.get_texture() - brushPreviewTexture.visible = true + set_brush_preview_texture(selected_brush.get_texture()) else: - brushPreviewTexture.visible = false + set_brush_preview_texture(null) # When the user presses the show below button, we show a transparant view of the level below the current level @@ -442,32 +485,8 @@ 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 - brushPreviewTexture.scale = Vector2(scale_factor, scale_factor) - brushPreviewTexture.pivot_offset = brushPreviewTexture.size / 2 - for tile in get_children(): - tile.set_scale_amount(1.28*zoom_level) - for tile in levelgrid_below.get_children(): - tile.set_scale_amount(1.28*zoom_level) - for tile in levelgrid_above.get_children(): - tile.set_scale_amount(1.28*zoom_level) -# When the user releases the mouse button on the rotate right button -func _on_rotate_right_pressed(): - 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 - if copied_tiles_info["tiles_data"].size() > 0 and currentMode == EditorMode.COPY_RECTANGLE: - rotate_selection_clockwise() - if copied_tiles_info["all_levels_data"].size() > 0 and currentMode == EditorMode.COPY_ALL_LEVELS: - rotate_selection_clockwise() - # Function to create a 128x128 miniature map of the current level func create_miniature_map_image() -> Image: @@ -570,7 +589,7 @@ func _on_copy_rectangle_toggled(toggled_on: bool) -> void: currentMode = EditorMode.NONE reset_copied_tiles_info() reset_rotation() - brushPreviewTexture.visible = false + set_brush_preview_texture(null) # If it was toggled on, show the brush preview (if there's something to preview) else: currentMode = EditorMode.COPY_RECTANGLE @@ -661,9 +680,7 @@ func update_preview_texture_with_copied_data(): idx += 1 # Update the brushPreviewTexture with the generated image - var texture = ImageTexture.create_from_image(image) - brushPreviewTexture.texture = texture - brushPreviewTexture.visible = true + set_brush_preview_texture(ImageTexture.create_from_image(image)) # Returns the texture associated with the tile id or the default empty tile if id is missing @@ -709,7 +726,6 @@ func rotate_selection_clockwise(): copied_tiles_info["width"] = new_width for i in range(copied_tiles_info["all_levels_data"].size()): if copied_tiles_info["all_levels_data"][i].size() > 0: - #current_tiles_data = copied_tiles_info["all_levels_data"][i].duplicate() copied_tiles_info["all_levels_data"][i] = rotate_tiles_data(\ copied_tiles_info["all_levels_data"][i], new_width, new_height) copied_tiles_info["all_levels_data"][i] = mirror_copied_tiles_info(\ @@ -867,7 +883,7 @@ func apply_column_tiles_to_all_levels(clicked_tile: Control) -> void: #loadLevelData(currentLevel) # After pasting, reload the current level's data reset_copied_tiles_info() # Clear the selection - brushPreviewTexture.visible = false + set_brush_preview_texture(null) # Function to paste copied tile data starting from the clicked tile @@ -880,7 +896,7 @@ func paste_copied_tile_data(clicked_tile): # `clicked_tile` is a direct child of this GridContainer apply_tiles_data_to_level(clicked_tile,currentLevel,copied_tiles_info["tiles_data"]) reset_copied_tiles_info() # Clear copied_tiles_info after pasting - brushPreviewTexture.visible = false + set_brush_preview_texture(null) # Applies tile data from an array to a specific area in a specified level @@ -929,3 +945,13 @@ func reset_copied_tiles_info() -> void: copied_tiles_info["all_levels_data"] = [] copied_tiles_info["width"] = 0 copied_tiles_info["height"] = 0 + + +func set_brush_preview_texture(image: Texture) -> void: + brushPreviewTexture.rotation_degrees = rotationAmount + if image: + brushPreviewTexture.texture = image + brushPreviewTexture.visible = true + else: + brushPreviewTexture.texture = null + brushPreviewTexture.visible = false diff --git a/Scenes/Overmap/Scripts/Overmap.gd b/Scenes/Overmap/Scripts/Overmap.gd index d57aa848..ee11da79 100644 --- a/Scenes/Overmap/Scripts/Overmap.gd +++ b/Scenes/Overmap/Scripts/Overmap.gd @@ -156,6 +156,7 @@ func update_tiles_position(delta): # 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): update_tiles_position(delta) @@ -163,6 +164,7 @@ func on_position_coord_changed(delta): if positionLabel: 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, # and chunk_position, a Vector2 representing the chunk's position in the world. @@ -223,8 +225,6 @@ func create_and_fill_grid_container(chunk: Array, chunk_position: Vector2): return grid_container - - #This function will be connected to the signal of the tiles func _on_tile_clicked(clicked_tile): if clicked_tile.has_meta("map_file"): From ccfcddc71fed403cea394e50bf64320b142f10ea Mon Sep 17 00:00:00 2001 From: snipercup <50166150+snipercup@users.noreply.github.com> Date: Mon, 12 Feb 2024 06:15:29 +0100 Subject: [PATCH 18/18] Only one rectangle button can be active --- .../Mapeditor/Scripts/GridContainer.gd | 74 ++++++++++++------- .../ContentManager/Mapeditor/mapeditor.tscn | 5 +- 2 files changed, 51 insertions(+), 28 deletions(-) diff --git a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd index e699c0bb..9730b2bf 100644 --- a/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd +++ b/Scenes/ContentManager/Mapeditor/Scripts/GridContainer.gd @@ -11,6 +11,10 @@ var currentLevelData: Array = [] @export var mapScrollWindow: ScrollContainer @export var brushPreviewTexture: TextureRect @export var buttonRotateRight: Button +@export var checkboxDrawRectangle: CheckBox +@export var checkboxCopyRectangle: CheckBox +@export var checkboxCopyAllLevels: CheckBox + var selected_brush: Control enum EditorMode { @@ -435,11 +439,51 @@ func _on_erase_toggled(button_pressed): # When the user toggles the draw rectangle button in the toolbar -func _on_draw_rectangle_toggled(button_pressed): - if button_pressed: +func _on_draw_rectangle_toggled(toggled_on: bool) -> void: + if toggled_on: + checkboxCopyRectangle.set_pressed(false) + checkboxCopyAllLevels.set_pressed(false) currentMode = EditorMode.DRAW_RECTANGLE + if selected_brush: + set_brush_preview_texture(selected_brush.get_texture()) + else: + currentMode = EditorMode.NONE + + +# When the user toggles the copy all levels button in the toolbar +func _on_copy_all_levels_toggled(toggled_on: bool): + if toggled_on: + checkboxDrawRectangle.set_pressed(false) + checkboxCopyRectangle.set_pressed(false) + currentMode = EditorMode.COPY_ALL_LEVELS + if copied_tiles_info["all_levels_data"].size() > 0: + # You might want to update the brush preview to reflect the copied tiles + update_preview_texture_with_copied_data() + # If there's nothing to copy, perhaps alert the user + else: + set_brush_preview_texture(null) + else: + currentMode = EditorMode.NONE + + +# Called when the Copy Rectangle ToggleButton's state changes. +func _on_copy_rectangle_toggled(toggled_on: bool) -> void: + # If it was toggled off, clear the data from copied_tiles_info, clear rotation, and hide the brush preview + if toggled_on: + checkboxDrawRectangle.set_pressed(false) + checkboxCopyAllLevels.set_pressed(false) + currentMode = EditorMode.COPY_RECTANGLE + if copied_tiles_info["tiles_data"].size() > 0: + # You might want to update the brush preview to reflect the copied tiles + update_preview_texture_with_copied_data() + # If there's nothing to copy, perhaps alert the user + else: + set_brush_preview_texture(null) else: currentMode = EditorMode.NONE + reset_copied_tiles_info() + reset_rotation() + set_brush_preview_texture(null) # When the user has selected one of the tile brushes to paint with @@ -582,24 +626,6 @@ func rotate_level_clockwise() -> void: currentLevelData = new_level_data -# Called when the Copy Rectangle ToggleButton's state changes. -func _on_copy_rectangle_toggled(toggled_on: bool) -> void: - # If it was toggled off, clear the data from copied_tiles_info, clear rotation, and hide the brush preview - if not toggled_on: - currentMode = EditorMode.NONE - reset_copied_tiles_info() - reset_rotation() - set_brush_preview_texture(null) - # If it was toggled on, show the brush preview (if there's something to preview) - else: - currentMode = EditorMode.COPY_RECTANGLE - if copied_tiles_info["tiles_data"].size() > 0: - # You might want to update the brush preview to reflect the copied tiles - update_preview_texture_with_copied_data() - # If there's nothing to copy, perhaps alert the user - else: - print("No tiles copied to preview.") - # Called when the user has drawn a rectangle with the copy button toggled on # This will store the data of the selected tiles to a variable @@ -694,13 +720,6 @@ func get_texture_from_tile_data(tile_data: Dictionary) -> Texture: return tile_texture -# When the user toggles the copy all levels button in the toolbar -func _on_copy_all_levels_toggled(toggled_on): - if toggled_on: - currentMode = EditorMode.COPY_ALL_LEVELS - else: - currentMode = EditorMode.NONE - # Function to rotate the selected tiles in copied_tiles_info 90 degrees clockwise func rotate_selection_clockwise(): @@ -955,3 +974,4 @@ func set_brush_preview_texture(image: Texture) -> void: else: brushPreviewTexture.texture = null brushPreviewTexture.visible = false + brushPreviewTexture.size = Vector2(128,128) diff --git a/Scenes/ContentManager/Mapeditor/mapeditor.tscn b/Scenes/ContentManager/Mapeditor/mapeditor.tscn index 2dbf54d2..1560f32b 100644 --- a/Scenes/ContentManager/Mapeditor/mapeditor.tscn +++ b/Scenes/ContentManager/Mapeditor/mapeditor.tscn @@ -189,7 +189,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", "buttonRotateRight")] +[node name="TileGrid" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer" node_paths=PackedStringArray("mapEditor", "LevelScrollBar", "levelgrid_below", "levelgrid_above", "mapScrollWindow", "brushPreviewTexture", "buttonRotateRight", "checkboxDrawRectangle", "checkboxCopyRectangle", "checkboxCopyAllLevels")] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -208,6 +208,9 @@ levelgrid_above = NodePath("../Level_Above") mapScrollWindow = NodePath("../../..") brushPreviewTexture = NodePath("../../../../../../../BrushPreviewTexture") buttonRotateRight = NodePath("../../../../../Toolbar/RotateRight") +checkboxDrawRectangle = NodePath("../../../../../Toolbar/DrawRectangle") +checkboxCopyRectangle = NodePath("../../../../../Toolbar/CopyRectangle") +checkboxCopyAllLevels = NodePath("../../../../../Toolbar/CopyAllLevels") [node name="Level_Below" type="GridContainer" parent="HSplitContainer/MapeditorContainer/HBoxContainer/MapScrollWindow/PanWindow/GridContainer"] modulate = Color(1, 1, 1, 0.117647)