diff --git a/data/levelGraphs/test.yaml b/data/levelGraphs/test.yaml
index 1945392..4e4b36e 100644
--- a/data/levelGraphs/test.yaml
+++ b/data/levelGraphs/test.yaml
@@ -1,311 +1,34 @@
connection_data_list:
- - from_id: c0255eb6-2c75-44f7-9058-0921fe8fb0d8
- to_id: 4ae948ea-82b7-4b2d-bec2-19ed8a9d4c03
+ - from_id: 5a284c6f-2ce5-4dba-b32e-f0fcb9e9940d
+ to_id: 4de20bd2-b557-4c29-9613-d4b35ea1f239
from_port: 0
to_port: 0
- - from_id: 4ae948ea-82b7-4b2d-bec2-19ed8a9d4c03
- to_id: ba32e05c-0c80-4a79-b5ce-5b8150400e05
- from_port: 0
- to_port: 0
- - from_id: 4ae948ea-82b7-4b2d-bec2-19ed8a9d4c03
- to_id: 8b3d645a-96c0-407e-871d-6f4a0b69557b
- from_port: 0
- to_port: 0
- - from_id: 8b3d645a-96c0-407e-871d-6f4a0b69557b
- to_id: 7e3ae680-3d7e-4ae9-b82f-5bfbe1c2f613
- from_port: 0
- to_port: 0
- - from_id: ba32e05c-0c80-4a79-b5ce-5b8150400e05
- to_id: 7e3ae680-3d7e-4ae9-b82f-5bfbe1c2f613
- from_port: 0
- to_port: 0
- - from_id: c0255eb6-2c75-44f7-9058-0921fe8fb0d8
- to_id: 46d8c16d-66fb-409e-b02a-7825dcf59796
- from_port: 0
- to_port: 0
- - from_id: 7e3ae680-3d7e-4ae9-b82f-5bfbe1c2f613
- to_id: 20b486d3-3558-4d4a-b67b-d6df08e66a6a
- from_port: 0
- to_port: 0
- - from_id: 7e3ae680-3d7e-4ae9-b82f-5bfbe1c2f613
- to_id: 012795b2-297c-404a-b96f-dff8a6b6a720
- from_port: 0
- to_port: 0
- - from_id: 012795b2-297c-404a-b96f-dff8a6b6a720
- to_id: 7eba7a72-88c9-4018-82db-100c9521938b
- from_port: 0
- to_port: 0
- - from_id: 46d8c16d-66fb-409e-b02a-7825dcf59796
- to_id: 5e27b3cd-7de8-4476-b96f-199ffce9b10c
- from_port: 0
- to_port: 0
- - from_id: 46d8c16d-66fb-409e-b02a-7825dcf59796
- to_id: 43d7c799-3db5-4b13-b160-f9133f15a970
- from_port: 0
- to_port: 0
- - from_id: 7eba7a72-88c9-4018-82db-100c9521938b
- to_id: a54cf238-a368-4979-abb2-3a435b726d29
- from_port: 0
- to_port: 0
- - from_id: 20b486d3-3558-4d4a-b67b-d6df08e66a6a
- to_id: e69c3d51-11d3-408f-bfc8-b955183e2abe
- from_port: 0
- to_port: 0
- - from_id: e69c3d51-11d3-408f-bfc8-b955183e2abe
- to_id: 27111bc7-cbbd-4a4f-9fe6-cf3948f74efd
- from_port: 0
- to_port: 0
- - from_id: 27111bc7-cbbd-4a4f-9fe6-cf3948f74efd
- to_id: 7e5d5fd3-1255-4523-8057-377a4fbd50d8
- from_port: 0
- to_port: 0
- - from_id: 5e27b3cd-7de8-4476-b96f-199ffce9b10c
- to_id: 4129b4a0-a02e-4751-9ca8-b2bc1c679b02
- from_port: 0
- to_port: 0
- - from_id: 4129b4a0-a02e-4751-9ca8-b2bc1c679b02
- to_id: fb77ea9a-fd4d-4fc8-92a4-1e5d4d1219a8
- from_port: 0
- to_port: 0
- - from_id: fb77ea9a-fd4d-4fc8-92a4-1e5d4d1219a8
- to_id: 0aa908bd-b5fe-4a80-8e74-9a862d7c9af0
- from_port: 0
- to_port: 0
- - from_id: 43d7c799-3db5-4b13-b160-f9133f15a970
- to_id: dff8a1e6-a5ae-41b4-b136-95729bf3a8d3
- from_port: 0
- to_port: 0
- - from_id: dff8a1e6-a5ae-41b4-b136-95729bf3a8d3
- to_id: 676ba8a3-9ac8-4606-858e-5aa3b3e5101c
- from_port: 0
- to_port: 0
- - from_id: 676ba8a3-9ac8-4606-858e-5aa3b3e5101c
- to_id: 80c69468-6558-4c12-86cd-7ba6533d3758
- from_port: 0
- to_port: 0
- - from_id: 0aa908bd-b5fe-4a80-8e74-9a862d7c9af0
- to_id: c6f9bd56-5025-40f6-97b9-1e73eac1c5f6
- from_port: 0
- to_port: 0
- - from_id: 7e5d5fd3-1255-4523-8057-377a4fbd50d8
- to_id: 03896855-9956-4442-909c-7d633fa97ed9
- from_port: 0
- to_port: 0
- - from_id: 80c69468-6558-4c12-86cd-7ba6533d3758
- to_id: d43494e4-0ec3-4e29-a617-6a3ff7727a11
+ - from_id: 4de20bd2-b557-4c29-9613-d4b35ea1f239
+ to_id: 3053d123-3f71-4cd0-8f05-f821aa95c702
from_port: 0
to_port: 0
room_node_data_list:
- - id: 8b3d645a-96c0-407e-871d-6f4a0b69557b
- title: 房间4
+ - id: 5a284c6f-2ce5-4dba-b32e-f0fcb9e9940d
+ title: 房间1
description: ''
room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: ba32e05c-0c80-4a79-b5ce-5b8150400e05
- title: 房间3
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data:
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 7e3ae680-3d7e-4ae9-b82f-5bfbe1c2f613
- title: 房间5
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 20b486d3-3558-4d4a-b67b-d6df08e66a6a
- title: 房间7
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 012795b2-297c-404a-b96f-dff8a6b6a720
- title: 房间8
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 46d8c16d-66fb-409e-b02a-7825dcf59796
- title: 房间6
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 7eba7a72-88c9-4018-82db-100c9521938b
- title: 房间9
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 5e27b3cd-7de8-4476-b96f-199ffce9b10c
- title: 房间10
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: a54cf238-a368-4979-abb2-3a435b726d29
- title: 房间12
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: e69c3d51-11d3-408f-bfc8-b955183e2abe
- title: 房间13
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 4ae948ea-82b7-4b2d-bec2-19ed8a9d4c03
- title: 大厅
- description: 比普通房间要大一些的房间,有多个门,用于连接到其他房间。
- room_template_set:
- - res://prefab/roomTemplates/dungeon/utilityRoom.tscn
- tags:
- room_injection_processor_data:
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: c0255eb6-2c75-44f7-9058-0921fe8fb0d8
- title: 起点房间
- description: 测试的起点房间。
- room_template_set:
- - res://prefab/roomTemplates/dungeon/initialRoom.tscn
+ - res://prefab/roomTemplates/tutorials/spellEditor.tscn
tags:
- StartingRoom
- room_injection_processor_data:
+ room_injection_processor_data: ''
enter_room_event_handler_id:
exit_room_event_handler_id:
- - id: 27111bc7-cbbd-4a4f-9fe6-cf3948f74efd
- title: 房间15
+ - id: 4de20bd2-b557-4c29-9613-d4b35ea1f239
+ title: 房间2
description: ''
room_template_set:
- - res://prefab/roomTemplates/dungeon/
+ - res://prefab/roomTemplates/tutorials/tripleShotSpell.tscn
tags:
room_injection_processor_data: ''
enter_room_event_handler_id:
exit_room_event_handler_id:
- - id: 7e5d5fd3-1255-4523-8057-377a4fbd50d8
- title: 房间14
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 4129b4a0-a02e-4751-9ca8-b2bc1c679b02
- title: 房间17
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: fb77ea9a-fd4d-4fc8-92a4-1e5d4d1219a8
- title: 房间18
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 0aa908bd-b5fe-4a80-8e74-9a862d7c9af0
- title: 房间19
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 43d7c799-3db5-4b13-b160-f9133f15a970
- title: 房间11
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 676ba8a3-9ac8-4606-858e-5aa3b3e5101c
- title: 房间23
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: dff8a1e6-a5ae-41b4-b136-95729bf3a8d3
- title: 房间20
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 80c69468-6558-4c12-86cd-7ba6533d3758
- title: 房间24
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: c6f9bd56-5025-40f6-97b9-1e73eac1c5f6
- title: 房间22
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: 03896855-9956-4442-909c-7d633fa97ed9
- title: 房间21
- description: ''
- room_template_set:
- - res://prefab/roomTemplates/dungeon/
- tags:
- room_injection_processor_data: ''
- enter_room_event_handler_id:
- exit_room_event_handler_id:
- - id: d43494e4-0ec3-4e29-a617-6a3ff7727a11
- title: 房间16
+ - id: 3053d123-3f71-4cd0-8f05-f821aa95c702
+ title: 房间3
description: ''
room_template_set:
- res://prefab/roomTemplates/dungeon/
diff --git a/locals/UI.csv b/locals/UI.csv
index 039f953..20b0c22 100644
--- a/locals/UI.csv
+++ b/locals/UI.csv
@@ -35,3 +35,7 @@ ui_translator,翻译,translator,翻訳
ui_unordered_list_tip,排名不分先后,Ranking is not in order,順位は関係ありません
ui_loading,正在加载...,Loading...,読み込み中...
ui_spell_editor,法术编辑器,Spell editor,スペルエディター
+ui_tutorial_spellEditor,按E捡起地上的武器,\n法杖需要搭配法术使用,\n靠近工作台,\n鼠标左键使用工作台。\n鼠标左键拖动物品,\n以实现在不同的容器之间移动它们。,"Press E to pick up the weapon on the ground, \nthe wand needs to be used with the spell, \nclose to the workbench, \nthe left mouse button to use the workbench.\nDrag items with the left mouse button \nto move them between different containers.",Eを押して地面の武器を拾い上げます。\n杖は魔法と組み合わせて使います。\n作業台に近づいて、\nマウスの左ボタンで作業台を使います。\nマウスの左ボタンでモノをドラッグすると、\nさまざまな容器の間を移動できます。
+ui_tutorial_break_box,鼠标左键使用武器打破箱子->,"Use the left mouse button to break the box with the weapon->",マウスの左ボタンで箱を破ります->
+ui_tutorial_jump_onto_platform,W跳上平台,\nS从平台上跳下。,"W jumps onto the platform, \nS jumps off the platform.",Wは踊り場に、\nSは踊り場に飛び降りるのです。
+ui_tutorial_combine_more_powerful_spells,组合更强力的法术->,Combine more powerful spells->,より強力な術を組み合わせます->
diff --git a/prefab/furnitures/SpellEditor.tscn b/prefab/furnitures/SpellEditor.tscn
index f2695c9..83be201 100644
--- a/prefab/furnitures/SpellEditor.tscn
+++ b/prefab/furnitures/SpellEditor.tscn
@@ -92,6 +92,8 @@ collision_layer = 256
collision_mask = 160
script = ExtResource("1_t1qdg")
Path = "res://prefab/ui/SpellEditorUI.tscn"
+_initialDurability = null
+_maxDurability = null
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(-0.5, -0.5)
diff --git a/prefab/furnitures/WoodenBox.tscn b/prefab/furnitures/WoodenBox.tscn
new file mode 100644
index 0000000..4992a16
--- /dev/null
+++ b/prefab/furnitures/WoodenBox.tscn
@@ -0,0 +1,29 @@
+[gd_scene load_steps=5 format=3 uid="uid://dld3qttpsdjpe"]
+
+[ext_resource type="Script" path="res://scripts/furniture/Barrier.cs" id="1_hfnuj"]
+[ext_resource type="Texture2D" uid="uid://cvlm5tmv43i8t" path="res://sprites/furnitures/wooden_box.png" id="2_24vtp"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_vx4tg"]
+size = Vector2(32, 32)
+
+[sub_resource type="CircleShape2D" id="CircleShape2D_in1f7"]
+radius = 52.6118
+
+[node name="WoodenBox" type="RigidBody2D"]
+collision_layer = 256
+collision_mask = 160
+script = ExtResource("1_hfnuj")
+_initialDurability = null
+_maxDurability = 1
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+shape = SubResource("RectangleShape2D_vx4tg")
+
+[node name="OperateArea2D" type="Area2D" parent="."]
+visible = false
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="OperateArea2D"]
+shape = SubResource("CircleShape2D_in1f7")
+
+[node name="WoodenBox" type="Sprite2D" parent="."]
+texture = ExtResource("2_24vtp")
diff --git a/prefab/magics/x3.tscn b/prefab/magics/x3.tscn
index 2a136dd..e9db64b 100644
--- a/prefab/magics/x3.tscn
+++ b/prefab/magics/x3.tscn
@@ -15,6 +15,12 @@ collision_layer = 8
collision_mask = 34
angular_damp = -1.0
script = ExtResource("1_cnhod")
+NumberOfProjectiles = null
+RandomAngle = null
+UnitRadian = null
+_projectilePath = null
+_minContactInjury = null
+_maxContactInjury = null
[node name="DamageArea2D" type="Area2D" parent="."]
collision_layer = 8
diff --git a/prefab/roomTemplates/dungeon/initialRoom.tscn b/prefab/roomTemplates/dungeon/initialRoom.tscn
deleted file mode 100644
index 323a7a1..0000000
--- a/prefab/roomTemplates/dungeon/initialRoom.tscn
+++ /dev/null
@@ -1,106 +0,0 @@
-[gd_scene load_steps=9 format=4 uid="uid://du5ldsp613fei"]
-
-[ext_resource type="TileSet" uid="uid://c4wpp12rr44hi" path="res://tileSets/dungeon.tres" id="1_rn2om"]
-[ext_resource type="Script" path="res://scripts/map/PlayerSpawn.cs" id="2_6p8mv"]
-[ext_resource type="Script" path="res://scripts/map/ItemSpawn.cs" id="3_v1tlc"]
-[ext_resource type="Texture2D" uid="uid://drw45jlmfo0su" path="res://sprites/light/White_100.png" id="5_4pssd"]
-[ext_resource type="PackedScene" uid="uid://djsh4unystlf0" path="res://prefab/furnitures/SpellEditor.tscn" id="5_5u8y1"]
-
-[sub_resource type="RectangleShape2D" id="RectangleShape2D_kiih8"]
-size = Vector2(507, 251)
-
-[sub_resource type="RectangleShape2D" id="RectangleShape2D_jxmys"]
-size = Vector2(18, 57.75)
-
-[sub_resource type="NavigationPolygon" id="NavigationPolygon_064c7"]
-vertices = PackedVector2Array(467.773, 174, 499.828, 174, 499.156, 214.969, 40.9375, 214.023, 40.0469, 41.0625, 470.758, 43.9297)
-polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3), PackedInt32Array(0, 3, 4, 5)])
-outlines = Array[PackedVector2Array]([PackedVector2Array(30, 31, 31, 224, 509, 225, 510, 164, 478, 164, 481, 34)])
-source_geometry_group_name = &"navigation_polygon_source_group"
-
-[node name="InitialRoom" type="Node2D"]
-
-[node name="RoomArea" type="Area2D" parent="."]
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomArea"]
-position = Vector2(254.5, 129.5)
-shape = SubResource("RectangleShape2D_kiih8")
-
-[node name="RoomSlotList" type="Node2D" parent="."]
-
-[node name="Slot1" type="Area2D" parent="RoomSlotList"]
-position = Vector2(491, 193)
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomSlotList/Slot1"]
-position = Vector2(5, 0)
-shape = SubResource("RectangleShape2D_jxmys")
-debug_color = Color(0, 0.6, 0.701961, 0.419608)
-
-[node name="Marker2D" type="Marker2D" parent="."]
-position = Vector2(221, 134)
-script = ExtResource("2_6p8mv")
-
-[node name="ItemMarker2D" type="Marker2D" parent="."]
-position = Vector2(142, 84)
-script = ExtResource("3_v1tlc")
-ItemId = "staff_necromancy"
-
-[node name="ItemMarker2D3" type="Marker2D" parent="."]
-position = Vector2(214, 83)
-script = ExtResource("3_v1tlc")
-ItemId = "x3"
-
-[node name="ItemMarker2D4" type="Marker2D" parent="."]
-position = Vector2(366, 90)
-script = ExtResource("3_v1tlc")
-ItemId = "necromancy"
-
-[node name="ItemMarker2D2" type="Marker2D" parent="."]
-position = Vector2(321, 118)
-script = ExtResource("3_v1tlc")
-ItemId = "necromancy"
-
-[node name="ItemMarker2D5" type="Marker2D" parent="."]
-position = Vector2(381, 136)
-script = ExtResource("3_v1tlc")
-ItemId = "iron_axe"
-
-[node name="ItemMarker2D6" type="Marker2D" parent="."]
-position = Vector2(438, 79)
-script = ExtResource("3_v1tlc")
-ItemId = "curse"
-
-[node name="NavigationRegion2D" type="NavigationRegion2D" parent="."]
-navigation_polygon = SubResource("NavigationPolygon_064c7")
-
-[node name="TileMap" type="Node2D" parent="."]
-
-[node name="BackgroundWall" type="TileMapLayer" parent="TileMap"]
-use_parent_material = true
-tile_map_data = PackedByteArray("AAAOAAYAAQAGAAUAAAANAAYAAQAGAAUAAAAMAAYAAQAGAAUAAAALAAYAAQAGAAUAAAAKAAYAAQAGAAUAAAAJAAYAAQAGAAUAAAAIAAYAAQAGAAUAAAAHAAYAAQAGAAUAAAAGAAYAAQAGAAUAAAAOAAEAAQAGAAUAAAAOAAIAAQAGAAUAAAAOAAMAAQAGAAUAAAAOAAQAAQAGAAUAAAAOAAUAAQAGAAUAAAANAAUAAQAGAAUAAAANAAQAAQAGAAUAAAANAAMAAQAGAAUAAAANAAIAAQAGAAUAAAANAAEAAQAGAAUAAAAMAAEAAQAGAAUAAAALAAEAAQAGAAUAAAAKAAEAAQAGAAUAAAAJAAEAAQAGAAUAAAAIAAEAAQAGAAUAAAAHAAEAAQAGAAUAAAAGAAEAAQAGAAUAAAAFAAEAAQAGAAUAAAAEAAEAAQAGAAUAAAADAAEAAQAGAAUAAAACAAEAAQAGAAUAAAABAAEAAQAGAAUAAAABAAIAAQAGAAUAAAACAAIAAQAGAAUAAAADAAIAAQAGAAUAAAAEAAIAAQAGAAUAAAAFAAIAAQAGAAUAAAAGAAIAAQAGAAUAAAAHAAIAAQAGAAUAAAAIAAIAAQAGAAUAAAAJAAIAAQAGAAUAAAAKAAIAAQAGAAUAAAALAAIAAQAGAAUAAAAMAAIAAQAGAAUAAAAMAAMAAQAGAAUAAAALAAMAAQAGAAUAAAAKAAMAAQAGAAUAAAAJAAMAAQAGAAUAAAAIAAMAAQAEAAUAAAAHAAMAAQAGAAUAAAAGAAMAAQAGAAUAAAAFAAMAAQAEAAUAAAAEAAMAAQAGAAUAAAADAAMAAQAGAAUAAAACAAMAAQAGAAUAAAABAAMAAQAGAAUAAAABAAQAAQAGAAUAAAACAAQAAQAGAAUAAAADAAQAAQAGAAUAAAAEAAQAAQAGAAUAAAAFAAQAAQAGAAUAAAAGAAQAAQAGAAUAAAAHAAQAAQAGAAUAAAAIAAQAAQAGAAUAAAAJAAQAAQAGAAUAAAAKAAQAAQAGAAUAAAALAAQAAQAGAAUAAAAMAAQAAQAGAAUAAAAMAAUAAQAGAAUAAAALAAUAAQAGAAUAAAAKAAUAAQAGAAUAAAAJAAUAAQAGAAUAAAAIAAUAAQAGAAUAAAAHAAUAAQAGAAUAAAAGAAUAAQAGAAUAAAAFAAUAAQAGAAUAAAAEAAUAAQAGAAUAAAADAAUAAQAGAAUAAAACAAUAAQAGAAUAAAABAAUAAQAGAAUAAAABAAYAAQAGAAUAAAACAAYAAQAGAAUAAAADAAYAAQAGAAUAAAAEAAYAAQAGAAUAAAAFAAYAAQAGAAUAAAAPAAYAAQAGAAUAAAAPAAUAAQAGAAUAAAA=")
-tile_set = ExtResource("1_rn2om")
-navigation_enabled = false
-
-[node name="BackgroundDecoration" type="TileMapLayer" parent="TileMap"]
-use_parent_material = true
-tile_map_data = PackedByteArray("AAACAAYAAQAHAAUAAAAOAAEAAQAHAAQAAAA=")
-tile_set = ExtResource("1_rn2om")
-
-[node name="Ground" type="TileMapLayer" parent="TileMap"]
-use_parent_material = true
-tile_map_data = PackedByteArray("AAAAAAAAAQAAAAMAAAAAAAEAAQACAAEAAAAAAAIAAQACAAEAAAAAAAMAAQACAAEAAAAAAAQAAQACAAEAAAAAAAcAAQAAAAUAAAAPAAAAAQACAAMAAAAPAAEAAQACAAQAAAAPAAIAAQACAAQAAAAPAAMAAQACAAQAAAAPAAQAAQACAAQAAAAPAAcAAQACAAUAAAAAAAUAAQACAAEAAAAAAAYAAQACAAEAAAABAAAAAQABAAIAAAACAAAAAQABAAIAAAADAAAAAQABAAIAAAAEAAAAAQABAAIAAAAFAAAAAQABAAIAAAAGAAAAAQABAAIAAAAHAAAAAQABAAIAAAAIAAAAAQABAAIAAAAJAAAAAQABAAIAAAAKAAAAAQABAAIAAAALAAAAAQABAAIAAAAMAAAAAQABAAIAAAANAAAAAQABAAIAAAAOAAAAAQABAAMAAAABAAcAAQABAAAAAAACAAcAAQABAAAAAAADAAcAAQABAAAAAAAEAAcAAQABAAAAAAAFAAcAAQABAAAAAAAGAAcAAQABAAAAAAAHAAcAAQABAAAAAAAIAAcAAQABAAAAAAAJAAcAAQABAAAAAAAKAAcAAQABAAAAAAALAAcAAQABAAAAAAAMAAcAAQABAAAAAAANAAcAAQABAAAAAAAOAAcAAQABAAAAAAA=")
-tile_set = ExtResource("1_rn2om")
-
-[node name="Barrier" type="TileMapLayer" parent="TileMap"]
-use_parent_material = true
-tile_map_data = PackedByteArray("AAAPAAUAAQAAAAEAAAAPAAYAAQAAAAEAAAA=")
-tile_set = ExtResource("1_rn2om")
-
-[node name="PointLight2D" type="PointLight2D" parent="."]
-visible = false
-position = Vector2(259.5, 128.5)
-scale = Vector2(16.0312, 7.96875)
-texture = ExtResource("5_4pssd")
-
-[node name="RigidBody2D" parent="." instance=ExtResource("5_5u8y1")]
-position = Vector2(106, 147)
diff --git a/prefab/roomTemplates/tutorials/spellEditor.tscn b/prefab/roomTemplates/tutorials/spellEditor.tscn
new file mode 100644
index 0000000..2fd3228
--- /dev/null
+++ b/prefab/roomTemplates/tutorials/spellEditor.tscn
@@ -0,0 +1,119 @@
+[gd_scene load_steps=11 format=4 uid="uid://du5ldsp613fei"]
+
+[ext_resource type="Script" path="res://scripts/map/PlayerSpawn.cs" id="1_q04qt"]
+[ext_resource type="TileSet" uid="uid://c4wpp12rr44hi" path="res://tileSets/dungeon.tres" id="2_5bnvh"]
+[ext_resource type="Texture2D" uid="uid://drw45jlmfo0su" path="res://sprites/light/White_100.png" id="3_atgj7"]
+[ext_resource type="Script" path="res://scripts/map/ItemSpawn.cs" id="4_6ihp7"]
+[ext_resource type="PackedScene" uid="uid://djsh4unystlf0" path="res://prefab/furnitures/SpellEditor.tscn" id="5_0kep0"]
+[ext_resource type="Texture2D" uid="uid://cdjmfqp854utu" path="res://sprites/tutorials/spellEditor.png" id="6_dbg76"]
+[ext_resource type="PackedScene" uid="uid://dld3qttpsdjpe" path="res://prefab/furnitures/WoodenBox.tscn" id="7_jybe6"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_kiih8"]
+size = Vector2(709, 296)
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_jxmys"]
+size = Vector2(23, 54.875)
+
+[sub_resource type="NavigationPolygon" id="NavigationPolygon_064c7"]
+vertices = PackedVector2Array(756.172, 267.297, 756.82, 306.008, 45.0312, 306.977, 723.094, 268.297, 45.9688, 42, 721.094, 42)
+polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3), PackedInt32Array(3, 2, 4, 5)])
+outlines = Array[PackedVector2Array]([PackedVector2Array(36, 32, 731, 32, 733, 258, 766, 257, 767, 316, 35, 317)])
+source_geometry_group_name = &"navigation_polygon_source_group"
+
+[node name="InitialRoom" type="Node2D"]
+
+[node name="RoomArea" type="Area2D" parent="."]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomArea"]
+position = Vector2(383.5, 176)
+shape = SubResource("RectangleShape2D_kiih8")
+
+[node name="RoomSlotList" type="Node2D" parent="."]
+
+[node name="Slot1" type="Area2D" parent="RoomSlotList"]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomSlotList/Slot1"]
+position = Vector2(751.5, 289.438)
+shape = SubResource("RectangleShape2D_jxmys")
+debug_color = Color(0, 0.6, 0.701961, 0.419608)
+
+[node name="Marker2D" type="Marker2D" parent="."]
+position = Vector2(54, 256)
+script = ExtResource("1_q04qt")
+
+[node name="NavigationRegion2D" type="NavigationRegion2D" parent="."]
+navigation_polygon = SubResource("NavigationPolygon_064c7")
+
+[node name="TileMap" type="Node2D" parent="."]
+
+[node name="BackgroundWall" type="TileMapLayer" parent="TileMap"]
+use_parent_material = true
+tile_map_data = PackedByteArray("AAAOAAYAAQAGAAUAAAANAAYAAQAGAAUAAAAMAAYAAQAGAAUAAAALAAYAAQAGAAUAAAAKAAYAAQAGAAUAAAAJAAYAAQAGAAUAAAAIAAYAAQAGAAUAAAAHAAYAAQAGAAUAAAAGAAYAAQAGAAUAAAAOAAEAAQAGAAUAAAAOAAIAAQAGAAUAAAAOAAMAAQAGAAUAAAAOAAQAAQAGAAUAAAAOAAUAAQAGAAUAAAANAAUAAQAGAAUAAAANAAQAAQAGAAUAAAANAAMAAQAGAAUAAAANAAIAAQAGAAUAAAANAAEAAQAGAAUAAAAMAAEAAQAGAAUAAAALAAEAAQAGAAUAAAAKAAEAAQAGAAUAAAAJAAEAAQAGAAUAAAAIAAEAAQAGAAUAAAAHAAEAAQAGAAUAAAAGAAEAAQAGAAUAAAAFAAEAAQAGAAUAAAAEAAEAAQAGAAUAAAADAAEAAQAGAAUAAAACAAEAAQAGAAUAAAABAAEAAQAGAAUAAAABAAIAAQAGAAUAAAACAAIAAQAGAAUAAAADAAIAAQAGAAUAAAAEAAIAAQAGAAUAAAAFAAIAAQAGAAUAAAAGAAIAAQAGAAUAAAAHAAIAAQAGAAUAAAAIAAIAAQAGAAUAAAAJAAIAAQAGAAUAAAAKAAIAAQAGAAUAAAALAAIAAQAGAAUAAAAMAAIAAQAGAAUAAAAMAAMAAQAGAAUAAAALAAMAAQAGAAUAAAAKAAMAAQAGAAUAAAAJAAMAAQAGAAUAAAAIAAMAAQAGAAUAAAAHAAMAAQAGAAUAAAAGAAMAAQAGAAUAAAAFAAMAAQAGAAUAAAAEAAMAAQAGAAUAAAADAAMAAQAGAAUAAAACAAMAAQAGAAUAAAABAAMAAQAGAAUAAAABAAQAAQAGAAUAAAACAAQAAQAGAAUAAAADAAQAAQAGAAUAAAAEAAQAAQAGAAUAAAAFAAQAAQAGAAUAAAAGAAQAAQAGAAUAAAAHAAQAAQAGAAUAAAAIAAQAAQAGAAUAAAAJAAQAAQAGAAUAAAAKAAQAAQAGAAUAAAALAAQAAQAGAAUAAAAMAAQAAQAGAAUAAAAMAAUAAQAGAAUAAAALAAUAAQAGAAUAAAAKAAUAAQAGAAUAAAAJAAUAAQAGAAUAAAAIAAUAAQAGAAUAAAAHAAUAAQAGAAUAAAAGAAUAAQAGAAUAAAAFAAUAAQAGAAUAAAAEAAUAAQAGAAUAAAADAAUAAQAGAAUAAAACAAUAAQAGAAUAAAABAAUAAQAGAAUAAAABAAYAAQAGAAUAAAACAAYAAQAGAAUAAAADAAYAAQAGAAUAAAAEAAYAAQAGAAUAAAAFAAYAAQAGAAUAAAAPAAYAAQAGAAUAAAAPAAUAAQAGAAUAAAABAAcAAQAGAAUAAAABAAgAAQAGAAUAAAABAAkAAQAGAAUAAAACAAkAAQAGAAUAAAACAAgAAQAGAAUAAAACAAcAAQAGAAUAAAADAAcAAQAGAAUAAAADAAgAAQAGAAUAAAADAAkAAQAGAAUAAAAEAAkAAQAGAAUAAAAEAAgAAQAGAAUAAAAEAAcAAQAGAAUAAAAFAAcAAQAGAAUAAAAFAAgAAQAGAAUAAAAFAAkAAQAGAAUAAAAGAAkAAQAGAAUAAAAGAAgAAQAGAAUAAAAGAAcAAQAGAAUAAAAHAAgAAQAGAAUAAAAHAAkAAQAGAAUAAAAHAAcAAQAGAAUAAAAIAAcAAQAGAAUAAAAIAAgAAQAGAAUAAAAIAAkAAQAGAAUAAAAJAAkAAQAGAAUAAAAJAAgAAQAGAAUAAAAJAAcAAQAGAAUAAAAKAAcAAQAGAAUAAAAKAAgAAQAGAAUAAAAKAAkAAQAGAAUAAAALAAkAAQAGAAUAAAALAAgAAQAGAAUAAAALAAcAAQAGAAUAAAAMAAcAAQAGAAUAAAAMAAgAAQAGAAUAAAAMAAkAAQAGAAUAAAANAAkAAQAGAAUAAAANAAgAAQAGAAUAAAANAAcAAQAGAAUAAAAOAAcAAQAGAAUAAAAOAAgAAQAGAAUAAAAOAAkAAQAGAAUAAAAPAAkAAQAGAAUAAAAPAAgAAQAGAAUAAAAPAAcAAQAGAAUAAAAPAAQAAQAGAAUAAAAPAAMAAQAGAAUAAAAPAAIAAQAGAAUAAAAPAAEAAQAGAAUAAAAQAAEAAQAGAAUAAAARAAEAAQAGAAUAAAASAAEAAQAGAAUAAAATAAEAAQAGAAUAAAAUAAEAAQAGAAUAAAAVAAEAAQAGAAUAAAAWAAEAAQAGAAUAAAAWAAIAAQAGAAUAAAAVAAIAAQAGAAUAAAAUAAIAAQAGAAUAAAATAAIAAQAGAAUAAAASAAIAAQAGAAUAAAARAAIAAQAGAAUAAAAQAAIAAQAGAAUAAAAQAAMAAQAGAAUAAAARAAMAAQAGAAUAAAASAAMAAQAGAAUAAAATAAMAAQAGAAUAAAAUAAMAAQAGAAUAAAAVAAMAAQAGAAUAAAAWAAMAAQAGAAUAAAAWAAQAAQAGAAUAAAAVAAQAAQAGAAUAAAAUAAQAAQAGAAUAAAATAAQAAQAGAAUAAAASAAQAAQAGAAUAAAARAAQAAQAGAAUAAAAQAAQAAQAGAAUAAAAQAAUAAQAGAAUAAAARAAUAAQAGAAUAAAASAAUAAQAGAAUAAAATAAUAAQAGAAUAAAAUAAUAAQAGAAUAAAAVAAUAAQAGAAUAAAAWAAUAAQAGAAUAAAAWAAYAAQAGAAUAAAAVAAYAAQAGAAUAAAAUAAYAAQAGAAUAAAATAAYAAQAGAAUAAAASAAYAAQAGAAUAAAARAAYAAQAGAAUAAAAQAAYAAQAGAAUAAAAQAAcAAQAGAAUAAAARAAcAAQAGAAUAAAASAAcAAQAGAAUAAAATAAcAAQAGAAUAAAAUAAcAAQAGAAUAAAAVAAcAAQAGAAUAAAAWAAcAAQAGAAUAAAAWAAgAAQAGAAUAAAAVAAgAAQAGAAUAAAAUAAgAAQAGAAUAAAATAAgAAQAGAAUAAAASAAgAAQAGAAUAAAARAAgAAQAGAAUAAAAQAAgAAQAGAAUAAAAQAAkAAQAGAAUAAAARAAkAAQAGAAUAAAASAAkAAQAGAAUAAAATAAkAAQAGAAUAAAAUAAkAAQAGAAUAAAAVAAkAAQAGAAUAAAAWAAkAAQAGAAUAAAAXAAkAAQAGAAUAAAAXAAgAAQAGAAUAAAA=")
+tile_set = ExtResource("2_5bnvh")
+navigation_enabled = false
+
+[node name="BackgroundDecoration" type="TileMapLayer" parent="TileMap"]
+use_parent_material = true
+tile_map_data = PackedByteArray("AAAEAAkAAQAHAAUAAAAWAAEAAQAHAAQAAAA=")
+tile_set = ExtResource("2_5bnvh")
+
+[node name="Ground" type="TileMapLayer" parent="TileMap"]
+use_parent_material = true
+tile_map_data = PackedByteArray("AAAAAAAAAQAAAAMAAAAAAAEAAQACAAEAAAAAAAIAAQACAAEAAAAAAAMAAQACAAEAAAAAAAQAAQACAAEAAAAAAAcAAQACAAEAAAAPAAAAAQABAAIAAAAAAAUAAQACAAEAAAAAAAYAAQACAAEAAAABAAAAAQABAAIAAAACAAAAAQABAAIAAAADAAAAAQABAAIAAAAEAAAAAQABAAIAAAAFAAAAAQABAAIAAAAGAAAAAQABAAIAAAAHAAAAAQABAAIAAAAIAAAAAQABAAIAAAAJAAAAAQABAAIAAAAKAAAAAQABAAIAAAALAAAAAQABAAIAAAAMAAAAAQABAAIAAAANAAAAAQABAAIAAAAOAAAAAQABAAMAAAAAAAgAAQACAAEAAAAAAAkAAQACAAEAAAAAAAoAAQAAAAUAAAABAAoAAQABAAAAAAACAAoAAQABAAAAAAADAAoAAQABAAAAAAAEAAoAAQABAAAAAAAFAAoAAQABAAAAAAAGAAoAAQABAAAAAAAHAAoAAQABAAAAAAAIAAoAAQABAAAAAAAJAAoAAQABAAAAAAAKAAoAAQABAAAAAAALAAoAAQABAAAAAAAMAAoAAQABAAAAAAANAAoAAQABAAAAAAAOAAoAAQABAAAAAAAPAAoAAQABAAAAAAAQAAoAAQABAAAAAAARAAoAAQABAAAAAAASAAoAAQABAAAAAAATAAoAAQABAAAAAAAUAAoAAQABAAAAAAAVAAoAAQABAAAAAAAWAAoAAQABAAAAAAAXAAoAAQACAAUAAAAQAAAAAQABAAIAAAARAAAAAQABAAIAAAASAAAAAQABAAIAAAATAAAAAQABAAIAAAAUAAAAAQABAAIAAAAXAAcAAQAAAAEAAAAXAAYAAQAAAAEAAAAXAAUAAQAAAAEAAAAXAAQAAQAAAAEAAAAXAAMAAQAAAAEAAAAXAAIAAQAAAAEAAAAXAAEAAQAAAAEAAAAXAAAAAQACAAMAAAAVAAAAAQABAAIAAAAWAAAAAQABAAIAAAA=")
+tile_set = ExtResource("2_5bnvh")
+
+[node name="Barrier" type="TileMapLayer" parent="TileMap"]
+use_parent_material = true
+tile_map_data = PackedByteArray("AAAXAAgAAQAAAAEAAAAXAAkAAQAAAAEAAAA=")
+tile_set = ExtResource("2_5bnvh")
+
+[node name="PointLight2D" type="PointLight2D" parent="."]
+visible = false
+position = Vector2(386, 178)
+scale = Vector2(23.9375, 11.0625)
+texture = ExtResource("3_atgj7")
+
+[node name="Marker2D2" type="Marker2D" parent="."]
+position = Vector2(100, 250)
+script = ExtResource("4_6ihp7")
+ItemId = "staff_necromancy"
+
+[node name="Marker2D3" type="Marker2D" parent="."]
+position = Vector2(134, 248)
+script = ExtResource("4_6ihp7")
+ItemId = "necromancy"
+
+[node name="Label" type="Label" parent="."]
+offset_left = 37.0
+offset_top = 46.0
+offset_right = 200.0
+offset_bottom = 71.0
+text = "ui_tutorial_spellEditor"
+
+[node name="Label2" type="Label" parent="."]
+offset_left = 391.0
+offset_top = 261.0
+offset_right = 554.0
+offset_bottom = 286.0
+text = "ui_tutorial_break_box"
+
+[node name="SpellEditor" type="Sprite2D" parent="."]
+position = Vector2(621, 100)
+texture = ExtResource("6_dbg76")
+
+[node name="RigidBody2D" parent="." instance=ExtResource("5_0kep0")]
+position = Vector2(227, 283)
+_initialDurability = null
+_maxDurability = null
+
+[node name="WoodenBox" parent="." instance=ExtResource("7_jybe6")]
+position = Vector2(715, 244)
+
+[node name="WoodenBox2" parent="." instance=ExtResource("7_jybe6")]
+position = Vector2(715, 200)
+
+[node name="WoodenBox3" parent="." instance=ExtResource("7_jybe6")]
+position = Vector2(715, 162)
+
+[node name="WoodenBox4" parent="." instance=ExtResource("7_jybe6")]
+position = Vector2(714, 122)
diff --git a/prefab/roomTemplates/tutorials/tripleShotSpell.tscn b/prefab/roomTemplates/tutorials/tripleShotSpell.tscn
new file mode 100644
index 0000000..481eab3
--- /dev/null
+++ b/prefab/roomTemplates/tutorials/tripleShotSpell.tscn
@@ -0,0 +1,133 @@
+[gd_scene load_steps=11 format=4 uid="uid://dodxp4mm0emj3"]
+
+[ext_resource type="TileSet" uid="uid://c4wpp12rr44hi" path="res://tileSets/dungeon.tres" id="2_k54gk"]
+[ext_resource type="Texture2D" uid="uid://drw45jlmfo0su" path="res://sprites/light/White_100.png" id="3_d6t7n"]
+[ext_resource type="PackedScene" uid="uid://dld3qttpsdjpe" path="res://prefab/furnitures/WoodenBox.tscn" id="4_60glh"]
+[ext_resource type="Script" path="res://scripts/map/ItemSpawn.cs" id="4_fh50l"]
+[ext_resource type="PackedScene" uid="uid://djsh4unystlf0" path="res://prefab/furnitures/SpellEditor.tscn" id="5_ll4ng"]
+[ext_resource type="Texture2D" uid="uid://kgodvs3ilxbs" path="res://sprites/tutorials/tripleShotSpell.png" id="6_2qcf3"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_kiih8"]
+size = Vector2(709, 296)
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_jxmys"]
+size = Vector2(23, 54.875)
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_xgxoy"]
+size = Vector2(26, 57)
+
+[sub_resource type="NavigationPolygon" id="NavigationPolygon_064c7"]
+vertices = PackedVector2Array(728.094, 269, 755.672, 269, 754.328, 309.062, 457.93, 310.93, 621.094, 264.742, 619.094, 45.0781, 726.078, 45.9219, 562.906, 266.273, 456.93, 150.68, 564.898, 43.0078, 42.9531, 43.9766, 404.938, 157.18, 41.9609, 265.109, 405.93, 309.023, 10, 309.969, 10, 268.102)
+polygons = Array[PackedInt32Array]([PackedInt32Array(0, 1, 2, 3), PackedInt32Array(4, 5, 6, 0), PackedInt32Array(4, 0, 3, 7), PackedInt32Array(7, 3, 8, 9), PackedInt32Array(10, 9, 8, 11), PackedInt32Array(12, 10, 11, 13), PackedInt32Array(12, 13, 14, 15)])
+outlines = Array[PackedVector2Array]([PackedVector2Array(33, 34, 32, 256, 0, 259, 0, 320, 416, 319, 415, 166, 447, 162, 448, 321, 764, 319, 766, 259, 738, 259, 736, 36, 609, 35, 611, 255, 573, 256, 575, 33)])
+source_geometry_group_name = &"navigation_polygon_source_group"
+
+[node name="InitialRoom" type="Node2D"]
+
+[node name="RoomArea" type="Area2D" parent="."]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomArea"]
+position = Vector2(383.5, 176)
+shape = SubResource("RectangleShape2D_kiih8")
+
+[node name="RoomSlotList" type="Node2D" parent="."]
+
+[node name="Slot1" type="Area2D" parent="RoomSlotList"]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomSlotList/Slot1"]
+position = Vector2(751.5, 289.438)
+shape = SubResource("RectangleShape2D_jxmys")
+debug_color = Color(0, 0.6, 0.701961, 0.419608)
+
+[node name="Area2D" type="Area2D" parent="RoomSlotList"]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomSlotList/Area2D"]
+position = Vector2(17, 288)
+shape = SubResource("RectangleShape2D_xgxoy")
+
+[node name="NavigationRegion2D" type="NavigationRegion2D" parent="."]
+navigation_polygon = SubResource("NavigationPolygon_064c7")
+
+[node name="TileMap" type="Node2D" parent="."]
+
+[node name="BackgroundWall" type="TileMapLayer" parent="TileMap"]
+use_parent_material = true
+tile_map_data = PackedByteArray("AAAOAAYAAQAGAAUAAAANAAYAAQAGAAUAAAAMAAYAAQAGAAUAAAALAAYAAQAGAAUAAAAKAAYAAQAGAAUAAAAJAAYAAQAGAAUAAAAIAAYAAQAGAAUAAAAHAAYAAQAGAAUAAAAGAAYAAQAGAAUAAAAOAAEAAQAGAAUAAAAOAAIAAQAGAAUAAAAOAAMAAQAGAAUAAAAOAAQAAQAGAAUAAAAOAAUAAQAGAAUAAAANAAUAAQAGAAUAAAANAAQAAQAGAAUAAAANAAMAAQAGAAUAAAANAAIAAQAGAAUAAAANAAEAAQAGAAUAAAAMAAEAAQAGAAUAAAALAAEAAQAGAAUAAAAKAAEAAQAGAAUAAAAJAAEAAQAGAAUAAAAIAAEAAQAGAAUAAAAHAAEAAQAGAAUAAAAGAAEAAQAGAAUAAAAFAAEAAQAGAAUAAAAEAAEAAQAGAAUAAAADAAEAAQAGAAUAAAACAAEAAQAGAAUAAAABAAEAAQAGAAUAAAABAAIAAQAGAAUAAAACAAIAAQAGAAUAAAADAAIAAQAGAAUAAAAEAAIAAQAGAAUAAAAFAAIAAQAGAAUAAAAGAAIAAQAGAAUAAAAHAAIAAQAGAAUAAAAIAAIAAQAGAAUAAAAJAAIAAQAGAAUAAAAKAAIAAQAGAAUAAAALAAIAAQAGAAUAAAAMAAIAAQAGAAUAAAAMAAMAAQAGAAUAAAALAAMAAQAGAAUAAAAKAAMAAQAGAAUAAAAJAAMAAQAGAAUAAAAIAAMAAQAGAAUAAAAHAAMAAQAGAAUAAAAGAAMAAQAGAAUAAAAFAAMAAQAGAAUAAAAEAAMAAQAGAAUAAAADAAMAAQAGAAUAAAACAAMAAQAGAAUAAAABAAMAAQAGAAUAAAABAAQAAQAGAAUAAAACAAQAAQAGAAUAAAADAAQAAQAGAAUAAAAEAAQAAQAGAAUAAAAFAAQAAQAGAAUAAAAGAAQAAQAGAAUAAAAHAAQAAQAGAAUAAAAIAAQAAQAGAAUAAAAJAAQAAQAGAAUAAAAKAAQAAQAGAAUAAAALAAQAAQAGAAUAAAAMAAQAAQAGAAUAAAAMAAUAAQAGAAUAAAALAAUAAQAGAAUAAAAKAAUAAQAGAAUAAAAJAAUAAQAGAAUAAAAIAAUAAQAGAAUAAAAHAAUAAQAGAAUAAAAGAAUAAQAGAAUAAAAFAAUAAQAGAAUAAAAEAAUAAQAGAAUAAAADAAUAAQAGAAUAAAACAAUAAQAGAAUAAAABAAUAAQAGAAUAAAABAAYAAQAGAAUAAAACAAYAAQAGAAUAAAADAAYAAQAGAAUAAAAEAAYAAQAGAAUAAAAFAAYAAQAGAAUAAAAPAAYAAQAGAAUAAAAPAAUAAQAGAAUAAAABAAcAAQAGAAUAAAABAAgAAQAGAAUAAAABAAkAAQAGAAUAAAACAAkAAQAGAAUAAAACAAgAAQAGAAUAAAACAAcAAQAGAAUAAAADAAcAAQAGAAUAAAADAAgAAQAGAAUAAAADAAkAAQAGAAUAAAAEAAkAAQAGAAUAAAAEAAgAAQAGAAUAAAAEAAcAAQAGAAUAAAAFAAcAAQAGAAUAAAAFAAgAAQAGAAUAAAAFAAkAAQAGAAUAAAAGAAkAAQAGAAUAAAAGAAgAAQAGAAUAAAAGAAcAAQAGAAUAAAAHAAgAAQAGAAUAAAAHAAkAAQAGAAUAAAAHAAcAAQAGAAUAAAAIAAcAAQAGAAUAAAAIAAgAAQAGAAUAAAAIAAkAAQAGAAUAAAAJAAkAAQAGAAUAAAAJAAgAAQAGAAUAAAAJAAcAAQAGAAUAAAAKAAcAAQAGAAUAAAAKAAgAAQAGAAUAAAAKAAkAAQAGAAUAAAALAAkAAQAGAAUAAAALAAgAAQAGAAUAAAALAAcAAQAGAAUAAAAMAAcAAQAGAAUAAAAMAAgAAQAGAAUAAAAMAAkAAQAGAAUAAAANAAkAAQAGAAUAAAANAAgAAQAGAAUAAAANAAcAAQAGAAUAAAAOAAcAAQAGAAUAAAAOAAgAAQAGAAUAAAAOAAkAAQAGAAUAAAAPAAkAAQAGAAUAAAAPAAgAAQAGAAUAAAAPAAcAAQAGAAUAAAAPAAQAAQAGAAUAAAAPAAMAAQAGAAUAAAAPAAIAAQAGAAUAAAAPAAEAAQAGAAUAAAAQAAEAAQAGAAUAAAARAAEAAQAGAAUAAAASAAEAAQAGAAUAAAATAAEAAQAGAAUAAAAUAAEAAQAGAAUAAAAVAAEAAQAGAAUAAAAWAAEAAQAGAAUAAAAWAAIAAQAGAAUAAAAVAAIAAQAGAAUAAAAUAAIAAQAGAAUAAAATAAIAAQAGAAUAAAASAAIAAQAGAAUAAAARAAIAAQAGAAUAAAAQAAIAAQAGAAUAAAAQAAMAAQAGAAUAAAARAAMAAQAGAAUAAAASAAMAAQAGAAUAAAATAAMAAQAGAAUAAAAUAAMAAQAGAAUAAAAVAAMAAQAGAAUAAAAWAAMAAQAGAAUAAAAWAAQAAQAGAAUAAAAVAAQAAQAGAAUAAAAUAAQAAQAGAAUAAAATAAQAAQAGAAUAAAASAAQAAQAGAAUAAAARAAQAAQAGAAUAAAAQAAQAAQAGAAUAAAAQAAUAAQAGAAUAAAARAAUAAQAGAAUAAAASAAUAAQAGAAUAAAATAAUAAQAGAAUAAAAUAAUAAQAGAAUAAAAVAAUAAQAGAAUAAAAWAAUAAQAGAAUAAAAWAAYAAQAGAAUAAAAVAAYAAQAGAAUAAAAUAAYAAQAGAAUAAAATAAYAAQAGAAUAAAASAAYAAQAGAAUAAAARAAYAAQAGAAUAAAAQAAYAAQAGAAUAAAAQAAcAAQAGAAUAAAARAAcAAQAGAAUAAAASAAcAAQAGAAUAAAATAAcAAQAGAAUAAAAUAAcAAQAGAAUAAAAVAAcAAQAGAAUAAAAWAAcAAQAGAAUAAAAWAAgAAQAGAAUAAAAVAAgAAQAGAAUAAAAUAAgAAQAGAAUAAAATAAgAAQAGAAUAAAASAAgAAQAGAAUAAAARAAgAAQAGAAUAAAAQAAgAAQAGAAUAAAAQAAkAAQAGAAUAAAARAAkAAQAGAAUAAAASAAkAAQAGAAUAAAATAAkAAQAGAAUAAAAUAAkAAQAGAAUAAAAVAAkAAQAGAAUAAAAWAAkAAQAGAAUAAAAXAAkAAQAGAAUAAAAXAAgAAQAGAAUAAAAAAAkAAQAGAAUAAAAAAAgAAQAGAAUAAAA=")
+tile_set = ExtResource("2_k54gk")
+navigation_enabled = false
+
+[node name="BackgroundDecoration" type="TileMapLayer" parent="TileMap"]
+use_parent_material = true
+tile_map_data = PackedByteArray("AAAWAAEAAQAHAAQAAAACAAkAAQAHAAEAAAA=")
+tile_set = ExtResource("2_k54gk")
+
+[node name="Ground" type="TileMapLayer" parent="TileMap"]
+use_parent_material = true
+tile_map_data = PackedByteArray("AAAAAAAAAQAAAAMAAAAAAAEAAQACAAEAAAAAAAIAAQACAAEAAAAAAAMAAQACAAEAAAAAAAQAAQACAAEAAAAAAAcAAQACAAEAAAAPAAAAAQABAAIAAAAAAAUAAQACAAEAAAAAAAYAAQACAAEAAAABAAAAAQABAAIAAAACAAAAAQABAAIAAAADAAAAAQABAAIAAAAEAAAAAQABAAIAAAAFAAAAAQABAAIAAAAGAAAAAQABAAIAAAAHAAAAAQABAAIAAAAIAAAAAQABAAIAAAAJAAAAAQABAAIAAAAKAAAAAQABAAIAAAALAAAAAQABAAIAAAAMAAAAAQABAAIAAAANAAAAAQABAAIAAAAOAAAAAQABAAMAAAAAAAoAAQAAAAUAAAABAAoAAQABAAAAAAACAAoAAQABAAAAAAADAAoAAQABAAAAAAAEAAoAAQABAAAAAAAFAAoAAQABAAAAAAAGAAoAAQABAAAAAAAHAAoAAQABAAAAAAAIAAoAAQABAAAAAAAJAAoAAQABAAAAAAAKAAoAAQABAAAAAAALAAoAAQABAAAAAAAMAAoAAQABAAAAAAANAAoAAQABAAAAAAAOAAoAAQABAAAAAAAPAAoAAQABAAAAAAAQAAoAAQABAAAAAAARAAoAAQABAAAAAAASAAoAAQABAAAAAAATAAoAAQABAAAAAAAUAAoAAQABAAAAAAAVAAoAAQABAAAAAAAWAAoAAQABAAAAAAAXAAoAAQACAAUAAAAQAAAAAQABAAIAAAARAAAAAQABAAIAAAASAAAAAQABAAIAAAATAAAAAQABAAIAAAAUAAAAAQABAAIAAAAXAAcAAQAAAAEAAAAXAAYAAQAAAAEAAAAXAAUAAQAAAAEAAAAXAAQAAQAAAAEAAAAXAAMAAQAAAAEAAAAXAAIAAQAAAAEAAAAXAAEAAQAAAAEAAAAXAAAAAQACAAMAAAAVAAAAAQABAAIAAAAWAAAAAQABAAIAAAAEAAkAAQAEAAQAAAAFAAgAAQAEAAQAAAAGAAcAAQAEAAQAAAAHAAYAAQAEAAQAAAAIAAUAAQAEAAQAAAAKAAUAAQAEAAQAAAAMAAUAAQAEAAQAAAAOAAUAAQADAAQAAAAQAAUAAQAEAAQAAAASAAUAAQADAAAAAAAJAAUAAQAEAAQAAAALAAUAAQAEAAQAAAANAAkAAQADAAAAAAANAAgAAQADAAAAAAANAAcAAQADAAAAAAANAAYAAQADAAAAAAANAAUAAQADAAAAAAAPAAUAAQAEAAQAAAARAAUAAQAFAAQAAAASAAYAAQADAAAAAAASAAcAAQADAAAAAAASAAQAAQADAAAAAAASAAMAAQADAAAAAAASAAIAAQADAAAAAAASAAEAAQADAAAAAAA=")
+tile_set = ExtResource("2_k54gk")
+
+[node name="Barrier" type="TileMapLayer" parent="TileMap"]
+use_parent_material = true
+tile_map_data = PackedByteArray("AAAXAAgAAQAAAAEAAAAXAAkAAQAAAAEAAAAAAAgAAQACAAEAAAAAAAkAAQACAAEAAAA=")
+tile_set = ExtResource("2_k54gk")
+
+[node name="PointLight2D" type="PointLight2D" parent="."]
+visible = false
+position = Vector2(386, 178)
+scale = Vector2(23.9375, 11.0625)
+texture = ExtResource("3_d6t7n")
+
+[node name="Label" type="Label" parent="."]
+offset_left = 54.0
+offset_top = 55.0
+offset_right = 277.0
+offset_bottom = 80.0
+text = "ui_tutorial_jump_onto_platform"
+
+[node name="Label2" type="Label" parent="."]
+offset_left = 151.0
+offset_top = 126.0
+offset_right = 453.0
+offset_bottom = 151.0
+text = "ui_tutorial_combine_more_powerful_spells"
+
+[node name="Marker2D" type="Marker2D" parent="."]
+position = Vector2(434, 105)
+script = ExtResource("4_fh50l")
+ItemId = "x3"
+
+[node name="WoodenBox" parent="." instance=ExtResource("4_60glh")]
+position = Vector2(711, 179)
+
+[node name="WoodenBox4" parent="." instance=ExtResource("4_60glh")]
+position = Vector2(676, 179)
+
+[node name="WoodenBox5" parent="." instance=ExtResource("4_60glh")]
+position = Vector2(676, 144)
+
+[node name="WoodenBox6" parent="." instance=ExtResource("4_60glh")]
+position = Vector2(675, 102)
+
+[node name="WoodenBox7" parent="." instance=ExtResource("4_60glh")]
+position = Vector2(641, 180)
+
+[node name="WoodenBox8" parent="." instance=ExtResource("4_60glh")]
+position = Vector2(640, 142)
+
+[node name="WoodenBox9" parent="." instance=ExtResource("4_60glh")]
+position = Vector2(640, 101)
+
+[node name="WoodenBox2" parent="." instance=ExtResource("4_60glh")]
+position = Vector2(712, 138)
+
+[node name="WoodenBox3" parent="." instance=ExtResource("4_60glh")]
+position = Vector2(711, 98)
+
+[node name="RigidBody2D" parent="." instance=ExtResource("5_ll4ng")]
+position = Vector2(473, 285)
+_initialDurability = null
+_maxDurability = null
+
+[node name="TripleShotSpell" type="Sprite2D" parent="."]
+position = Vector2(637, 85)
+texture = ExtResource("6_2qcf3")
diff --git a/project.godot b/project.godot
index ca91971..ecdbda5 100644
--- a/project.godot
+++ b/project.godot
@@ -169,6 +169,7 @@ locale/translations=PackedStringArray("res://locals/DeathInfo.en.translation", "
2d_physics/layer_8="Wall"
2d_physics/layer_9="Furniture"
2d_physics/layer_10="WeaponDamageArea"
+2d_physics/layer_11="Barrier"
[physics]
diff --git a/scripts/Config.cs b/scripts/Config.cs
index d808c10..8236050 100644
--- a/scripts/Config.cs
+++ b/scripts/Config.cs
@@ -583,6 +583,7 @@ public static class Config
/// 武器伤害区域
///
public const int WeaponDamageArea = 10;
+ public const int Barrier = 11;
}
///
diff --git a/scripts/character/CharacterTemplate.cs b/scripts/character/CharacterTemplate.cs
index fab0371..fd163ad 100644
--- a/scripts/character/CharacterTemplate.cs
+++ b/scripts/character/CharacterTemplate.cs
@@ -318,6 +318,7 @@ public partial class CharacterTemplate : CharacterBody2D
//角色不能穿过墙壁和地板
SetCollisionMaskValue(Config.LayerNumber.Wall, true);
SetCollisionMaskValue(Config.LayerNumber.Floor, true);
+ SetCollisionMaskValue(Config.LayerNumber.Barrier, true);
InputPickable = true;
}
diff --git a/scripts/furniture/Barrier.cs b/scripts/furniture/Barrier.cs
new file mode 100644
index 0000000..5264486
--- /dev/null
+++ b/scripts/furniture/Barrier.cs
@@ -0,0 +1,18 @@
+namespace ColdMint.scripts.furniture;
+
+///
+/// Barrier
+/// 屏障型家具
+///
+public partial class Barrier : Furniture
+{
+ public override void _Ready()
+ {
+ base._Ready();
+ CanSleep = false;
+ SetCollisionLayerValue(Config.LayerNumber.Barrier, true);
+ SetCollisionLayerValue(Config.LayerNumber.Furniture, false);
+ SetCollisionMaskValue(Config.LayerNumber.Furniture, true);
+ SetCollisionMaskValue(Config.LayerNumber.Barrier, true);
+ }
+}
\ No newline at end of file
diff --git a/scripts/furniture/Furniture.cs b/scripts/furniture/Furniture.cs
index 3155a2c..8fc7f96 100644
--- a/scripts/furniture/Furniture.cs
+++ b/scripts/furniture/Furniture.cs
@@ -31,6 +31,7 @@ public partial class Furniture : RigidBody2D
}
_durability = _initialDurability;
+ SetCollisionLayerValue(Config.LayerNumber.Furniture, true);
SetCollisionMaskValue(Config.LayerNumber.Wall, true);
SetCollisionMaskValue(Config.LayerNumber.Platform, true);
SetCollisionMaskValue(Config.LayerNumber.Floor, true);
@@ -60,6 +61,11 @@ public partial class Furniture : RigidBody2D
///
public bool Damage(DamageTemplate damageTemplate)
{
- return false;
+ _durability -= damageTemplate.Damage;
+ if (_durability <= 0)
+ {
+ QueueFree();
+ }
+ return true;
}
}
\ No newline at end of file
diff --git a/scripts/projectile/Projectile.cs b/scripts/projectile/Projectile.cs
index e9cfb18..5fac312 100644
--- a/scripts/projectile/Projectile.cs
+++ b/scripts/projectile/Projectile.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using ColdMint.scripts.camp;
using ColdMint.scripts.character;
using ColdMint.scripts.damage;
+using ColdMint.scripts.furniture;
using ColdMint.scripts.pickable;
using ColdMint.scripts.projectile.decorator;
using ColdMint.scripts.utils;
@@ -117,6 +118,7 @@ public partial class Projectile : CharacterBody2D
SetCollisionMaskValue(Config.LayerNumber.Player, true);
SetCollisionMaskValue(Config.LayerNumber.Mob, true);
SetCollisionMaskValue(Config.LayerNumber.PickAbleItem, true);
+ SetCollisionMaskValue(Config.LayerNumber.Barrier, true);
//Platform collision layer is not allowed to collide
//平台碰撞层不可碰撞
SetCollisionMaskValue(Config.LayerNumber.Platform, false);
@@ -191,6 +193,11 @@ public partial class Projectile : CharacterBody2D
return true;
}
+ if (target is Furniture)
+ {
+ return true;
+ }
+
if (target is PickAbleTemplate pickAbleTemplate)
{
//The picked-up item cannot resist the bullet.
@@ -258,6 +265,18 @@ public partial class Projectile : CharacterBody2D
pickAbleTemplate.ApplyImpulse(new Vector2(normalized.X * _repelStrength * Config.CellSize,
normalized.Y * _repelStrength * Config.CellSize));
}
+ }else if (target is Furniture furniture)
+ {
+ var damage = new Damage
+ {
+ Attacker = owner,
+ MaxDamage = _maxDamage,
+ MinDamage = _minDamage
+ };
+ damage.CreateDamage();
+ damage.MoveLeft = Velocity.X < 0;
+ damage.Type = _damageType;
+ furniture.Damage(damage);
}
}
diff --git a/scripts/spell/NodeSpawnOnKillCharacterSpell.cs b/scripts/spell/NodeSpawnOnKillCharacterSpell.cs
index 089fdf2..91ffd0f 100644
--- a/scripts/spell/NodeSpawnOnKillCharacterSpell.cs
+++ b/scripts/spell/NodeSpawnOnKillCharacterSpell.cs
@@ -1,4 +1,3 @@
-using ColdMint.scripts.debug;
using ColdMint.scripts.projectile;
using ColdMint.scripts.projectile.decorator;
using Godot;
@@ -31,10 +30,8 @@ public partial class NodeSpawnOnKillCharacterSpell : SpellPickAble
{
if (_nodeSpawnOnKillCharacterDecorator == null)
{
- LogCat.Log("添加失败");
return;
}
- LogCat.Log("添加成功");
projectile.AddProjectileDecorator(_nodeSpawnOnKillCharacterDecorator);
}
}
\ No newline at end of file
diff --git a/sprites/furnitures/wooden_box.png b/sprites/furnitures/wooden_box.png
new file mode 100644
index 0000000..ef759dd
Binary files /dev/null and b/sprites/furnitures/wooden_box.png differ
diff --git a/sprites/furnitures/wooden_box.png.import b/sprites/furnitures/wooden_box.png.import
new file mode 100644
index 0000000..7649746
--- /dev/null
+++ b/sprites/furnitures/wooden_box.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cvlm5tmv43i8t"
+path="res://.godot/imported/wooden_box.png-e7ba04eee30e6d8bdcb4d83cc293c878.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://sprites/furnitures/wooden_box.png"
+dest_files=["res://.godot/imported/wooden_box.png-e7ba04eee30e6d8bdcb4d83cc293c878.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/sprites/tutorials/spellEditor.png b/sprites/tutorials/spellEditor.png
new file mode 100644
index 0000000..f089baa
Binary files /dev/null and b/sprites/tutorials/spellEditor.png differ
diff --git a/sprites/tutorials/spellEditor.png.import b/sprites/tutorials/spellEditor.png.import
new file mode 100644
index 0000000..c22c8a9
--- /dev/null
+++ b/sprites/tutorials/spellEditor.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cdjmfqp854utu"
+path="res://.godot/imported/spellEditor.png-8983010bf1ca07812126ff7d72e09d7c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://sprites/tutorials/spellEditor.png"
+dest_files=["res://.godot/imported/spellEditor.png-8983010bf1ca07812126ff7d72e09d7c.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/sprites/tutorials/tripleShotSpell.png b/sprites/tutorials/tripleShotSpell.png
new file mode 100644
index 0000000..2b21867
Binary files /dev/null and b/sprites/tutorials/tripleShotSpell.png differ
diff --git a/sprites/tutorials/tripleShotSpell.png.import b/sprites/tutorials/tripleShotSpell.png.import
new file mode 100644
index 0000000..8ad1037
--- /dev/null
+++ b/sprites/tutorials/tripleShotSpell.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://kgodvs3ilxbs"
+path="res://.godot/imported/tripleShotSpell.png-b0de68158b44bf1a08d84f07ae59dec2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://sprites/tutorials/tripleShotSpell.png"
+dest_files=["res://.godot/imported/tripleShotSpell.png-b0de68158b44bf1a08d84f07ae59dec2.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/tileSets/dungeon.tres b/tileSets/dungeon.tres
index d792279..cc6d078 100644
--- a/tileSets/dungeon.tres
+++ b/tileSets/dungeon.tres
@@ -29,14 +29,15 @@ texture_region_size = Vector2i(32, 32)
1:2/0 = 0
1:2/0/physics_layer_2/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:2/0 = 0
-0:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:2/0/physics_layer_2/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
0:1/0 = 0
0:1/0/physics_layer_2/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:3/0 = 0
2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
3:1/0 = 0
+3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
3:0/0 = 0
+3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
2:0/0 = 0
2:0/0/physics_layer_2/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
4:0/0 = 0