small racing game im working on
Track Editor (#1)
bendn 2023-04-21
parent 621b720 · commit d179e22
-rw-r--r--.github/workflows/export.yml4
-rw-r--r--.gitignore1
-rw-r--r--.gitmodules3
-rw-r--r--.vscode/settings.json2
-rw-r--r--assets/blocks/arrow.materialbin0 -> 1060 bytes
-rw-r--r--assets/blocks/arrow.meshbin0 -> 1838 bytes
-rw-r--r--assets/blocks/platform_booster.tscn239
-rw-r--r--assets/blocks/platform_corner.tscn35
-rw-r--r--assets/blocks/platform_depression.tscn35
-rw-r--r--assets/blocks/platform_diagonal.tscn32
-rw-r--r--assets/blocks/platform_poke.tscn33
-rw-r--r--assets/blocks/platform_poke_corner.tscn37
-rw-r--r--assets/blocks/platform_ramp.tscn34
-rw-r--r--assets/blocks/platform_square.tscn35
-rw-r--r--assets/blocks/platform_turn_1x1.tscn35
-rw-r--r--assets/blocks/platform_turn_2x2.tscn36
-rw-r--r--assets/blocks/platform_turn_3x3.tscn38
-rw-r--r--assets/blocks/platform_x.tscn34
-rw-r--r--assets/blocks/ring_checkpoint.tscn41
-rw-r--r--assets/blocks/ring_finish.tscn37
-rw-r--r--assets/blocks/ring_start.tscn58
-rw-r--r--assets/blocks/start_guide.materialbin0 -> 768 bytes
-rw-r--r--assets/blocks/tree.gd17
-rw-r--r--assets/blocks/tree.tscn64
-rw-r--r--assets/blocks/walls/corner_wall.tscn21
-rw-r--r--assets/blocks/walls/diagonal_wall.tscn21
-rw-r--r--assets/blocks/walls/flat_wall.tscn22
-rw-r--r--assets/blocks/walls/large_curved_wall.tscn21
-rw-r--r--assets/blocks/walls/small_curved_wall.tscn21
-rw-r--r--assets/blocks/walls/small_curved_wall_inner.tscn21
-rw-r--r--assets/blocks/walls/tall_corner_diagonal_wall.tscn22
-rw-r--r--assets/blocks/walls/tall_diagonal_wall.tscn22
-rw-r--r--assets/blocks/walls/tall_wall.tscn22
-rw-r--r--assets/blocks/walls/turn_wall.tscn20
-rw-r--r--assets/blocks/walls/turn_wall_inner.tscn21
-rw-r--r--assets/blocks/walls/x_wall.tscn22
-rw-r--r--assets/cars/cruella/cruella.blendbin1187736 -> 1189084 bytes
-rw-r--r--assets/cars/engine.gd22
-rw-r--r--assets/cars/engine.tscn25
-rw-r--r--assets/cars/kenney_sedan/ghost.tscn3
-rw-r--r--assets/cars/kenney_sedan/sedan.tscn32
-rw-r--r--assets/cars/sparks.gd4
-rw-r--r--assets/cars/sparks.tscn39
-rw-r--r--assets/mats/grass.tres2
-rw-r--r--assets/mats/grass_highlight.tres12
-rw-r--r--assets/mats/outline.tres2
-rw-r--r--assets/mats/outline_highlight.tres9
-rw-r--r--assets/mats/platform.materialbin0 -> 1024 bytes
-rw-r--r--assets/mats/platform_highlight.materialbin0 -> 1029 bytes
-rw-r--r--assets/mats/ring_checkpoint_highlight.tres12
-rw-r--r--assets/mats/ring_finish_highlight.tres12
-rw-r--r--assets/mats/ring_start_highlight.tres12
-rw-r--r--assets/mats/road.tres2
-rw-r--r--assets/mats/road_highlight.tres10
-rw-r--r--assets/mats/shader_sky.tres16
-rw-r--r--assets/mats/wall.tres4
-rw-r--r--assets/mats/wall_highlight.tres9
-rw-r--r--assets/meshes/checkpoint.tres4
-rw-r--r--assets/meshes/platforms/corner.meshbin0 -> 731 bytes
-rw-r--r--assets/meshes/platforms/depression.tres33
-rw-r--r--assets/meshes/platforms/diagonal.tres31
-rw-r--r--assets/meshes/platforms/poke.tres33
-rw-r--r--assets/meshes/platforms/poke_corner.tres31
-rw-r--r--assets/meshes/platforms/ramp.tres31
-rw-r--r--assets/meshes/platforms/small_wide_turn.tres33
-rw-r--r--assets/meshes/platforms/turn.tres33
-rw-r--r--assets/meshes/platforms/wide_turn.tres33
-rw-r--r--assets/meshes/platforms/x.meshbin0 -> 912 bytes
-rw-r--r--assets/meshes/ring_finish.tres4
-rw-r--r--assets/meshes/ring_start.tres4
-rw-r--r--assets/meshes/tree_bottom.tres28
-rw-r--r--assets/meshes/tree_top.meshbin0 -> 3249 bytes
-rw-r--r--assets/meshes/walls/corner_wall.tres33
-rw-r--r--assets/meshes/walls/diagonal_wall.tres31
-rw-r--r--assets/meshes/walls/flat_wall.meshbin0 -> 735 bytes
-rw-r--r--assets/meshes/walls/large_curved_wall.tres33
-rw-r--r--assets/meshes/walls/small_curved_wall.tres33
-rw-r--r--assets/meshes/walls/small_curved_wall_inner.tres33
-rw-r--r--assets/meshes/walls/tall_corner_diagonal_wall.tres31
-rw-r--r--assets/meshes/walls/tall_diagonal_wall.tres31
-rw-r--r--assets/meshes/walls/tall_wall.tres31
-rw-r--r--assets/meshes/walls/turn_wall.tres35
-rw-r--r--assets/meshes/walls/turn_wall_inner.tres33
-rw-r--r--assets/meshes/walls/x_wall.tres33
-rw-r--r--assets/sounds/plonk.oggbin0 -> 7420 bytes
-rw-r--r--assets/sounds/plonk.ogg.import19
-rw-r--r--assets/textures/wall.pngbin87 -> 96 bytes
-rw-r--r--classes/block.gd87
-rw-r--r--classes/booster.gd7
-rw-r--r--classes/car.gd30
-rw-r--r--classes/checkpoint.gd21
-rw-r--r--classes/decoration.gd6
-rw-r--r--classes/finish.gd21
-rw-r--r--classes/ghost.gd4
-rw-r--r--classes/platform.gd104
-rw-r--r--classes/resources/block_map.gd24
-rw-r--r--classes/resources/dir.gd5
-rw-r--r--classes/resources/file_item.gd4
-rw-r--r--classes/resources/ghost_data.gd4
-rw-r--r--classes/resources/highlight_mat_map.gd14
-rw-r--r--classes/resources/link.gd42
-rw-r--r--classes/resources/thumbnail.gd56
-rw-r--r--classes/resources/track.gd106
-rw-r--r--classes/resources/track_obj.gd79
-rw-r--r--classes/start.gd8
-rw-r--r--classes/track.gd60
-rw-r--r--classes/wall.gd4
-rw-r--r--default_env.tres3
-rw-r--r--engine.gdextension5
m---------enginesound0
-rw-r--r--export_presets.cfg6
-rw-r--r--gizmo_test.tscn33
-rw-r--r--globals.gd11
-rw-r--r--godot.lock11
-rw-r--r--godot.package3
-rw-r--r--init_classes.py2
-rw-r--r--project.godot47
-rw-r--r--race.gd22
-rw-r--r--scenes/floor.gd2
-rw-r--r--scenes/floor.tscn17
-rw-r--r--scenes/ghost_watcher.gd2
-rw-r--r--scenes/race_high.tscn2
-rw-r--r--scenes/race_highlevel.gd3
-rw-r--r--scenes/ring_checkpoint.gd5
-rw-r--r--scenes/ring_checkpoint.tscn39
-rw-r--r--scenes/ring_collision.shapebin0 -> 793 bytes
-rw-r--r--scenes/ring_finish.gd5
-rw-r--r--scenes/ring_finish.tscn36
-rw-r--r--scenes/ring_start.gd5
-rw-r--r--scenes/ring_start.tscn23
-rw-r--r--scenes/sun.tscn10
-rw-r--r--scenes/track-base.gd131
-rw-r--r--scenes/track.tscn84
-rw-r--r--start.tscn87
-rw-r--r--tracks.cfg194
-rw-r--r--tracks/multilap_test.tres37
-rw-r--r--tracks/multilap_test_curve.tres9
-rw-r--r--tracks/test.tres36
-rw-r--r--tracks/test_curve.tres9
-rw-r--r--tracks/the fallen tramps.tres36
-rw-r--r--tracks/the fallen tramps_curve.tres8
-rw-r--r--transform_tester.tscn15
-rw-r--r--ui/assets/arrow.pngbin0 -> 513 bytes
-rw-r--r--ui/assets/arrow.png.import34
-rw-r--r--ui/assets/arrow_collapsed.pngbin0 -> 537 bytes
-rw-r--r--ui/assets/arrow_collapsed.png.import34
-rw-r--r--ui/assets/block.pngbin0 -> 799 bytes
-rw-r--r--ui/assets/block.png.import34
-rw-r--r--ui/assets/brush_brush.pngbin0 -> 357 bytes
-rw-r--r--ui/assets/brush_brush.png.import34
-rw-r--r--ui/assets/brush_cursor.pngbin0 -> 2362 bytes
-rw-r--r--ui/assets/brush_cursor.png.import34
-rw-r--r--ui/assets/brush_handle.pngbin0 -> 576 bytes
-rw-r--r--ui/assets/brush_handle.png.import34
-rw-r--r--ui/assets/brush_outline.pngbin0 -> 1346 bytes
-rw-r--r--ui/assets/brush_outline.png.import34
-rw-r--r--ui/assets/button_focus.styleboxbin452 -> 544 bytes
-rw-r--r--ui/assets/checkbox.pngbin0 -> 559 bytes
-rw-r--r--ui/assets/checkbox.png.import34
-rw-r--r--ui/assets/checkbox_disabled.pngbin0 -> 359 bytes
-rw-r--r--ui/assets/checkbox_disabled.png.import34
-rw-r--r--ui/assets/checkedbox.pngbin0 -> 1014 bytes
-rw-r--r--ui/assets/checkedbox.png.import34
-rw-r--r--ui/assets/clip.pngbin0 -> 1197 bytes
-rw-r--r--ui/assets/clip.png.import34
-rw-r--r--ui/assets/folder.pngbin0 -> 1018 bytes
-rw-r--r--ui/assets/folder.png.import34
-rw-r--r--ui/assets/material.pngbin0 -> 3502 bytes
-rw-r--r--ui/assets/material.png.import34
-rw-r--r--ui/boldsans.tres6
-rw-r--r--ui/editor/back_button.gd29
-rw-r--r--ui/editor/bar_button.tres15
-rw-r--r--ui/editor/block_dragdrop_preview.gd78
-rw-r--r--ui/editor/block_dragdrop_preview.tscn49
-rw-r--r--ui/editor/brush.gd39
-rw-r--r--ui/editor/cam.gd48
-rw-r--r--ui/editor/cameras/right_slant_cam.tscn4
-rw-r--r--ui/editor/cameras/side_far_cam.tscn4
-rw-r--r--ui/editor/cameras/side_slant_cam.tscn4
-rw-r--r--ui/editor/cameras/tall_right_slant_cam.tscn4
-rw-r--r--ui/editor/cameras/tall_side_slant_cam.tscn4
-rw-r--r--ui/editor/cameras/topdown_cam.tscn4
-rw-r--r--ui/editor/delete.gd17
-rw-r--r--ui/editor/duplicate.gd23
-rw-r--r--ui/editor/editor_fs.tres218
-rw-r--r--ui/editor/export.gd33
-rw-r--r--ui/editor/group.tres3
-rw-r--r--ui/editor/hatch.gd54
-rw-r--r--ui/editor/import.gd16
-rw-r--r--ui/editor/items.gd112
-rw-r--r--ui/editor/mousecast.gd65
-rw-r--r--ui/editor/outline.gdshader21
-rw-r--r--ui/editor/outline.materialbin0 -> 267 bytes
-rw-r--r--ui/editor/port.gd108
-rw-r--r--ui/editor/propertys.gd4
-rw-r--r--ui/editor/propertys.tscn53
-rw-r--r--ui/editor/redo.gd13
-rw-r--r--ui/editor/save.gd19
-rw-r--r--ui/editor/selection.gdshader21
-rw-r--r--ui/editor/track_editor.gd122
-rw-r--r--ui/editor/track_editor.gdshader32
-rw-r--r--ui/editor/track_editor.tscn557
-rw-r--r--ui/editor/track_select.gd39
-rw-r--r--ui/editor/tree.gd34
-rw-r--r--ui/editor/undo.gd13
-rw-r--r--ui/editor/wall_tool.gd55
-rw-r--r--ui/editor/wall_tool.tscn66
-rw-r--r--ui/finish.tscn4
-rw-r--r--ui/hud.gd2
-rw-r--r--ui/hud.tscn43
-rw-r--r--ui/intro_cam.gd14
-rw-r--r--ui/laps.gd8
-rw-r--r--ui/map.gd71
-rw-r--r--ui/multi_button.gd31
-rw-r--r--ui/panel_dark.styleboxbin0 -> 437 bytes
-rw-r--r--ui/panel_light.styleboxbin0 -> 462 bytes
-rw-r--r--ui/theme.tres173
-rw-r--r--ui/timer.gd6
-rw-r--r--ui/track_button.gd69
-rw-r--r--ui/track_button.tscn84
-rw-r--r--ui/track_select.gd65
-rw-r--r--ui/trackbutton.gd41
-rw-r--r--ui/tracks.gd50
223 files changed, 5873 insertions, 847 deletions
diff --git a/.github/workflows/export.yml b/.github/workflows/export.yml
index 44c324d..c7bdb9c 100644
--- a/.github/workflows/export.yml
+++ b/.github/workflows/export.yml
@@ -10,13 +10,11 @@ on:
- "**.ttf"
- ".github/workflows/export.yml"
- "export_presets.cfg"
- branches:
- - main
jobs:
export:
uses: bend-n/godot-actions/.github/workflows/callable-export.yml@main
with:
export-name: tracer
- image: ghcr.io/bend-n/godot:4.0
+ image: ghcr.io/bend-n/godot:4.0.2
platforms: "windows linux mac"
diff --git a/.gitignore b/.gitignore
index d2e3b0d..d6ba60f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ movie.*
addons/
*.x86_64
godot.lock
+_svg_source*
diff --git a/.gitmodules b/.gitmodules
index 4fa30ba..e69de29 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +0,0 @@
-[submodule "enginesound"]
- path = enginesound
- url = https://github.com/bend-n/enginesound
diff --git a/.vscode/settings.json b/.vscode/settings.json
index c9596d0..16db01e 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,4 +1,4 @@
{
"godot_tools.gdscript_lsp_server_port": 6005,
"python.formatting.provider": "black"
-}
+} \ No newline at end of file
diff --git a/assets/blocks/arrow.material b/assets/blocks/arrow.material
new file mode 100644
index 0000000..ceee95e
--- /dev/null
+++ b/assets/blocks/arrow.material
Binary files differ
diff --git a/assets/blocks/arrow.mesh b/assets/blocks/arrow.mesh
new file mode 100644
index 0000000..0ad88ed
--- /dev/null
+++ b/assets/blocks/arrow.mesh
Binary files differ
diff --git a/assets/blocks/platform_booster.tscn b/assets/blocks/platform_booster.tscn
new file mode 100644
index 0000000..0bbbb88
--- /dev/null
+++ b/assets/blocks/platform_booster.tscn
@@ -0,0 +1,239 @@
+[gd_scene load_steps=14 format=3 uid="uid://ct733wlw6osxl"]
+
+[ext_resource type="Script" path="res://classes/booster.gd" id="1_xsyb5"]
+[ext_resource type="Material" uid="uid://cwyjtikumcq3k" path="res://assets/mats/platform.material" id="2_7slgu"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="2_b2gjs"]
+[ext_resource type="Material" uid="uid://cpqd2somc06dx" path="res://assets/blocks/arrow.material" id="3_0ymhr"]
+[ext_resource type="ArrayMesh" uid="uid://dpryebqcookr2" path="res://assets/blocks/arrow.mesh" id="3_hvb8d"]
+[ext_resource type="PackedScene" uid="uid://urgqw6yoy4f5" path="res://ui/editor/cameras/topdown_cam.tscn" id="6_ajq8r"]
+
+[sub_resource type="BoxMesh" id="BoxMesh_yy48c"]
+size = Vector3(10, 1, 10)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_0mmg7"]
+size = Vector3(10, 1, 10)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_t325e"]
+transparency = 1
+albedo_color = Color(0.929412, 0.796078, 0.196078, 1)
+metallic = 0.1
+metallic_specular = 1.0
+roughness = 0.0
+disable_receive_shadows = true
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_djys4"]
+transparency = 1
+albedo_color = Color(0.93, 0.795305, 0.1953, 1)
+metallic = 0.1
+metallic_specular = 1.0
+roughness = 0.0
+disable_receive_shadows = true
+
+[sub_resource type="Animation" id="Animation_h17yr"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("arrow_holder/arrow1:position")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(1.58947, 1.1, 0)]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("arrow_holder/arrow2:position")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(4.24211, 1.1, 0)]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("arrow_holder/arrow3:position")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(-1.06316, 1.1, 0)]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("arrow_holder/arrow1:surface_material_override/0:albedo_color")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(0.929412, 0.796078, 0.196078, 1)]
+}
+tracks/4/type = "value"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("arrow_holder/arrow2:surface_material_override/0:albedo_color")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(0.929412, 0.796078, 0.196078, 1)]
+}
+tracks/5/type = "value"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("arrow_holder/arrow3:surface_material_override/0:albedo_color")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(0.93, 0.795305, 0.1953, 1)]
+}
+
+[sub_resource type="Animation" id="Animation_26wkv"]
+resource_name = "move"
+length = 2.0
+loop_mode = 1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("arrow_holder/arrow1:position")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0.1, 0.2),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector3(-2.2, 1.1, 0), Vector3(5, 1.1, 0)]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("arrow_holder/arrow2:position")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0.8, 0.9),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector3(-2.2, 1.1, 0), Vector3(5, 1.1, 0)]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("arrow_holder/arrow2:surface_material_override/0:albedo_color")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0.7, 0.8, 0.9, 1),
+"transitions": PackedFloat32Array(2, 0.5, 2, 0.5),
+"update": 0,
+"values": [Color(0.929412, 0.796078, 0.196078, 1), Color(0.929412, 0.796078, 0.196078, 0), Color(0.929412, 0.796078, 0.196078, 0), Color(0.929412, 0.796078, 0.196078, 1)]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("arrow_holder/arrow3:position")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(1.4, 1.5),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector3(-2.2, 1.1, 0), Vector3(5, 1.1, 0)]
+}
+tracks/4/type = "value"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("arrow_holder/arrow3:surface_material_override/0:albedo_color")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"times": PackedFloat32Array(1.3, 1.4, 1.5, 1.6),
+"transitions": PackedFloat32Array(2, 0.5, 2, 0.5),
+"update": 0,
+"values": [Color(0.93, 0.795305, 0.1953, 1), Color(0.929412, 0.796078, 0.196078, 0), Color(0.929412, 0.796078, 0.196078, 0), Color(0.93, 0.795305, 0.1953, 1)]
+}
+tracks/5/type = "value"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("arrow_holder/arrow1:surface_material_override/0:albedo_color")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"times": PackedFloat32Array(0, 0.1, 0.2, 0.3),
+"transitions": PackedFloat32Array(2, 0.5, 2, 0.5),
+"update": 0,
+"values": [Color(0.929412, 0.796078, 0.196078, 1), Color(0.929412, 0.796078, 0.196078, 0), Color(0.929412, 0.796078, 0.196078, 0), Color(0.929412, 0.796078, 0.196078, 1)]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_vxlkq"]
+_data = {
+"RESET": SubResource("Animation_h17yr"),
+"move": SubResource("Animation_26wkv")
+}
+
+[node name="platform_booster" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_xsyb5")
+mesh = NodePath("mesh")
+west_wall_scene = ExtResource("2_b2gjs")
+west_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+east_wall_scene = ExtResource("2_b2gjs")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = ExtResource("2_b2gjs")
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0)
+south_wall_scene = ExtResource("2_b2gjs")
+south_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+mesh = SubResource("BoxMesh_yy48c")
+surface_material_override/0 = ExtResource("2_7slgu")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+shape = SubResource("BoxShape3D_0mmg7")
+
+[node name="arrow_holder" type="Node3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+
+[node name="arrow1" type="MeshInstance3D" parent="arrow_holder"]
+transform = Transform3D(1.41421, 0, 1.41421, 0, 0.7, 0, -1.41421, 0, 1.41421, 1.58947, 1.1, 0)
+mesh = ExtResource("3_hvb8d")
+skeleton = NodePath("../..")
+surface_material_override/0 = ExtResource("3_0ymhr")
+
+[node name="arrow2" type="MeshInstance3D" parent="arrow_holder"]
+transform = Transform3D(1.41421, 0, 1.41421, 0, 0.7, 0, -1.41421, 0, 1.41421, 4.24211, 1.1, 0)
+mesh = ExtResource("3_hvb8d")
+skeleton = NodePath("../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_t325e")
+
+[node name="arrow3" type="MeshInstance3D" parent="arrow_holder"]
+transform = Transform3D(1.41421, 0, 1.41421, 0, 0.7, 0, -1.41421, 0, 1.41421, -1.06316, 1.1, 0)
+mesh = ExtResource("3_hvb8d")
+skeleton = NodePath("../..")
+surface_material_override/0 = SubResource("StandardMaterial3D_djys4")
+
+[node name="animator" type="AnimationPlayer" parent="."]
+unique_name_in_owner = true
+autoplay = "move"
+libraries = {
+"": SubResource("AnimationLibrary_vxlkq")
+}
+
+[node name="camera" parent="." instance=ExtResource("6_ajq8r")]
diff --git a/assets/blocks/platform_corner.tscn b/assets/blocks/platform_corner.tscn
new file mode 100644
index 0000000..5a2040e
--- /dev/null
+++ b/assets/blocks/platform_corner.tscn
@@ -0,0 +1,35 @@
+[gd_scene load_steps=7 format=3 uid="uid://bpve5rga4f5ts"]
+
+[ext_resource type="ArrayMesh" uid="uid://cvcsk0675a5hy" path="res://assets/meshes/platforms/corner.mesh" id="1_gka10"]
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_h30a2"]
+[ext_resource type="PackedScene" uid="uid://clvtje1uy8v2s" path="res://assets/blocks/walls/corner_wall.tscn" id="2_d1j4r"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="3_ou0ka"]
+[ext_resource type="PackedScene" uid="uid://urgqw6yoy4f5" path="res://ui/editor/cameras/topdown_cam.tscn" id="4_xugmh"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_l5if3"]
+points = PackedVector3Array(-5, 0, -5, -5, 1, -5, 5, 0, 5, -5, 0, 5, -5, 1, 5, 5, 1, 5)
+
+[node name="platform_corner" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_h30a2")
+mesh = NodePath("mesh")
+wall_mode = 7
+west_wall_scene = ExtResource("2_d1j4r")
+west_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+east_wall_scene = ExtResource("3_ou0ka")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = null
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0)
+south_wall_scene = ExtResource("3_ou0ka")
+south_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
+mesh = ExtResource("1_gka10")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
+shape = SubResource("ConvexPolygonShape3D_l5if3")
+
+[node name="camera" parent="." instance=ExtResource("4_xugmh")]
diff --git a/assets/blocks/platform_depression.tscn b/assets/blocks/platform_depression.tscn
new file mode 100644
index 0000000..544c39a
--- /dev/null
+++ b/assets/blocks/platform_depression.tscn
@@ -0,0 +1,35 @@
+[gd_scene load_steps=7 format=3 uid="uid://d0bnqhv1caak3"]
+
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_n2owk"]
+[ext_resource type="PackedScene" uid="uid://dforj6583ykxh" path="res://assets/blocks/walls/diagonal_wall.tscn" id="2_1aqqn"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="3_cfbhp"]
+[ext_resource type="ArrayMesh" uid="uid://d07uut724gmam" path="res://assets/meshes/platforms/depression.tres" id="4_563w5"]
+[ext_resource type="PackedScene" uid="uid://urgqw6yoy4f5" path="res://ui/editor/cameras/topdown_cam.tscn" id="5_4weiu"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_e7apd"]
+data = PackedVector3Array(-5, -0.5, -2.5, -5, 0.5, -5, -5, 0.5, -2.5, -5, -0.5, -2.5, -5, -0.5, -5, -5, 0.5, -5, 2.5, -0.5, -5, 5, 0.5, -5, 2.5, 0.5, -5, 2.5, -0.5, -5, 5, -0.5, -5, 5, 0.5, -5, 5, -2.375, 2.5, 5, -2, 5, 5, -1.375, 2.5, 5, -2.375, 2.5, 5, -3, 5, 5, -2, 5, -2.5, -1.125, 5, -5, 0.5, 5, -2.5, -0.125, 5, -2.5, -1.125, 5, -5, -0.5, 5, -5, 0.5, 5, 2.5, -1.9063, 2.5, 5, -3, 5, 5, -2.375, 2.5, 2.5, -1.9063, 2.5, 2.5, -2.375, 5, 5, -3, 5, -2.5, 0.0313, 2.5, -5, 0.5, 5, -5, 0.5, 2.5, -2.5, 0.0313, 2.5, -2.5, -0.125, 5, -5, 0.5, 5, -2.5, 0.5, -5, -5, 0.5, -2.5, -5, 0.5, -5, -2.5, 0.5, -5, -2.5, 0.3438, -2.5, -5, 0.5, -2.5, -2.5, 0.3438, -2.5, -5, 0.5, 0, -5, 0.5, -2.5, -2.5, 0.3438, -2.5, -2.5, 0.1875, 0, -5, 0.5, 0, -2.5, 0.1875, 0, -5, 0.5, 2.5, -5, 0.5, 0, -2.5, 0.1875, 0, -2.5, 0.0313, 2.5, -5, 0.5, 2.5, 2.5, -0.5, -5, 5, -1.125, -2.5, 5, -0.5, -5, 2.5, -0.5, -5, 2.5, -0.9688, -2.5, 5, -1.125, -2.5, 2.5, -0.9688, -2.5, 5, -1.75, 0, 5, -1.125, -2.5, 2.5, -0.9688, -2.5, 2.5, -1.4375, 0, 5, -1.75, 0, 2.5, -1.4375, 0, 5, -2.375, 2.5, 5, -1.75, 0, 2.5, -1.4375, 0, 2.5, -1.9063, 2.5, 5, -2.375, 2.5, 5, -0.5, -5, 5, -0.125, -2.5, 5, 0.5, -5, 5, -0.5, -5, 5, -1.125, -2.5, 5, -0.125, -2.5, 5, -1.125, -2.5, 5, -0.75, 0, 5, -0.125, -2.5, 5, -1.125, -2.5, 5, -1.75, 0, 5, -0.75, 0, 5, -1.75, 0, 5, -1.375, 2.5, 5, -0.75, 0, 5, -1.75, 0, 5, -2.375, 2.5, 5, -1.375, 2.5, -5, -0.5, 5, -5, 0.5, 2.5, -5, 0.5, 5, -5, -0.5, 5, -5, -0.5, 2.5, -5, 0.5, 2.5, -5, -0.5, 2.5, -5, 0.5, 0, -5, 0.5, 2.5, -5, -0.5, 2.5, -5, -0.5, 0, -5, 0.5, 0, -5, -0.5, 0, -5, 0.5, -2.5, -5, 0.5, 0, -5, -0.5, 0, -5, -0.5, -2.5, -5, 0.5, -2.5, -5, -0.5, 0, -2.5, -0.9688, 2.5, -2.5, -0.8125, 0, -5, -0.5, 0, -5, -0.5, 2.5, -2.5, -0.9688, 2.5, -2.5, -0.8125, 0, 0, -1.4375, 2.5, 0, -1.125, 0, -2.5, -0.8125, 0, -2.5, -0.9688, 2.5, 0, -1.4375, 2.5, 0, -1.125, 0, 2.5, -1.9063, 2.5, 2.5, -1.4375, 0, 0, -1.125, 0, 0, -1.4375, 2.5, 2.5, -1.9063, 2.5, -5, -0.5, -2.5, -2.5, -0.8125, 0, -2.5, -0.6563, -2.5, -5, -0.5, -2.5, -5, -0.5, 0, -2.5, -0.8125, 0, -2.5, -0.6563, -2.5, 0, -1.125, 0, 0, -0.8125, -2.5, -2.5, -0.6563, -2.5, -2.5, -0.8125, 0, 0, -1.125, 0, 0, -0.8125, -2.5, 2.5, -1.4375, 0, 2.5, -0.9688, -2.5, 0, -0.8125, -2.5, 0, -1.125, 0, 2.5, -1.4375, 0, -5, -0.5, -5, -2.5, -0.6563, -2.5, -2.5, -0.5, -5, -5, -0.5, -5, -5, -0.5, -2.5, -2.5, -0.6563, -2.5, -2.5, -0.5, -5, 0, -0.8125, -2.5, 0, -0.5, -5, -2.5, -0.5, -5, -2.5, -0.6563, -2.5, 0, -0.8125, -2.5, 0, -0.5, -5, 2.5, -0.9688, -2.5, 2.5, -0.5, -5, 0, -0.5, -5, 0, -0.8125, -2.5, 2.5, -0.9688, -2.5, 5, -0.75, 0, 2.5, -0.9063, 2.5, 2.5, -0.4375, 0, 5, -0.75, 0, 5, -1.375, 2.5, 2.5, -0.9063, 2.5, 2.5, -0.4375, 0, 0, -0.4375, 2.5, 0, -0.125, 0, 2.5, -0.4375, 0, 2.5, -0.9063, 2.5, 0, -0.4375, 2.5, 0, -0.125, 0, -2.5, 0.0313, 2.5, -2.5, 0.1875, 0, 0, -0.125, 0, 0, -0.4375, 2.5, -2.5, 0.0313, 2.5, 5, -0.125, -2.5, 2.5, -0.4375, 0, 2.5, 0.0313, -2.5, 5, -0.125, -2.5, 5, -0.75, 0, 2.5, -0.4375, 0, 2.5, 0.0313, -2.5, 0, -0.125, 0, 0, 0.1875, -2.5, 2.5, 0.0313, -2.5, 2.5, -0.4375, 0, 0, -0.125, 0, 0, 0.1875, -2.5, -2.5, 0.1875, 0, -2.5, 0.3438, -2.5, 0, 0.1875, -2.5, 0, -0.125, 0, -2.5, 0.1875, 0, 5, 0.5, -5, 2.5, 0.0313, -2.5, 2.5, 0.5, -5, 5, 0.5, -5, 5, -0.125, -2.5, 2.5, 0.0313, -2.5, 2.5, 0.5, -5, 0, 0.1875, -2.5, 0, 0.5, -5, 2.5, 0.5, -5, 2.5, 0.0313, -2.5, 0, 0.1875, -2.5, 0, 0.5, -5, -2.5, 0.3438, -2.5, -2.5, 0.5, -5, 0, 0.5, -5, 0, 0.1875, -2.5, -2.5, 0.3438, -2.5, 5, -1.375, 2.5, 2.5, -1.375, 5, 2.5, -0.9063, 2.5, 5, -1.375, 2.5, 5, -2, 5, 2.5, -1.375, 5, 2.5, -0.9063, 2.5, 0, -0.75, 5, 0, -0.4375, 2.5, 2.5, -0.9063, 2.5, 2.5, -1.375, 5, 0, -0.75, 5, 0, -0.4375, 2.5, -2.5, -0.125, 5, -2.5, 0.0313, 2.5, 0, -0.4375, 2.5, 0, -0.75, 5, -2.5, -0.125, 5, -5, -0.5, 2.5, -2.5, -1.125, 5, -2.5, -0.9688, 2.5, -5, -0.5, 2.5, -5, -0.5, 5, -2.5, -1.125, 5, -2.5, -0.9688, 2.5, 0, -1.75, 5, 0, -1.4375, 2.5, -2.5, -0.9688, 2.5, -2.5, -1.125, 5, 0, -1.75, 5, 0, -1.4375, 2.5, 2.5, -2.375, 5, 2.5, -1.9063, 2.5, 0, -1.4375, 2.5, 0, -1.75, 5, 2.5, -2.375, 5, 5, -3, 5, 2.5, -1.375, 5, 5, -2, 5, 5, -3, 5, 2.5, -2.375, 5, 2.5, -1.375, 5, 2.5, -2.375, 5, 0, -0.75, 5, 2.5, -1.375, 5, 2.5, -2.375, 5, 0, -1.75, 5, 0, -0.75, 5, 0, -1.75, 5, -2.5, -0.125, 5, 0, -0.75, 5, 0, -1.75, 5, -2.5, -1.125, 5, -2.5, -0.125, 5, -5, -0.5, -5, -2.5, 0.5, -5, -5, 0.5, -5, -5, -0.5, -5, -2.5, -0.5, -5, -2.5, 0.5, -5, -2.5, -0.5, -5, 0, 0.5, -5, -2.5, 0.5, -5, -2.5, -0.5, -5, 0, -0.5, -5, 0, 0.5, -5, 0, -0.5, -5, 2.5, 0.5, -5, 0, 0.5, -5, 0, -0.5, -5, 2.5, -0.5, -5, 2.5, 0.5, -5)
+
+[node name="platform_depression" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_n2owk")
+mesh = NodePath("mesh")
+west_wall_scene = ExtResource("2_1aqqn")
+west_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+east_wall_scene = ExtResource("3_cfbhp")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = ExtResource("2_1aqqn")
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+south_wall_scene = ExtResource("3_cfbhp")
+south_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+mesh = ExtResource("4_563w5")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+visible = false
+shape = SubResource("ConcavePolygonShape3D_e7apd")
+
+[node name="camera" parent="." instance=ExtResource("5_4weiu")]
diff --git a/assets/blocks/platform_diagonal.tscn b/assets/blocks/platform_diagonal.tscn
new file mode 100644
index 0000000..2c6b00a
--- /dev/null
+++ b/assets/blocks/platform_diagonal.tscn
@@ -0,0 +1,32 @@
+[gd_scene load_steps=7 format=3 uid="uid://ceo1o8kfhqnxy"]
+
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_kratg"]
+[ext_resource type="PackedScene" uid="uid://dforj6583ykxh" path="res://assets/blocks/walls/diagonal_wall.tscn" id="2_4a34e"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="3_5esq0"]
+[ext_resource type="ArrayMesh" uid="uid://nw0f20urbu50" path="res://assets/meshes/platforms/diagonal.tres" id="4_fgvbp"]
+[ext_resource type="PackedScene" uid="uid://cb46aartkefse" path="res://ui/editor/cameras/side_slant_cam.tscn" id="4_ik4ya"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_ha1t2"]
+points = PackedVector3Array(-5, -0.500049, -5, -5, 0.5, -5, 5, -3, -5, -5, -0.500049, 5, -5, 0.5, 5, 5, -2.00029, -5, 5, -3, 5, 5, -2.00029, 5)
+
+[node name="platform_diagonal" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_kratg")
+mesh = NodePath("mesh")
+west_wall_scene = ExtResource("2_4a34e")
+west_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+east_wall_scene = ExtResource("2_4a34e")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = ExtResource("3_5esq0")
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, -5, 0)
+south_wall_scene = ExtResource("3_5esq0")
+south_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+mesh = ExtResource("4_fgvbp")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+shape = SubResource("ConvexPolygonShape3D_ha1t2")
+
+[node name="camera" parent="." instance=ExtResource("4_ik4ya")]
diff --git a/assets/blocks/platform_poke.tscn b/assets/blocks/platform_poke.tscn
new file mode 100644
index 0000000..74ed952
--- /dev/null
+++ b/assets/blocks/platform_poke.tscn
@@ -0,0 +1,33 @@
+[gd_scene load_steps=7 format=3 uid="uid://cb70byabne8d"]
+
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_8mrda"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="2_bi3dp"]
+[ext_resource type="PackedScene" path="res://assets/blocks/walls/tall_diagonal_wall.tscn" id="2_g8isk"]
+[ext_resource type="ArrayMesh" uid="uid://7h6mvi4idtq1" path="res://assets/meshes/platforms/poke.tres" id="4_emath"]
+[ext_resource type="PackedScene" uid="uid://opcnps6psy07" path="res://ui/editor/cameras/tall_right_slant_cam.tscn" id="5_u4plc"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_hwe68"]
+data = PackedVector3Array(2.5, 0.5, 5, 5, -0.5, 5, 2.5, -0.5, 5, 2.5, 0.5, 5, 5, 0.5, 5, 5, -0.5, 5, -5, 0.5, 2.5, -5, -0.5, 5, -5, -0.5, 2.5, -5, 0.5, 2.5, -5, 0.5, 5, -5, -0.5, 5, -2.5, 0.9688, -2.5, -5, 0.5, -5, -2.5, 1.125, -5, -2.5, 0.9688, -2.5, -5, 0.5, -2.5, -5, 0.5, -5, -2.5, 1.125, -5, -5, -0.5, -5, -2.5, -0.5, -5, -2.5, 1.125, -5, -5, 0.5, -5, -5, -0.5, -5, 5, 2.375, -2.5, 5, -0.5, -5, 5, -0.5, -2.5, 5, 2.375, -2.5, 5, 3, -5, 5, -0.5, -5, -2.5, -0.5, -2.5, -5, -0.5, -5, -5, -0.5, -2.5, -2.5, -0.5, -2.5, -2.5, -0.5, -5, -5, -0.5, -5, -2.5, -0.5, 5, -5, -0.5, 2.5, -5, -0.5, 5, -2.5, -0.5, 5, -2.5, -0.5, 2.5, -5, -0.5, 2.5, -2.5, -0.5, 2.5, -5, -0.5, 0, -5, -0.5, 2.5, -2.5, -0.5, 2.5, -2.5, -0.5, 0, -5, -0.5, 0, -2.5, -0.5, 0, -5, -0.5, -2.5, -5, -0.5, 0, -2.5, -0.5, 0, -2.5, -0.5, -2.5, -5, -0.5, -2.5, 5, 0.5, 5, 5, -0.5, 2.5, 5, -0.5, 5, 5, 0.5, 5, 5, 1.125, 2.5, 5, -0.5, 2.5, 5, 1.125, 2.5, 5, -0.5, 0, 5, -0.5, 2.5, 5, 1.125, 2.5, 5, 1.75, 0, 5, -0.5, 0, 5, 1.75, 0, 5, -0.5, -2.5, 5, -0.5, 0, 5, 1.75, 0, 5, 2.375, -2.5, 5, -0.5, -2.5, -2.5, 0.5, 5, -5, 0.5, 2.5, -2.5, 0.6563, 2.5, -2.5, 0.5, 5, -5, 0.5, 5, -5, 0.5, 2.5, -2.5, 0.6563, 2.5, -5, 0.5, 0, -2.5, 0.8125, 0, -2.5, 0.6563, 2.5, -5, 0.5, 2.5, -5, 0.5, 0, -2.5, 0.8125, 0, -5, 0.5, -2.5, -2.5, 0.9688, -2.5, -2.5, 0.8125, 0, -5, 0.5, 0, -5, 0.5, -2.5, -5, 0.5, -5, -5, -0.5, -2.5, -5, -0.5, -5, -5, 0.5, -5, -5, 0.5, -2.5, -5, -0.5, -2.5, -5, 0.5, -2.5, -5, -0.5, 0, -5, -0.5, -2.5, -5, 0.5, -2.5, -5, 0.5, 0, -5, -0.5, 0, -5, 0.5, 0, -5, -0.5, 2.5, -5, -0.5, 0, -5, 0.5, 0, -5, 0.5, 2.5, -5, -0.5, 2.5, 5, 1.75, 0, 2.5, 1.9063, -2.5, 5, 2.375, -2.5, 5, 1.75, 0, 2.5, 1.4375, 0, 2.5, 1.9063, -2.5, 2.5, 1.4375, 0, 0, 1.4375, -2.5, 2.5, 1.9063, -2.5, 2.5, 1.4375, 0, 0, 1.125, 0, 0, 1.4375, -2.5, 0, 1.125, 0, -2.5, 0.9688, -2.5, 0, 1.4375, -2.5, 0, 1.125, 0, -2.5, 0.8125, 0, -2.5, 0.9688, -2.5, 5, 1.125, 2.5, 2.5, 1.4375, 0, 5, 1.75, 0, 5, 1.125, 2.5, 2.5, 0.9688, 2.5, 2.5, 1.4375, 0, 2.5, 0.9688, 2.5, 0, 1.125, 0, 2.5, 1.4375, 0, 2.5, 0.9688, 2.5, 0, 0.8125, 2.5, 0, 1.125, 0, 0, 0.8125, 2.5, -2.5, 0.8125, 0, 0, 1.125, 0, 0, 0.8125, 2.5, -2.5, 0.6563, 2.5, -2.5, 0.8125, 0, 5, 0.5, 5, 2.5, 0.9688, 2.5, 5, 1.125, 2.5, 5, 0.5, 5, 2.5, 0.5, 5, 2.5, 0.9688, 2.5, 2.5, 0.5, 5, 0, 0.8125, 2.5, 2.5, 0.9688, 2.5, 2.5, 0.5, 5, 0, 0.5, 5, 0, 0.8125, 2.5, 0, 0.5, 5, -2.5, 0.6563, 2.5, 0, 0.8125, 2.5, 0, 0.5, 5, -2.5, 0.5, 5, -2.5, 0.6563, 2.5, 5, -0.5, 0, 2.5, -0.5, -2.5, 2.5, -0.5, 0, 5, -0.5, 0, 5, -0.5, -2.5, 2.5, -0.5, -2.5, 2.5, -0.5, 0, 0, -0.5, -2.5, 0, -0.5, 0, 2.5, -0.5, 0, 2.5, -0.5, -2.5, 0, -0.5, -2.5, 0, -0.5, 0, -2.5, -0.5, -2.5, -2.5, -0.5, 0, 0, -0.5, 0, 0, -0.5, -2.5, -2.5, -0.5, -2.5, 5, -0.5, 2.5, 2.5, -0.5, 0, 2.5, -0.5, 2.5, 5, -0.5, 2.5, 5, -0.5, 0, 2.5, -0.5, 0, 2.5, -0.5, 2.5, 0, -0.5, 0, 0, -0.5, 2.5, 2.5, -0.5, 2.5, 2.5, -0.5, 0, 0, -0.5, 0, 0, -0.5, 2.5, -2.5, -0.5, 0, -2.5, -0.5, 2.5, 0, -0.5, 2.5, 0, -0.5, 0, -2.5, -0.5, 0, 5, -0.5, 5, 2.5, -0.5, 2.5, 2.5, -0.5, 5, 5, -0.5, 5, 5, -0.5, 2.5, 2.5, -0.5, 2.5, 2.5, -0.5, 5, 0, -0.5, 2.5, 0, -0.5, 5, 2.5, -0.5, 5, 2.5, -0.5, 2.5, 0, -0.5, 2.5, 0, -0.5, 5, -2.5, -0.5, 2.5, -2.5, -0.5, 5, 0, -0.5, 5, 0, -0.5, 2.5, -2.5, -0.5, 2.5, 5, -0.5, -2.5, 2.5, -0.5, -5, 2.5, -0.5, -2.5, 5, -0.5, -2.5, 5, -0.5, -5, 2.5, -0.5, -5, 2.5, -0.5, -2.5, 0, -0.5, -5, 0, -0.5, -2.5, 2.5, -0.5, -2.5, 2.5, -0.5, -5, 0, -0.5, -5, 0, -0.5, -2.5, -2.5, -0.5, -5, -2.5, -0.5, -2.5, 0, -0.5, -2.5, 0, -0.5, -5, -2.5, -0.5, -5, 5, 3, -5, 2.5, -0.5, -5, 5, -0.5, -5, 5, 3, -5, 2.5, 2.375, -5, 2.5, -0.5, -5, 2.5, 2.375, -5, 0, -0.5, -5, 2.5, -0.5, -5, 2.5, 2.375, -5, 0, 1.75, -5, 0, -0.5, -5, 0, 1.75, -5, -2.5, -0.5, -5, 0, -0.5, -5, 0, 1.75, -5, -2.5, 1.125, -5, -2.5, -0.5, -5, 5, 2.375, -2.5, 2.5, 2.375, -5, 5, 3, -5, 5, 2.375, -2.5, 2.5, 1.9063, -2.5, 2.5, 2.375, -5, 2.5, 1.9063, -2.5, 0, 1.75, -5, 2.5, 2.375, -5, 2.5, 1.9063, -2.5, 0, 1.4375, -2.5, 0, 1.75, -5, 0, 1.4375, -2.5, -2.5, 1.125, -5, 0, 1.75, -5, 0, 1.4375, -2.5, -2.5, 0.9688, -2.5, -2.5, 1.125, -5, -5, 0.5, 5, -2.5, -0.5, 5, -5, -0.5, 5, -5, 0.5, 5, -2.5, 0.5, 5, -2.5, -0.5, 5, -2.5, 0.5, 5, 0, -0.5, 5, -2.5, -0.5, 5, -2.5, 0.5, 5, 0, 0.5, 5, 0, -0.5, 5, 0, 0.5, 5, 2.5, -0.5, 5, 0, -0.5, 5, 0, 0.5, 5, 2.5, 0.5, 5, 2.5, -0.5, 5)
+
+[node name="platform_poke" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_8mrda")
+mesh = NodePath("mesh")
+west_wall_scene = ExtResource("2_g8isk")
+west_wall_transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+east_wall_scene = ExtResource("2_bi3dp")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = ExtResource("2_g8isk")
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0)
+south_wall_scene = ExtResource("2_bi3dp")
+south_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+
+[node name="camera" parent="." instance=ExtResource("5_u4plc")]
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+mesh = ExtResource("4_emath")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+visible = false
+shape = SubResource("ConcavePolygonShape3D_hwe68")
diff --git a/assets/blocks/platform_poke_corner.tscn b/assets/blocks/platform_poke_corner.tscn
new file mode 100644
index 0000000..beed993
--- /dev/null
+++ b/assets/blocks/platform_poke_corner.tscn
@@ -0,0 +1,37 @@
+[gd_scene load_steps=8 format=3 uid="uid://bs7iubbwrs78d"]
+
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_awaf1"]
+[ext_resource type="PackedScene" path="res://assets/blocks/walls/tall_diagonal_wall.tscn" id="2_xuhlu"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="3_7c6de"]
+[ext_resource type="PackedScene" uid="uid://cvagg3inem8cy" path="res://assets/blocks/walls/tall_corner_diagonal_wall.tscn" id="3_sxx5x"]
+[ext_resource type="PackedScene" uid="uid://opcnps6psy07" path="res://ui/editor/cameras/tall_right_slant_cam.tscn" id="5_dysll"]
+[ext_resource type="ArrayMesh" uid="uid://buyff2c3guxdj" path="res://assets/meshes/platforms/poke_corner.tres" id="5_jythw"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_5v27g"]
+points = PackedVector3Array(-5, -0.5, -5, -5, 0.499706, -5, 5, -0.5, -5, 5, -0.5, 5, 5, 3, 5, 5, 0.499706, -5)
+
+[node name="platform_poke" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_awaf1")
+mesh = NodePath("mesh")
+wall_mode = 7
+west_wall_scene = ExtResource("2_xuhlu")
+west_wall_transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+east_wall_scene = ExtResource("3_sxx5x")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+north_wall_scene = ExtResource("2_xuhlu")
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0)
+south_wall_scene = ExtResource("3_7c6de")
+south_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+
+[node name="camera" parent="." instance=ExtResource("5_dysll")]
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+mesh = ExtResource("5_jythw")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+visible = false
+shape = SubResource("ConvexPolygonShape3D_5v27g")
diff --git a/assets/blocks/platform_ramp.tscn b/assets/blocks/platform_ramp.tscn
new file mode 100644
index 0000000..54a8e4a
--- /dev/null
+++ b/assets/blocks/platform_ramp.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=8 format=3 uid="uid://ci24eqfa38cy4"]
+
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_3ciq1"]
+[ext_resource type="PackedScene" path="res://assets/blocks/walls/tall_diagonal_wall.tscn" id="2_j1v08"]
+[ext_resource type="PackedScene" uid="uid://8mjs78vkeleb" path="res://assets/blocks/walls/tall_wall.tscn" id="3_18buk"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="3_lx7hu"]
+[ext_resource type="PackedScene" uid="uid://ccfnlmu6xnhxg" path="res://ui/editor/cameras/tall_side_slant_cam.tscn" id="4_v4u3u"]
+[ext_resource type="ArrayMesh" uid="uid://bf6hiaub2ecc7" path="res://assets/meshes/platforms/ramp.tres" id="5_vmhi2"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_im65t"]
+points = PackedVector3Array(-5, -0.5, -5, -5, 0.499706, -5, 5, -0.5, -5, -5, -0.5, 5, -5, 0.499706, 5, 5, 3, -5, 5, -0.5, 5, 5, 3, 5)
+
+[node name="platform_ramp" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_3ciq1")
+mesh = NodePath("mesh")
+west_wall_scene = ExtResource("2_j1v08")
+west_wall_transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+east_wall_scene = ExtResource("2_j1v08")
+east_wall_transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = ExtResource("3_18buk")
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0)
+south_wall_scene = ExtResource("3_lx7hu")
+south_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+mesh = ExtResource("5_vmhi2")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+visible = false
+shape = SubResource("ConvexPolygonShape3D_im65t")
+
+[node name="camera" parent="." instance=ExtResource("4_v4u3u")]
diff --git a/assets/blocks/platform_square.tscn b/assets/blocks/platform_square.tscn
new file mode 100644
index 0000000..1c3223d
--- /dev/null
+++ b/assets/blocks/platform_square.tscn
@@ -0,0 +1,35 @@
+[gd_scene load_steps=7 format=3 uid="uid://cotdon210bw6c"]
+
+[ext_resource type="Material" uid="uid://cwyjtikumcq3k" path="res://assets/mats/platform.material" id="1_ox5eu"]
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_y4r5p"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="2_tm8v4"]
+[ext_resource type="PackedScene" uid="uid://urgqw6yoy4f5" path="res://ui/editor/cameras/topdown_cam.tscn" id="4_hin2j"]
+
+[sub_resource type="BoxMesh" id="BoxMesh_yy48c"]
+material = ExtResource("1_ox5eu")
+size = Vector3(10, 1, 10)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_0mmg7"]
+size = Vector3(10, 1, 10)
+
+[node name="platform_square" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_y4r5p")
+mesh = NodePath("mesh")
+west_wall_scene = ExtResource("2_tm8v4")
+west_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+east_wall_scene = ExtResource("2_tm8v4")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = ExtResource("2_tm8v4")
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0)
+south_wall_scene = ExtResource("2_tm8v4")
+south_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+mesh = SubResource("BoxMesh_yy48c")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+shape = SubResource("BoxShape3D_0mmg7")
+
+[node name="camera" parent="." instance=ExtResource("4_hin2j")]
diff --git a/assets/blocks/platform_turn_1x1.tscn b/assets/blocks/platform_turn_1x1.tscn
new file mode 100644
index 0000000..16786f1
--- /dev/null
+++ b/assets/blocks/platform_turn_1x1.tscn
@@ -0,0 +1,35 @@
+[gd_scene load_steps=7 format=3 uid="uid://dtmmpkwtlvovq"]
+
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_8xamw"]
+[ext_resource type="ArrayMesh" uid="uid://dgxce0yrvqmg5" path="res://assets/meshes/platforms/turn.tres" id="2_6mnla"]
+[ext_resource type="PackedScene" uid="uid://bfe6ps3cjf37j" path="res://assets/blocks/walls/turn_wall.tscn" id="2_pgjox"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="3_w86ma"]
+[ext_resource type="PackedScene" uid="uid://urgqw6yoy4f5" path="res://ui/editor/cameras/topdown_cam.tscn" id="4_rehd8"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_qno1p"]
+points = PackedVector3Array(-5, 0, -5, -5, 1, -5, -4.15818, 0, -5, -5, 0, 5, -5, 1, 5, -4.15818, 1, -5, -2.85532, 0, -4.90701, 5, 0, 5, 5, 1, 5, -2.85532, 1, -4.90701, -1.5789, 0, -4.62999, 5, 0, 4.1572, 5, 1, 4.1572, -1.5789, 1, -4.62999, -0.354346, 0, -4.17287, 4.90603, 0, 2.85435, 4.90603, 1, 2.85435, -0.354346, 1, -4.17287, 0.792874, 0, -3.5464, 4.62901, 0, 1.57792, 4.62901, 1, 1.57792, 0.792874, 1, -3.5464, 1.83829, 0, -2.76331, 4.17189, 0, 0.353367, 4.17189, 1, 0.353367, 1.83829, 1, -2.76331, 2.76233, 0, -1.83927, 3.54542, 0, -0.793853, 3.54542, 1, -0.793853, 2.76233, 1, -1.83927)
+
+[node name="platform_turn" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_8xamw")
+mesh = NodePath("mesh")
+wall_mode = 7
+west_wall_scene = ExtResource("2_pgjox")
+west_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+east_wall_scene = ExtResource("3_w86ma")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = null
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0)
+south_wall_scene = ExtResource("3_w86ma")
+south_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+mesh = ExtResource("2_6mnla")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
+visible = false
+shape = SubResource("ConvexPolygonShape3D_qno1p")
+
+[node name="camera" parent="." instance=ExtResource("4_rehd8")]
diff --git a/assets/blocks/platform_turn_2x2.tscn b/assets/blocks/platform_turn_2x2.tscn
new file mode 100644
index 0000000..3e77b94
--- /dev/null
+++ b/assets/blocks/platform_turn_2x2.tscn
@@ -0,0 +1,36 @@
+[gd_scene load_steps=8 format=3 uid="uid://dqxgxdxibvabe"]
+
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_h6ikq"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="2_2humv"]
+[ext_resource type="ArrayMesh" uid="uid://dhvhlj43vxfla" path="res://assets/meshes/platforms/small_wide_turn.tres" id="3_01o3u"]
+[ext_resource type="PackedScene" uid="uid://bm34lkdsai4fq" path="res://assets/blocks/walls/turn_wall_inner.tscn" id="3_rij0u"]
+[ext_resource type="PackedScene" uid="uid://clxoturhpmobw" path="res://assets/blocks/walls/small_curved_wall_inner.tscn" id="3_wc63e"]
+[ext_resource type="PackedScene" uid="uid://urgqw6yoy4f5" path="res://ui/editor/cameras/topdown_cam.tscn" id="4_os0cu"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_whx0o"]
+data = PackedVector3Array(-9.8618, -0.5, -0.1382, -9.8618, 0.5, -10.1382, -9.8618, 0.5, -0.1382, -9.8618, -0.5, -0.1382, -9.8618, -0.5, -10.1382, -9.8618, 0.5, -10.1382, -7.2513, 0.5, -9.9671, -4.6854, -0.5, -9.4567, -4.6854, 0.5, -9.4567, -7.2513, 0.5, -9.9671, -7.2513, -0.5, -9.9671, -4.6854, -0.5, -9.4567, -9.8618, 0.5, -10.1382, -7.2513, -0.5, -9.9671, -7.2513, 0.5, -9.9671, -9.8618, 0.5, -10.1382, -9.8618, -0.5, -10.1382, -7.2513, -0.5, -9.9671, -9.8618, -0.5, -0.1382, -8.5565, 0.5, -0.0526, -8.5565, -0.5, -0.0526, -9.8618, -0.5, -0.1382, -9.8618, 0.5, -0.1382, -8.5565, 0.5, -0.0526, -7.2736, -0.5, 0.2025, -6.035, 0.5, 0.623, -6.035, -0.5, 0.623, -7.2736, -0.5, 0.2025, -7.2736, 0.5, 0.2025, -6.035, 0.5, 0.623, -8.5565, -0.5, -0.0526, -7.2736, 0.5, 0.2025, -7.2736, -0.5, 0.2025, -8.5565, -0.5, -0.0526, -8.5565, 0.5, -0.0526, -7.2736, 0.5, 0.2025, -4.6854, 0.5, -9.4567, -2.2081, -0.5, -8.6158, -2.2081, 0.5, -8.6158, -4.6854, 0.5, -9.4567, -4.6854, -0.5, -9.4567, -2.2081, -0.5, -8.6158, 0.1382, 0.5, -7.4587, 2.3134, -0.5, -6.0053, 2.3134, 0.5, -6.0053, 0.1382, 0.5, -7.4587, 0.1382, -0.5, -7.4587, 2.3134, -0.5, -6.0053, -2.2081, 0.5, -8.6158, 0.1382, -0.5, -7.4587, 0.1382, 0.5, -7.4587, -2.2081, 0.5, -8.6158, -2.2081, -0.5, -8.6158, 0.1382, -0.5, -7.4587, -6.035, -0.5, 0.623, -4.8618, 0.5, 1.2015, -4.8618, -0.5, 1.2015, -6.035, -0.5, 0.623, -6.035, 0.5, 0.623, -4.8618, 0.5, 1.2015, -4.8618, -0.5, 1.2015, -3.7742, 0.5, 1.9283, -3.7742, -0.5, 1.9283, -4.8618, -0.5, 1.2015, -4.8618, 0.5, 1.2015, -3.7742, 0.5, 1.9283, 2.3134, 0.5, -6.0053, 4.2803, -0.5, -4.2803, 4.2803, 0.5, -4.2803, 2.3134, 0.5, -6.0053, 2.3134, -0.5, -6.0053, 4.2803, -0.5, -4.2803, -3.7742, -0.5, 1.9283, -2.7907, 0.5, 2.7907, -2.7907, -0.5, 2.7907, -3.7742, -0.5, 1.9283, -3.7742, 0.5, 1.9283, -2.7907, 0.5, 2.7907, 6.0053, 0.5, -2.3134, 7.4587, -0.5, -0.1382, 7.4587, 0.5, -0.1382, 6.0053, 0.5, -2.3134, 6.0053, -0.5, -2.3134, 7.4587, -0.5, -0.1382, 4.2803, 0.5, -4.2803, 6.0053, -0.5, -2.3134, 6.0053, 0.5, -2.3134, 4.2803, 0.5, -4.2803, 4.2803, -0.5, -4.2803, 6.0053, -0.5, -2.3134, -2.7907, -0.5, 2.7907, -1.9283, 0.5, 3.7742, -1.9283, -0.5, 3.7742, -2.7907, -0.5, 2.7907, -2.7907, 0.5, 2.7907, -1.9283, 0.5, 3.7742, -1.9283, -0.5, 3.7742, -1.2015, 0.5, 4.8618, -1.2015, -0.5, 4.8618, -1.9283, -0.5, 3.7742, -1.9283, 0.5, 3.7742, -1.2015, 0.5, 4.8618, 7.4587, 0.5, -0.1382, 8.6158, -0.5, 2.2081, 8.6158, 0.5, 2.2081, 7.4587, 0.5, -0.1382, 7.4587, -0.5, -0.1382, 8.6158, -0.5, 2.2081, -1.2015, -0.5, 4.8618, -0.623, 0.5, 6.035, -0.623, -0.5, 6.035, -1.2015, -0.5, 4.8618, -1.2015, 0.5, 4.8618, -0.623, 0.5, 6.035, 9.4567, 0.5, 4.6854, 9.9671, -0.5, 7.2513, 9.9671, 0.5, 7.2513, 9.4567, 0.5, 4.6854, 9.4567, -0.5, 4.6854, 9.9671, -0.5, 7.2513, 8.6158, 0.5, 2.2081, 9.4567, -0.5, 4.6854, 9.4567, 0.5, 4.6854, 8.6158, 0.5, 2.2081, 8.6158, -0.5, 2.2081, 9.4567, -0.5, 4.6854, -0.623, -0.5, 6.035, -0.2025, 0.5, 7.2736, -0.2025, -0.5, 7.2736, -0.623, -0.5, 6.035, -0.623, 0.5, 6.035, -0.2025, 0.5, 7.2736, -0.2025, -0.5, 7.2736, 0.0526, 0.5, 8.5565, 0.0526, -0.5, 8.5565, -0.2025, -0.5, 7.2736, -0.2025, 0.5, 7.2736, 0.0526, 0.5, 8.5565, -9.8618, -0.5, -10.1382, -4.6854, -0.5, -9.4567, -7.2513, -0.5, -9.9671, -4.6854, -0.5, -9.4567, 0.1382, -0.5, -7.4587, -2.2081, -0.5, -8.6158, 0.1382, -0.5, -7.4587, 4.2803, -0.5, -4.2803, 2.3134, -0.5, -6.0053, 4.2803, -0.5, -4.2803, 7.4587, -0.5, -0.1382, 6.0053, -0.5, -2.3134, 7.4587, -0.5, -0.1382, 9.4567, -0.5, 4.6854, 8.6158, -0.5, 2.2081, 9.4567, -0.5, 4.6854, 10.1382, -0.5, 9.8618, 9.9671, -0.5, 7.2513, 10.1382, -0.5, 9.8618, 0.0526, -0.5, 8.5565, 0.1382, -0.5, 9.8618, 10.1382, -0.5, 9.8618, -0.2025, -0.5, 7.2736, 0.0526, -0.5, 8.5565, 7.4587, -0.5, -0.1382, 10.1382, -0.5, 9.8618, 9.4567, -0.5, 4.6854, 0.1382, -0.5, -7.4587, 7.4587, -0.5, -0.1382, 4.2803, -0.5, -4.2803, -9.8618, -0.5, -10.1382, 0.1382, -0.5, -7.4587, -4.6854, -0.5, -9.4567, -8.5565, -0.5, -0.0526, -9.8618, -0.5, -10.1382, -9.8618, -0.5, -0.1382, -7.2736, -0.5, 0.2025, -9.8618, -0.5, -10.1382, -8.5565, -0.5, -0.0526, -9.8618, -0.5, -10.1382, 7.4587, -0.5, -0.1382, 0.1382, -0.5, -7.4587, 7.4587, -0.5, -0.1382, -0.2025, -0.5, 7.2736, 10.1382, -0.5, 9.8618, 7.4587, -0.5, -0.1382, -0.623, -0.5, 6.035, -0.2025, -0.5, 7.2736, -7.2736, -0.5, 0.2025, 7.4587, -0.5, -0.1382, -9.8618, -0.5, -10.1382, -6.035, -0.5, 0.623, 7.4587, -0.5, -0.1382, -7.2736, -0.5, 0.2025, 7.4587, -0.5, -0.1382, -1.2015, -0.5, 4.8618, -0.623, -0.5, 6.035, 7.4587, -0.5, -0.1382, -1.9283, -0.5, 3.7742, -1.2015, -0.5, 4.8618, -4.8618, -0.5, 1.2015, 7.4587, -0.5, -0.1382, -6.035, -0.5, 0.623, -3.7742, -0.5, 1.9283, 7.4587, -0.5, -0.1382, -4.8618, -0.5, 1.2015, 7.4587, -0.5, -0.1382, -2.7907, -0.5, 2.7907, -1.9283, -0.5, 3.7742, 7.4587, -0.5, -0.1382, -3.7742, -0.5, 1.9283, -2.7907, -0.5, 2.7907, 0.1382, -0.5, 9.8618, 10.1382, 0.5, 9.8618, 10.1382, -0.5, 9.8618, 0.1382, -0.5, 9.8618, 0.1382, 0.5, 9.8618, 10.1382, 0.5, 9.8618, 0.0526, 0.5, 8.5565, 10.1382, 0.5, 9.8618, 0.1382, 0.5, 9.8618, 10.1382, 0.5, 9.8618, 9.4567, 0.5, 4.6854, 9.9671, 0.5, 7.2513, 9.4567, 0.5, 4.6854, 7.4587, 0.5, -0.1382, 8.6158, 0.5, 2.2081, 7.4587, 0.5, -0.1382, 4.2803, 0.5, -4.2803, 6.0053, 0.5, -2.3134, 4.2803, 0.5, -4.2803, 0.1382, 0.5, -7.4587, 2.3134, 0.5, -6.0053, 0.1382, 0.5, -7.4587, -4.6854, 0.5, -9.4567, -2.2081, 0.5, -8.6158, -4.6854, 0.5, -9.4567, -9.8618, 0.5, -10.1382, -7.2513, 0.5, -9.9671, -9.8618, 0.5, -10.1382, -8.5565, 0.5, -0.0526, -9.8618, 0.5, -0.1382, -9.8618, 0.5, -10.1382, -7.2736, 0.5, 0.2025, -8.5565, 0.5, -0.0526, 0.1382, 0.5, -7.4587, -9.8618, 0.5, -10.1382, -4.6854, 0.5, -9.4567, 7.4587, 0.5, -0.1382, 0.1382, 0.5, -7.4587, 4.2803, 0.5, -4.2803, 10.1382, 0.5, 9.8618, 7.4587, 0.5, -0.1382, 9.4567, 0.5, 4.6854, -0.2025, 0.5, 7.2736, 10.1382, 0.5, 9.8618, 0.0526, 0.5, 8.5565, -0.623, 0.5, 6.035, 10.1382, 0.5, 9.8618, -0.2025, 0.5, 7.2736, 10.1382, 0.5, 9.8618, 0.1382, 0.5, -7.4587, 7.4587, 0.5, -0.1382, 0.1382, 0.5, -7.4587, -7.2736, 0.5, 0.2025, -9.8618, 0.5, -10.1382, 0.1382, 0.5, -7.4587, -6.035, 0.5, 0.623, -7.2736, 0.5, 0.2025, -0.623, 0.5, 6.035, 0.1382, 0.5, -7.4587, 10.1382, 0.5, 9.8618, -1.2015, 0.5, 4.8618, 0.1382, 0.5, -7.4587, -0.623, 0.5, 6.035, 0.1382, 0.5, -7.4587, -4.8618, 0.5, 1.2015, -6.035, 0.5, 0.623, 0.1382, 0.5, -7.4587, -3.7742, 0.5, 1.9283, -4.8618, 0.5, 1.2015, -1.9283, 0.5, 3.7742, 0.1382, 0.5, -7.4587, -1.2015, 0.5, 4.8618, 0.1382, 0.5, -7.4587, -2.7907, 0.5, 2.7907, -3.7742, 0.5, 1.9283, -2.7907, 0.5, 2.7907, 0.1382, 0.5, -7.4587, -1.9283, 0.5, 3.7742, 9.9671, 0.5, 7.2513, 10.1382, -0.5, 9.8618, 10.1382, 0.5, 9.8618, 9.9671, 0.5, 7.2513, 9.9671, -0.5, 7.2513, 10.1382, -0.5, 9.8618, 0.0526, -0.5, 8.5565, 0.1382, 0.5, 9.8618, 0.1382, -0.5, 9.8618, 0.0526, -0.5, 8.5565, 0.0526, 0.5, 8.5565, 0.1382, 0.5, 9.8618)
+
+[node name="platform_turn_2x2" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_h6ikq")
+mesh = NodePath("mesh")
+west_wall_scene = ExtResource("2_2humv")
+west_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, 1, 0, 0, -10, 0, -10)
+east_wall_scene = ExtResource("2_2humv")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = ExtResource("3_wc63e")
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, -5, 0, -5)
+south_wall_scene = ExtResource("3_rij0u")
+south_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 0, -5)
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.11883, 0, -4.88116)
+mesh = ExtResource("3_01o3u")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.11883, 0, -4.88116)
+shape = SubResource("ConcavePolygonShape3D_whx0o")
+
+[node name="camera" parent="." instance=ExtResource("4_os0cu")]
+transform = Transform3D(-4.37114e-08, 1, 4.37114e-08, 0, -4.37114e-08, 1, 1, 4.37114e-08, 1.91069e-15, -5, 15, -5)
diff --git a/assets/blocks/platform_turn_3x3.tscn b/assets/blocks/platform_turn_3x3.tscn
new file mode 100644
index 0000000..e5d9a78
--- /dev/null
+++ b/assets/blocks/platform_turn_3x3.tscn
@@ -0,0 +1,38 @@
+[gd_scene load_steps=8 format=3 uid="uid://bawi544gebahm"]
+
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_biqg8"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="2_e4e6n"]
+[ext_resource type="PackedScene" path="res://assets/blocks/walls/large_curved_wall.tscn" id="3_l1pfb"]
+[ext_resource type="PackedScene" path="res://assets/blocks/walls/small_curved_wall.tscn" id="4_jmw7o"]
+[ext_resource type="ArrayMesh" uid="uid://1uh80csnupve" path="res://assets/meshes/platforms/wide_turn.tres" id="5_be8h1"]
+[ext_resource type="PackedScene" uid="uid://urgqw6yoy4f5" path="res://ui/editor/cameras/topdown_cam.tscn" id="6_u76a2"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_6xhf1"]
+data = PackedVector3Array(-5, -5, 5, 4.7433, -5, 1.0842, -5.1711, -5, 2.3895, -5, -5, 5, 5, -5, 5, 4.7433, -5, 1.0842, -5.1711, -5, 2.3895, 3.9778, -5, -2.7646, -5.6815, -5, -0.1764, -5.1711, -5, 2.3895, 4.7433, -5, 1.0842, 3.9778, -5, -2.7646, -5.6815, -5, -0.1764, 2.7164, -5, -6.4805, -6.5224, -5, -2.6537, -5.6815, -5, -0.1764, 3.9778, -5, -2.7646, 2.7164, -5, -6.4805, -6.5224, -5, -2.6537, 0.9808, -5, -10, -7.6795, -5, -5, -6.5224, -5, -2.6537, 2.7164, -5, -6.4805, 0.9808, -5, -10, -7.6795, -5, -5, -1.1994, -5, -13.2628, -9.1329, -5, -7.1752, -7.6795, -5, -5, 0.9808, -5, -10, -1.1994, -5, -13.2628, -9.1329, -5, -7.1752, -3.7868, -5, -16.2132, -10.8579, -5, -9.1421, -9.1329, -5, -7.1752, -1.1994, -5, -13.2628, -3.7868, -5, -16.2132, -10.8579, -5, -9.1421, -6.7372, -5, -18.8006, -12.8248, -5, -10.8671, -10.8579, -5, -9.1421, -3.7868, -5, -16.2132, -6.7372, -5, -18.8006, -12.8248, -5, -10.8671, -10, -5, -20.9808, -15, -5, -12.3205, -12.8248, -5, -10.8671, -6.7372, -5, -18.8006, -10, -5, -20.9808, -15, -5, -12.3205, -13.5195, -5, -22.7164, -17.3463, -5, -13.4776, -15, -5, -12.3205, -10, -5, -20.9808, -13.5195, -5, -22.7164, -17.3463, -5, -13.4776, -17.2354, -5, -23.9778, -19.8236, -5, -14.3185, -17.3463, -5, -13.4776, -13.5195, -5, -22.7164, -17.2354, -5, -23.9778, -19.8236, -5, -14.3185, -21.0842, -5, -24.7434, -22.3895, -5, -14.8289, -19.8236, -5, -14.3185, -17.2354, -5, -23.9778, -21.0842, -5, -24.7434, -22.3895, -5, -14.8289, -25, -5, -25, -25, -5, -15, -22.3895, -5, -14.8289, -21.0842, -5, -24.7434, -25, -5, -25, -5, -4, 5, 4.7433, -4, 1.0842, 5, -4, 5, -5, -4, 5, -5.1711, -4, 2.3895, 4.7433, -4, 1.0842, -5.1711, -4, 2.3895, 3.9778, -4, -2.7646, 4.7433, -4, 1.0842, -5.1711, -4, 2.3895, -5.6815, -4, -0.1764, 3.9778, -4, -2.7646, -5.6815, -4, -0.1764, 2.7164, -4, -6.4805, 3.9778, -4, -2.7646, -5.6815, -4, -0.1764, -6.5224, -4, -2.6537, 2.7164, -4, -6.4805, -6.5224, -4, -2.6537, 0.9808, -4, -10, 2.7164, -4, -6.4805, -6.5224, -4, -2.6537, -7.6795, -4, -5, 0.9808, -4, -10, -7.6795, -4, -5, -1.1994, -4, -13.2628, 0.9808, -4, -10, -7.6795, -4, -5, -9.1329, -4, -7.1752, -1.1994, -4, -13.2628, -9.1329, -4, -7.1752, -3.7868, -4, -16.2132, -1.1994, -4, -13.2628, -9.1329, -4, -7.1752, -10.8579, -4, -9.1421, -3.7868, -4, -16.2132, -10.8579, -4, -9.1421, -6.7372, -4, -18.8006, -3.7868, -4, -16.2132, -10.8579, -4, -9.1421, -12.8248, -4, -10.8671, -6.7372, -4, -18.8006, -12.8248, -4, -10.8671, -10, -4, -20.9808, -6.7372, -4, -18.8006, -12.8248, -4, -10.8671, -15, -4, -12.3205, -10, -4, -20.9808, -15, -4, -12.3205, -13.5195, -4, -22.7164, -10, -4, -20.9808, -15, -4, -12.3205, -17.3463, -4, -13.4776, -13.5195, -4, -22.7164, -17.3463, -4, -13.4776, -17.2354, -4, -23.9778, -13.5195, -4, -22.7164, -17.3463, -4, -13.4776, -19.8236, -4, -14.3185, -17.2354, -4, -23.9778, -19.8236, -4, -14.3185, -21.0842, -4, -24.7434, -17.2354, -4, -23.9778, -19.8236, -4, -14.3185, -22.3895, -4, -14.8289, -21.0842, -4, -24.7434, -22.3895, -4, -14.8289, -25, -4, -25, -21.0842, -4, -24.7434, -22.3895, -4, -14.8289, -25, -4, -15, -25, -4, -25, -22.3895, -5, -14.8289, -19.8236, -4, -14.3185, -19.8236, -5, -14.3185, -22.3895, -5, -14.8289, -22.3895, -4, -14.8289, -19.8236, -4, -14.3185, 2.7164, -5, -6.4805, 0.9808, -4, -10, 0.9808, -5, -10, 2.7164, -5, -6.4805, 2.7164, -4, -6.4805, 0.9808, -4, -10, -10, -5, -20.9808, -13.5195, -4, -22.7164, -13.5195, -5, -22.7164, -10, -5, -20.9808, -10, -4, -20.9808, -13.5195, -4, -22.7164, -25, -5, -25, -25, -4, -15, -25, -5, -15, -25, -5, -25, -25, -4, -25, -25, -4, -15, -7.6795, -5, -5, -6.5224, -4, -2.6537, -6.5224, -5, -2.6537, -7.6795, -5, -5, -7.6795, -4, -5, -6.5224, -4, -2.6537, -17.3463, -5, -13.4776, -15, -4, -12.3205, -15, -5, -12.3205, -17.3463, -5, -13.4776, -17.3463, -4, -13.4776, -15, -4, -12.3205, 4.7433, -5, 1.0842, 3.9778, -4, -2.7646, 3.9778, -5, -2.7646, 4.7433, -5, 1.0842, 4.7433, -4, 1.0842, 3.9778, -4, -2.7646, -3.7868, -5, -16.2132, -6.7372, -4, -18.8006, -6.7372, -5, -18.8006, -3.7868, -5, -16.2132, -3.7868, -4, -16.2132, -6.7372, -4, -18.8006, -21.0842, -5, -24.7434, -25, -4, -25, -25, -5, -25, -21.0842, -5, -24.7434, -21.0842, -4, -24.7434, -25, -4, -25, -5.6815, -5, -0.1764, -5.1711, -4, 2.3895, -5.1711, -5, 2.3895, -5.6815, -5, -0.1764, -5.6815, -4, -0.1764, -5.1711, -4, 2.3895, -12.8248, -5, -10.8671, -10.8579, -4, -9.1421, -10.8579, -5, -9.1421, -12.8248, -5, -10.8671, -12.8248, -4, -10.8671, -10.8579, -4, -9.1421, -25, -5, -15, -22.3895, -4, -14.8289, -22.3895, -5, -14.8289, -25, -5, -15, -25, -4, -15, -22.3895, -4, -14.8289, 0.9808, -5, -10, -1.1994, -4, -13.2628, -1.1994, -5, -13.2628, 0.9808, -5, -10, 0.9808, -4, -10, -1.1994, -4, -13.2628, -13.5195, -5, -22.7164, -17.2354, -4, -23.9778, -17.2354, -5, -23.9778, -13.5195, -5, -22.7164, -13.5195, -4, -22.7164, -17.2354, -4, -23.9778, -5, -5, 5, 5, -4, 5, 5, -5, 5, -5, -5, 5, -5, -4, 5, 5, -4, 5, -9.1329, -5, -7.1752, -7.6795, -4, -5, -7.6795, -5, -5, -9.1329, -5, -7.1752, -9.1329, -4, -7.1752, -7.6795, -4, -5, -19.8236, -5, -14.3185, -17.3463, -4, -13.4776, -17.3463, -5, -13.4776, -19.8236, -5, -14.3185, -19.8236, -4, -14.3185, -17.3463, -4, -13.4776, 3.9778, -5, -2.7646, 2.7164, -4, -6.4805, 2.7164, -5, -6.4805, 3.9778, -5, -2.7646, 3.9778, -4, -2.7646, 2.7164, -4, -6.4805, -6.7372, -5, -18.8006, -10, -4, -20.9808, -10, -5, -20.9808, -6.7372, -5, -18.8006, -6.7372, -4, -18.8006, -10, -4, -20.9808, -6.5224, -5, -2.6537, -5.6815, -4, -0.1764, -5.6815, -5, -0.1764, -6.5224, -5, -2.6537, -6.5224, -4, -2.6537, -5.6815, -4, -0.1764, -15, -5, -12.3205, -12.8248, -4, -10.8671, -12.8248, -5, -10.8671, -15, -5, -12.3205, -15, -4, -12.3205, -12.8248, -4, -10.8671, 5, -5, 5, 4.7433, -4, 1.0842, 4.7433, -5, 1.0842, 5, -5, 5, 5, -4, 5, 4.7433, -4, 1.0842, -1.1994, -5, -13.2628, -3.7868, -4, -16.2132, -3.7868, -5, -16.2132, -1.1994, -5, -13.2628, -1.1994, -4, -13.2628, -3.7868, -4, -16.2132, -17.2354, -5, -23.9778, -21.0842, -4, -24.7434, -21.0842, -5, -24.7434, -17.2354, -5, -23.9778, -17.2354, -4, -23.9778, -21.0842, -4, -24.7434, -5.1711, -5, 2.3895, -5, -4, 5, -5, -5, 5, -5.1711, -5, 2.3895, -5.1711, -4, 2.3895, -5, -4, 5, -10.8579, -5, -9.1421, -9.1329, -4, -7.1752, -9.1329, -5, -7.1752, -10.8579, -5, -9.1421, -10.8579, -4, -9.1421, -9.1329, -4, -7.1752)
+
+[node name="platform_square" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.6643, 0, 0)
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_biqg8")
+mesh = NodePath("mesh")
+west_wall_scene = ExtResource("2_e4e6n")
+west_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, 1, 0, 0, -12.3, 0, -20)
+east_wall_scene = ExtResource("2_e4e6n")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = ExtResource("3_l1pfb")
+north_wall_transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, -20)
+south_wall_scene = ExtResource("4_jmw7o")
+south_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0)
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.5, 0)
+mesh = ExtResource("5_be8h1")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.5, 0)
+visible = false
+shape = SubResource("ConcavePolygonShape3D_6xhf1")
+
+[node name="camera" parent="." instance=ExtResource("6_u76a2")]
+transform = Transform3D(-4.37114e-08, 1, 4.37114e-08, 0, -4.37114e-08, 1, 1, 4.37114e-08, 1.91069e-15, -10, 25, -10)
diff --git a/assets/blocks/platform_x.tscn b/assets/blocks/platform_x.tscn
new file mode 100644
index 0000000..132014f
--- /dev/null
+++ b/assets/blocks/platform_x.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=7 format=3 uid="uid://c7xxrp8ml2ku1"]
+
+[ext_resource type="Script" path="res://classes/platform.gd" id="1_1ufbr"]
+[ext_resource type="PackedScene" uid="uid://bxodo0cs3ewce" path="res://assets/blocks/walls/x_wall.tscn" id="2_1l616"]
+[ext_resource type="ArrayMesh" uid="uid://bpde4jrjhpo8r" path="res://assets/meshes/platforms/x.mesh" id="2_sdch3"]
+[ext_resource type="PackedScene" uid="uid://lq13suvwdu6g" path="res://assets/blocks/walls/flat_wall.tscn" id="3_uslfv"]
+[ext_resource type="PackedScene" uid="uid://urgqw6yoy4f5" path="res://ui/editor/cameras/topdown_cam.tscn" id="4_ertxg"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_dco4m"]
+data = PackedVector3Array(-3.5, -0.5, 0, -5, 0.5, -5, -3.5, 0.5, 0, -3.5, -0.5, 0, -5, -0.5, -5, -5, 0.5, -5, -5, -0.5, -5, 5, 0.5, -5, -5, 0.5, -5, -5, -0.5, -5, 5, -0.5, -5, 5, 0.5, -5, 3.5, -0.5, 0, 5, 0.5, 5, 3.5, 0.5, 0, 3.5, -0.5, 0, 5, -0.5, 5, 5, 0.5, 5, 5, -0.5, 5, -5, 0.5, 5, 5, 0.5, 5, 5, -0.5, 5, -5, -0.5, 5, -5, 0.5, 5, -3.5, -0.5, 0, 5, -0.5, 5, 3.5, -0.5, 0, -3.5, -0.5, 0, -5, -0.5, 5, 5, -0.5, 5, 3.5, 0.5, 0, -5, 0.5, 5, -3.5, 0.5, 0, 3.5, 0.5, 0, 5, 0.5, 5, -5, 0.5, 5, 5, 0.5, -5, -3.5, 0.5, 0, -5, 0.5, -5, 5, 0.5, -5, 3.5, 0.5, 0, -3.5, 0.5, 0, -5, -0.5, -5, 3.5, -0.5, 0, 5, -0.5, -5, -5, -0.5, -5, -3.5, -0.5, 0, 3.5, -0.5, 0, 5, -0.5, -5, 3.5, 0.5, 0, 5, 0.5, -5, 5, -0.5, -5, 3.5, -0.5, 0, 3.5, 0.5, 0, -5, -0.5, 5, -3.5, 0.5, 0, -5, 0.5, 5, -5, -0.5, 5, -3.5, -0.5, 0, -3.5, 0.5, 0)
+
+[node name="platform_x" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_1ufbr")
+mesh = NodePath("mesh")
+west_wall_scene = ExtResource("2_1l616")
+west_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
+east_wall_scene = ExtResource("2_1l616")
+east_wall_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0)
+north_wall_scene = ExtResource("3_uslfv")
+north_wall_transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0)
+south_wall_scene = ExtResource("3_uslfv")
+south_wall_transform = Transform3D(0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0)
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+mesh = ExtResource("2_sdch3")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+shape = SubResource("ConcavePolygonShape3D_dco4m")
+
+[node name="camera" parent="." instance=ExtResource("4_ertxg")]
diff --git a/assets/blocks/ring_checkpoint.tscn b/assets/blocks/ring_checkpoint.tscn
new file mode 100644
index 0000000..618fa64
--- /dev/null
+++ b/assets/blocks/ring_checkpoint.tscn
@@ -0,0 +1,41 @@
+[gd_scene load_steps=6 format=3 uid="uid://behu0a0iegwov"]
+
+[ext_resource type="Script" path="res://classes/checkpoint.gd" id="1_rlrel"]
+[ext_resource type="TorusMesh" uid="uid://dlbpusye3e33p" path="res://assets/meshes/checkpoint.tres" id="2_xys6y"]
+[ext_resource type="PackedScene" uid="uid://bb56nmgmi1i74" path="res://ui/editor/cameras/side_far_cam.tscn" id="3_674db"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_c3er2"]
+data = PackedVector3Array(-6, 0, -10.3923, 0, 2.5, -14.5, 0, 0, -12, -6, 0, -10.3923, -7.25, 2.5, -12.5574, 0, 2.5, -14.5, -7.25, 2.5, -12.5574, 0, 0, -17, 0, 2.5, -14.5, -7.25, 2.5, -12.5574, -8.5, 0, -14.7224, 0, 0, -17, -8.5, 0, -14.7224, 0, -2.5, -14.5, 0, 0, -17, -8.5, 0, -14.7224, -7.25, -2.5, -12.5574, 0, -2.5, -14.5, -7.25, -2.5, -12.5574, 0, 0, -12, 0, -2.5, -14.5, -7.25, -2.5, -12.5574, -6, 0, -10.3923, 0, 0, -12, -10.3923, 0, -6, -7.25, 2.5, -12.5574, -6, 0, -10.3923, -10.3923, 0, -6, -12.5574, 2.5, -7.25, -7.25, 2.5, -12.5574, -12.5574, 2.5, -7.25, -8.5, 0, -14.7224, -7.25, 2.5, -12.5574, -12.5574, 2.5, -7.25, -14.7224, 0, -8.5, -8.5, 0, -14.7224, -14.7224, 0, -8.5, -7.25, -2.5, -12.5574, -8.5, 0, -14.7224, -14.7224, 0, -8.5, -12.5574, -2.5, -7.25, -7.25, -2.5, -12.5574, -12.5574, -2.5, -7.25, -6, 0, -10.3923, -7.25, -2.5, -12.5574, -12.5574, -2.5, -7.25, -10.3923, 0, -6, -6, 0, -10.3923, -12, 0, 0, -12.5574, 2.5, -7.25, -10.3923, 0, -6, -12, 0, 0, -14.5, 2.5, 0, -12.5574, 2.5, -7.25, -14.5, 2.5, 0, -14.7224, 0, -8.5, -12.5574, 2.5, -7.25, -14.5, 2.5, 0, -17, 0, 0, -14.7224, 0, -8.5, -17, 0, 0, -12.5574, -2.5, -7.25, -14.7224, 0, -8.5, -17, 0, 0, -14.5, -2.5, 0, -12.5574, -2.5, -7.25, -14.5, -2.5, 0, -10.3923, 0, -6, -12.5574, -2.5, -7.25, -14.5, -2.5, 0, -12, 0, 0, -10.3923, 0, -6, -10.3923, 0, 6, -14.5, 2.5, 0, -12, 0, 0, -10.3923, 0, 6, -12.5574, 2.5, 7.25, -14.5, 2.5, 0, -12.5574, 2.5, 7.25, -17, 0, 0, -14.5, 2.5, 0, -12.5574, 2.5, 7.25, -14.7224, 0, 8.5, -17, 0, 0, -14.7224, 0, 8.5, -14.5, -2.5, 0, -17, 0, 0, -14.7224, 0, 8.5, -12.5574, -2.5, 7.25, -14.5, -2.5, 0, -12.5574, -2.5, 7.25, -12, 0, 0, -14.5, -2.5, 0, -12.5574, -2.5, 7.25, -10.3923, 0, 6, -12, 0, 0, -6, 0, 10.3923, -12.5574, 2.5, 7.25, -10.3923, 0, 6, -6, 0, 10.3923, -7.25, 2.5, 12.5574, -12.5574, 2.5, 7.25, -7.25, 2.5, 12.5574, -14.7224, 0, 8.5, -12.5574, 2.5, 7.25, -7.25, 2.5, 12.5574, -8.5, 0, 14.7224, -14.7224, 0, 8.5, -8.5, 0, 14.7224, -12.5574, -2.5, 7.25, -14.7224, 0, 8.5, -8.5, 0, 14.7224, -7.25, -2.5, 12.5574, -12.5574, -2.5, 7.25, -7.25, -2.5, 12.5574, -10.3923, 0, 6, -12.5574, -2.5, 7.25, -7.25, -2.5, 12.5574, -6, 0, 10.3923, -10.3923, 0, 6, 0, 0, 12, -7.25, 2.5, 12.5574, -6, 0, 10.3923, 0, 0, 12, 0, 2.5, 14.5, -7.25, 2.5, 12.5574, 0, 2.5, 14.5, -8.5, 0, 14.7224, -7.25, 2.5, 12.5574, 0, 2.5, 14.5, 0, 0, 17, -8.5, 0, 14.7224, 0, 0, 17, -7.25, -2.5, 12.5574, -8.5, 0, 14.7224, 0, 0, 17, 0, -2.5, 14.5, -7.25, -2.5, 12.5574, 0, -2.5, 14.5, -6, 0, 10.3923, -7.25, -2.5, 12.5574, 0, -2.5, 14.5, 0, 0, 12, -6, 0, 10.3923, 6, 0, 10.3923, 0, 2.5, 14.5, 0, 0, 12, 6, 0, 10.3923, 7.25, 2.5, 12.5574, 0, 2.5, 14.5, 7.25, 2.5, 12.5574, 0, 0, 17, 0, 2.5, 14.5, 7.25, 2.5, 12.5574, 8.5, 0, 14.7224, 0, 0, 17, 8.5, 0, 14.7224, 0, -2.5, 14.5, 0, 0, 17, 8.5, 0, 14.7224, 7.25, -2.5, 12.5574, 0, -2.5, 14.5, 7.25, -2.5, 12.5574, 0, 0, 12, 0, -2.5, 14.5, 7.25, -2.5, 12.5574, 6, 0, 10.3923, 0, 0, 12, 10.3923, 0, 6, 7.25, 2.5, 12.5574, 6, 0, 10.3923, 10.3923, 0, 6, 12.5574, 2.5, 7.25, 7.25, 2.5, 12.5574, 12.5574, 2.5, 7.25, 8.5, 0, 14.7224, 7.25, 2.5, 12.5574, 12.5574, 2.5, 7.25, 14.7224, 0, 8.5, 8.5, 0, 14.7224, 14.7224, 0, 8.5, 7.25, -2.5, 12.5574, 8.5, 0, 14.7224, 14.7224, 0, 8.5, 12.5574, -2.5, 7.25, 7.25, -2.5, 12.5574, 12.5574, -2.5, 7.25, 6, 0, 10.3923, 7.25, -2.5, 12.5574, 12.5574, -2.5, 7.25, 10.3923, 0, 6, 6, 0, 10.3923, 12, 0, 0, 12.5574, 2.5, 7.25, 10.3923, 0, 6, 12, 0, 0, 14.5, 2.5, 0, 12.5574, 2.5, 7.25, 14.5, 2.5, 0, 14.7224, 0, 8.5, 12.5574, 2.5, 7.25, 14.5, 2.5, 0, 17, 0, 0, 14.7224, 0, 8.5, 17, 0, 0, 12.5574, -2.5, 7.25, 14.7224, 0, 8.5, 17, 0, 0, 14.5, -2.5, 0, 12.5574, -2.5, 7.25, 14.5, -2.5, 0, 10.3923, 0, 6, 12.5574, -2.5, 7.25, 14.5, -2.5, 0, 12, 0, 0, 10.3923, 0, 6, 10.3923, 0, -6, 14.5, 2.5, 0, 12, 0, 0, 10.3923, 0, -6, 12.5574, 2.5, -7.25, 14.5, 2.5, 0, 12.5574, 2.5, -7.25, 17, 0, 0, 14.5, 2.5, 0, 12.5574, 2.5, -7.25, 14.7224, 0, -8.5, 17, 0, 0, 14.7224, 0, -8.5, 14.5, -2.5, 0, 17, 0, 0, 14.7224, 0, -8.5, 12.5574, -2.5, -7.25, 14.5, -2.5, 0, 12.5574, -2.5, -7.25, 12, 0, 0, 14.5, -2.5, 0, 12.5574, -2.5, -7.25, 10.3923, 0, -6, 12, 0, 0, 6, 0, -10.3923, 12.5574, 2.5, -7.25, 10.3923, 0, -6, 6, 0, -10.3923, 7.25, 2.5, -12.5574, 12.5574, 2.5, -7.25, 7.25, 2.5, -12.5574, 14.7224, 0, -8.5, 12.5574, 2.5, -7.25, 7.25, 2.5, -12.5574, 8.5, 0, -14.7224, 14.7224, 0, -8.5, 8.5, 0, -14.7224, 12.5574, -2.5, -7.25, 14.7224, 0, -8.5, 8.5, 0, -14.7224, 7.25, -2.5, -12.5574, 12.5574, -2.5, -7.25, 7.25, -2.5, -12.5574, 10.3923, 0, -6, 12.5574, -2.5, -7.25, 7.25, -2.5, -12.5574, 6, 0, -10.3923, 10.3923, 0, -6, 0, 0, -12, 7.25, 2.5, -12.5574, 6, 0, -10.3923, 0, 0, -12, 0, 2.5, -14.5, 7.25, 2.5, -12.5574, 0, 2.5, -14.5, 8.5, 0, -14.7224, 7.25, 2.5, -12.5574, 0, 2.5, -14.5, 0, 0, -17, 8.5, 0, -14.7224, 0, 0, -17, 7.25, -2.5, -12.5574, 8.5, 0, -14.7224, 0, 0, -17, 0, -2.5, -14.5, 7.25, -2.5, -12.5574, 0, -2.5, -14.5, 6, 0, -10.3923, 7.25, -2.5, -12.5574, 0, -2.5, -14.5, 0, 0, -12, 6, 0, -10.3923)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_k77jm"]
+size = Vector3(23, 23, 3)
+
+[node name="ring_checkpoint" type="StaticBody3D" node_paths=PackedStringArray("player_detector", "mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_rlrel")
+player_detector = NodePath("PlayerDetector")
+mesh = NodePath("mesh")
+
+[node name="shape" type="CollisionShape3D" parent="."]
+transform = Transform3D(1.91069e-15, 4.37114e-08, 1, 1, -4.37114e-08, 0, 4.37114e-08, 1, -4.37114e-08, 0, 0, 0)
+shape = SubResource("ConcavePolygonShape3D_c3er2")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
+visibility_range_end_margin = 1000.0
+visibility_range_fade_mode = 1
+mesh = ExtResource("2_xys6y")
+skeleton = NodePath("")
+
+[node name="PlayerDetector" type="Area3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+collision_layer = 0
+collision_mask = 2
+monitorable = false
+
+[node name="Area" type="CollisionShape3D" parent="PlayerDetector"]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+shape = SubResource("BoxShape3D_k77jm")
+
+[node name="camera" parent="." instance=ExtResource("3_674db")]
diff --git a/assets/blocks/ring_finish.tscn b/assets/blocks/ring_finish.tscn
new file mode 100644
index 0000000..4c7c617
--- /dev/null
+++ b/assets/blocks/ring_finish.tscn
@@ -0,0 +1,37 @@
+[gd_scene load_steps=6 format=3 uid="uid://bm7dvglsg6cxo"]
+
+[ext_resource type="Script" path="res://classes/finish.gd" id="1_2c5pp"]
+[ext_resource type="TorusMesh" uid="uid://bc8hyk8kfo4q1" path="res://assets/meshes/ring_finish.tres" id="2_hvrqd"]
+[ext_resource type="PackedScene" uid="uid://bb56nmgmi1i74" path="res://ui/editor/cameras/side_far_cam.tscn" id="3_a8arm"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_pk7yj"]
+data = PackedVector3Array(-6, 0, -10.3923, 0, 2.5, -14.5, 0, 0, -12, -6, 0, -10.3923, -7.25, 2.5, -12.5574, 0, 2.5, -14.5, -7.25, 2.5, -12.5574, 0, 0, -17, 0, 2.5, -14.5, -7.25, 2.5, -12.5574, -8.5, 0, -14.7224, 0, 0, -17, -8.5, 0, -14.7224, 0, -2.5, -14.5, 0, 0, -17, -8.5, 0, -14.7224, -7.25, -2.5, -12.5574, 0, -2.5, -14.5, -7.25, -2.5, -12.5574, 0, 0, -12, 0, -2.5, -14.5, -7.25, -2.5, -12.5574, -6, 0, -10.3923, 0, 0, -12, -10.3923, 0, -6, -7.25, 2.5, -12.5574, -6, 0, -10.3923, -10.3923, 0, -6, -12.5574, 2.5, -7.25, -7.25, 2.5, -12.5574, -12.5574, 2.5, -7.25, -8.5, 0, -14.7224, -7.25, 2.5, -12.5574, -12.5574, 2.5, -7.25, -14.7224, 0, -8.5, -8.5, 0, -14.7224, -14.7224, 0, -8.5, -7.25, -2.5, -12.5574, -8.5, 0, -14.7224, -14.7224, 0, -8.5, -12.5574, -2.5, -7.25, -7.25, -2.5, -12.5574, -12.5574, -2.5, -7.25, -6, 0, -10.3923, -7.25, -2.5, -12.5574, -12.5574, -2.5, -7.25, -10.3923, 0, -6, -6, 0, -10.3923, -12, 0, 0, -12.5574, 2.5, -7.25, -10.3923, 0, -6, -12, 0, 0, -14.5, 2.5, 0, -12.5574, 2.5, -7.25, -14.5, 2.5, 0, -14.7224, 0, -8.5, -12.5574, 2.5, -7.25, -14.5, 2.5, 0, -17, 0, 0, -14.7224, 0, -8.5, -17, 0, 0, -12.5574, -2.5, -7.25, -14.7224, 0, -8.5, -17, 0, 0, -14.5, -2.5, 0, -12.5574, -2.5, -7.25, -14.5, -2.5, 0, -10.3923, 0, -6, -12.5574, -2.5, -7.25, -14.5, -2.5, 0, -12, 0, 0, -10.3923, 0, -6, -10.3923, 0, 6, -14.5, 2.5, 0, -12, 0, 0, -10.3923, 0, 6, -12.5574, 2.5, 7.25, -14.5, 2.5, 0, -12.5574, 2.5, 7.25, -17, 0, 0, -14.5, 2.5, 0, -12.5574, 2.5, 7.25, -14.7224, 0, 8.5, -17, 0, 0, -14.7224, 0, 8.5, -14.5, -2.5, 0, -17, 0, 0, -14.7224, 0, 8.5, -12.5574, -2.5, 7.25, -14.5, -2.5, 0, -12.5574, -2.5, 7.25, -12, 0, 0, -14.5, -2.5, 0, -12.5574, -2.5, 7.25, -10.3923, 0, 6, -12, 0, 0, -6, 0, 10.3923, -12.5574, 2.5, 7.25, -10.3923, 0, 6, -6, 0, 10.3923, -7.25, 2.5, 12.5574, -12.5574, 2.5, 7.25, -7.25, 2.5, 12.5574, -14.7224, 0, 8.5, -12.5574, 2.5, 7.25, -7.25, 2.5, 12.5574, -8.5, 0, 14.7224, -14.7224, 0, 8.5, -8.5, 0, 14.7224, -12.5574, -2.5, 7.25, -14.7224, 0, 8.5, -8.5, 0, 14.7224, -7.25, -2.5, 12.5574, -12.5574, -2.5, 7.25, -7.25, -2.5, 12.5574, -10.3923, 0, 6, -12.5574, -2.5, 7.25, -7.25, -2.5, 12.5574, -6, 0, 10.3923, -10.3923, 0, 6, 0, 0, 12, -7.25, 2.5, 12.5574, -6, 0, 10.3923, 0, 0, 12, 0, 2.5, 14.5, -7.25, 2.5, 12.5574, 0, 2.5, 14.5, -8.5, 0, 14.7224, -7.25, 2.5, 12.5574, 0, 2.5, 14.5, 0, 0, 17, -8.5, 0, 14.7224, 0, 0, 17, -7.25, -2.5, 12.5574, -8.5, 0, 14.7224, 0, 0, 17, 0, -2.5, 14.5, -7.25, -2.5, 12.5574, 0, -2.5, 14.5, -6, 0, 10.3923, -7.25, -2.5, 12.5574, 0, -2.5, 14.5, 0, 0, 12, -6, 0, 10.3923, 6, 0, 10.3923, 0, 2.5, 14.5, 0, 0, 12, 6, 0, 10.3923, 7.25, 2.5, 12.5574, 0, 2.5, 14.5, 7.25, 2.5, 12.5574, 0, 0, 17, 0, 2.5, 14.5, 7.25, 2.5, 12.5574, 8.5, 0, 14.7224, 0, 0, 17, 8.5, 0, 14.7224, 0, -2.5, 14.5, 0, 0, 17, 8.5, 0, 14.7224, 7.25, -2.5, 12.5574, 0, -2.5, 14.5, 7.25, -2.5, 12.5574, 0, 0, 12, 0, -2.5, 14.5, 7.25, -2.5, 12.5574, 6, 0, 10.3923, 0, 0, 12, 10.3923, 0, 6, 7.25, 2.5, 12.5574, 6, 0, 10.3923, 10.3923, 0, 6, 12.5574, 2.5, 7.25, 7.25, 2.5, 12.5574, 12.5574, 2.5, 7.25, 8.5, 0, 14.7224, 7.25, 2.5, 12.5574, 12.5574, 2.5, 7.25, 14.7224, 0, 8.5, 8.5, 0, 14.7224, 14.7224, 0, 8.5, 7.25, -2.5, 12.5574, 8.5, 0, 14.7224, 14.7224, 0, 8.5, 12.5574, -2.5, 7.25, 7.25, -2.5, 12.5574, 12.5574, -2.5, 7.25, 6, 0, 10.3923, 7.25, -2.5, 12.5574, 12.5574, -2.5, 7.25, 10.3923, 0, 6, 6, 0, 10.3923, 12, 0, 0, 12.5574, 2.5, 7.25, 10.3923, 0, 6, 12, 0, 0, 14.5, 2.5, 0, 12.5574, 2.5, 7.25, 14.5, 2.5, 0, 14.7224, 0, 8.5, 12.5574, 2.5, 7.25, 14.5, 2.5, 0, 17, 0, 0, 14.7224, 0, 8.5, 17, 0, 0, 12.5574, -2.5, 7.25, 14.7224, 0, 8.5, 17, 0, 0, 14.5, -2.5, 0, 12.5574, -2.5, 7.25, 14.5, -2.5, 0, 10.3923, 0, 6, 12.5574, -2.5, 7.25, 14.5, -2.5, 0, 12, 0, 0, 10.3923, 0, 6, 10.3923, 0, -6, 14.5, 2.5, 0, 12, 0, 0, 10.3923, 0, -6, 12.5574, 2.5, -7.25, 14.5, 2.5, 0, 12.5574, 2.5, -7.25, 17, 0, 0, 14.5, 2.5, 0, 12.5574, 2.5, -7.25, 14.7224, 0, -8.5, 17, 0, 0, 14.7224, 0, -8.5, 14.5, -2.5, 0, 17, 0, 0, 14.7224, 0, -8.5, 12.5574, -2.5, -7.25, 14.5, -2.5, 0, 12.5574, -2.5, -7.25, 12, 0, 0, 14.5, -2.5, 0, 12.5574, -2.5, -7.25, 10.3923, 0, -6, 12, 0, 0, 6, 0, -10.3923, 12.5574, 2.5, -7.25, 10.3923, 0, -6, 6, 0, -10.3923, 7.25, 2.5, -12.5574, 12.5574, 2.5, -7.25, 7.25, 2.5, -12.5574, 14.7224, 0, -8.5, 12.5574, 2.5, -7.25, 7.25, 2.5, -12.5574, 8.5, 0, -14.7224, 14.7224, 0, -8.5, 8.5, 0, -14.7224, 12.5574, -2.5, -7.25, 14.7224, 0, -8.5, 8.5, 0, -14.7224, 7.25, -2.5, -12.5574, 12.5574, -2.5, -7.25, 7.25, -2.5, -12.5574, 10.3923, 0, -6, 12.5574, -2.5, -7.25, 7.25, -2.5, -12.5574, 6, 0, -10.3923, 10.3923, 0, -6, 0, 0, -12, 7.25, 2.5, -12.5574, 6, 0, -10.3923, 0, 0, -12, 0, 2.5, -14.5, 7.25, 2.5, -12.5574, 0, 2.5, -14.5, 8.5, 0, -14.7224, 7.25, 2.5, -12.5574, 0, 2.5, -14.5, 0, 0, -17, 8.5, 0, -14.7224, 0, 0, -17, 7.25, -2.5, -12.5574, 8.5, 0, -14.7224, 0, 0, -17, 0, -2.5, -14.5, 7.25, -2.5, -12.5574, 0, -2.5, -14.5, 6, 0, -10.3923, 7.25, -2.5, -12.5574, 0, -2.5, -14.5, 0, 0, -12, 6, 0, -10.3923)
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_bu8o6"]
+size = Vector3(23, 23, 3)
+
+[node name="ring_finish" type="StaticBody3D" node_paths=PackedStringArray("player_detector", "mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_2c5pp")
+player_detector = NodePath("PlayerDetector")
+mesh = NodePath("Ring")
+
+[node name="shape" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
+shape = SubResource("ConcavePolygonShape3D_pk7yj")
+
+[node name="Ring" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
+mesh = ExtResource("2_hvrqd")
+skeleton = NodePath("")
+
+[node name="PlayerDetector" type="Area3D" parent="."]
+collision_layer = 0
+collision_mask = 2
+monitorable = false
+
+[node name="Area" type="CollisionShape3D" parent="PlayerDetector"]
+shape = SubResource("BoxShape3D_bu8o6")
+
+[node name="camera" parent="." instance=ExtResource("3_a8arm")]
diff --git a/assets/blocks/ring_start.tscn b/assets/blocks/ring_start.tscn
new file mode 100644
index 0000000..0409db2
--- /dev/null
+++ b/assets/blocks/ring_start.tscn
@@ -0,0 +1,58 @@
+[gd_scene load_steps=8 format=3 uid="uid://cy2ialm17md6c"]
+
+[ext_resource type="TorusMesh" uid="uid://cwiqggu3nwbyh" path="res://assets/meshes/ring_start.tres" id="1_ksild"]
+[ext_resource type="Material" uid="uid://dekbqdhjdmtod" path="res://assets/blocks/start_guide.material" id="3_8k4fv"]
+[ext_resource type="PackedScene" uid="uid://bb56nmgmi1i74" path="res://ui/editor/cameras/side_far_cam.tscn" id="3_cpkl8"]
+
+[sub_resource type="GDScript" id="GDScript_jas2p"]
+resource_name = "ring start"
+script/source = "extends Start
+
+func _ready() -> void:
+ super()
+ if not editor:
+ $editor_guide_cylinder.queue_free()
+ $editor_guide_point.queue_free()
+"
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_wl74k"]
+data = PackedVector3Array(-6, 0, -10.3923, 0, 2.5, -14.5, 0, 0, -12, -6, 0, -10.3923, -7.25, 2.5, -12.5574, 0, 2.5, -14.5, -7.25, 2.5, -12.5574, 0, 0, -17, 0, 2.5, -14.5, -7.25, 2.5, -12.5574, -8.5, 0, -14.7224, 0, 0, -17, -8.5, 0, -14.7224, 0, -2.5, -14.5, 0, 0, -17, -8.5, 0, -14.7224, -7.25, -2.5, -12.5574, 0, -2.5, -14.5, -7.25, -2.5, -12.5574, 0, 0, -12, 0, -2.5, -14.5, -7.25, -2.5, -12.5574, -6, 0, -10.3923, 0, 0, -12, -10.3923, 0, -6, -7.25, 2.5, -12.5574, -6, 0, -10.3923, -10.3923, 0, -6, -12.5574, 2.5, -7.25, -7.25, 2.5, -12.5574, -12.5574, 2.5, -7.25, -8.5, 0, -14.7224, -7.25, 2.5, -12.5574, -12.5574, 2.5, -7.25, -14.7224, 0, -8.5, -8.5, 0, -14.7224, -14.7224, 0, -8.5, -7.25, -2.5, -12.5574, -8.5, 0, -14.7224, -14.7224, 0, -8.5, -12.5574, -2.5, -7.25, -7.25, -2.5, -12.5574, -12.5574, -2.5, -7.25, -6, 0, -10.3923, -7.25, -2.5, -12.5574, -12.5574, -2.5, -7.25, -10.3923, 0, -6, -6, 0, -10.3923, -12, 0, 0, -12.5574, 2.5, -7.25, -10.3923, 0, -6, -12, 0, 0, -14.5, 2.5, 0, -12.5574, 2.5, -7.25, -14.5, 2.5, 0, -14.7224, 0, -8.5, -12.5574, 2.5, -7.25, -14.5, 2.5, 0, -17, 0, 0, -14.7224, 0, -8.5, -17, 0, 0, -12.5574, -2.5, -7.25, -14.7224, 0, -8.5, -17, 0, 0, -14.5, -2.5, 0, -12.5574, -2.5, -7.25, -14.5, -2.5, 0, -10.3923, 0, -6, -12.5574, -2.5, -7.25, -14.5, -2.5, 0, -12, 0, 0, -10.3923, 0, -6, -10.3923, 0, 6, -14.5, 2.5, 0, -12, 0, 0, -10.3923, 0, 6, -12.5574, 2.5, 7.25, -14.5, 2.5, 0, -12.5574, 2.5, 7.25, -17, 0, 0, -14.5, 2.5, 0, -12.5574, 2.5, 7.25, -14.7224, 0, 8.5, -17, 0, 0, -14.7224, 0, 8.5, -14.5, -2.5, 0, -17, 0, 0, -14.7224, 0, 8.5, -12.5574, -2.5, 7.25, -14.5, -2.5, 0, -12.5574, -2.5, 7.25, -12, 0, 0, -14.5, -2.5, 0, -12.5574, -2.5, 7.25, -10.3923, 0, 6, -12, 0, 0, -6, 0, 10.3923, -12.5574, 2.5, 7.25, -10.3923, 0, 6, -6, 0, 10.3923, -7.25, 2.5, 12.5574, -12.5574, 2.5, 7.25, -7.25, 2.5, 12.5574, -14.7224, 0, 8.5, -12.5574, 2.5, 7.25, -7.25, 2.5, 12.5574, -8.5, 0, 14.7224, -14.7224, 0, 8.5, -8.5, 0, 14.7224, -12.5574, -2.5, 7.25, -14.7224, 0, 8.5, -8.5, 0, 14.7224, -7.25, -2.5, 12.5574, -12.5574, -2.5, 7.25, -7.25, -2.5, 12.5574, -10.3923, 0, 6, -12.5574, -2.5, 7.25, -7.25, -2.5, 12.5574, -6, 0, 10.3923, -10.3923, 0, 6, 0, 0, 12, -7.25, 2.5, 12.5574, -6, 0, 10.3923, 0, 0, 12, 0, 2.5, 14.5, -7.25, 2.5, 12.5574, 0, 2.5, 14.5, -8.5, 0, 14.7224, -7.25, 2.5, 12.5574, 0, 2.5, 14.5, 0, 0, 17, -8.5, 0, 14.7224, 0, 0, 17, -7.25, -2.5, 12.5574, -8.5, 0, 14.7224, 0, 0, 17, 0, -2.5, 14.5, -7.25, -2.5, 12.5574, 0, -2.5, 14.5, -6, 0, 10.3923, -7.25, -2.5, 12.5574, 0, -2.5, 14.5, 0, 0, 12, -6, 0, 10.3923, 6, 0, 10.3923, 0, 2.5, 14.5, 0, 0, 12, 6, 0, 10.3923, 7.25, 2.5, 12.5574, 0, 2.5, 14.5, 7.25, 2.5, 12.5574, 0, 0, 17, 0, 2.5, 14.5, 7.25, 2.5, 12.5574, 8.5, 0, 14.7224, 0, 0, 17, 8.5, 0, 14.7224, 0, -2.5, 14.5, 0, 0, 17, 8.5, 0, 14.7224, 7.25, -2.5, 12.5574, 0, -2.5, 14.5, 7.25, -2.5, 12.5574, 0, 0, 12, 0, -2.5, 14.5, 7.25, -2.5, 12.5574, 6, 0, 10.3923, 0, 0, 12, 10.3923, 0, 6, 7.25, 2.5, 12.5574, 6, 0, 10.3923, 10.3923, 0, 6, 12.5574, 2.5, 7.25, 7.25, 2.5, 12.5574, 12.5574, 2.5, 7.25, 8.5, 0, 14.7224, 7.25, 2.5, 12.5574, 12.5574, 2.5, 7.25, 14.7224, 0, 8.5, 8.5, 0, 14.7224, 14.7224, 0, 8.5, 7.25, -2.5, 12.5574, 8.5, 0, 14.7224, 14.7224, 0, 8.5, 12.5574, -2.5, 7.25, 7.25, -2.5, 12.5574, 12.5574, -2.5, 7.25, 6, 0, 10.3923, 7.25, -2.5, 12.5574, 12.5574, -2.5, 7.25, 10.3923, 0, 6, 6, 0, 10.3923, 12, 0, 0, 12.5574, 2.5, 7.25, 10.3923, 0, 6, 12, 0, 0, 14.5, 2.5, 0, 12.5574, 2.5, 7.25, 14.5, 2.5, 0, 14.7224, 0, 8.5, 12.5574, 2.5, 7.25, 14.5, 2.5, 0, 17, 0, 0, 14.7224, 0, 8.5, 17, 0, 0, 12.5574, -2.5, 7.25, 14.7224, 0, 8.5, 17, 0, 0, 14.5, -2.5, 0, 12.5574, -2.5, 7.25, 14.5, -2.5, 0, 10.3923, 0, 6, 12.5574, -2.5, 7.25, 14.5, -2.5, 0, 12, 0, 0, 10.3923, 0, 6, 10.3923, 0, -6, 14.5, 2.5, 0, 12, 0, 0, 10.3923, 0, -6, 12.5574, 2.5, -7.25, 14.5, 2.5, 0, 12.5574, 2.5, -7.25, 17, 0, 0, 14.5, 2.5, 0, 12.5574, 2.5, -7.25, 14.7224, 0, -8.5, 17, 0, 0, 14.7224, 0, -8.5, 14.5, -2.5, 0, 17, 0, 0, 14.7224, 0, -8.5, 12.5574, -2.5, -7.25, 14.5, -2.5, 0, 12.5574, -2.5, -7.25, 12, 0, 0, 14.5, -2.5, 0, 12.5574, -2.5, -7.25, 10.3923, 0, -6, 12, 0, 0, 6, 0, -10.3923, 12.5574, 2.5, -7.25, 10.3923, 0, -6, 6, 0, -10.3923, 7.25, 2.5, -12.5574, 12.5574, 2.5, -7.25, 7.25, 2.5, -12.5574, 14.7224, 0, -8.5, 12.5574, 2.5, -7.25, 7.25, 2.5, -12.5574, 8.5, 0, -14.7224, 14.7224, 0, -8.5, 8.5, 0, -14.7224, 12.5574, -2.5, -7.25, 14.7224, 0, -8.5, 8.5, 0, -14.7224, 7.25, -2.5, -12.5574, 12.5574, -2.5, -7.25, 7.25, -2.5, -12.5574, 10.3923, 0, -6, 12.5574, -2.5, -7.25, 7.25, -2.5, -12.5574, 6, 0, -10.3923, 10.3923, 0, -6, 0, 0, -12, 7.25, 2.5, -12.5574, 6, 0, -10.3923, 0, 0, -12, 0, 2.5, -14.5, 7.25, 2.5, -12.5574, 0, 2.5, -14.5, 8.5, 0, -14.7224, 7.25, 2.5, -12.5574, 0, 2.5, -14.5, 0, 0, -17, 8.5, 0, -14.7224, 0, 0, -17, 7.25, -2.5, -12.5574, 8.5, 0, -14.7224, 0, 0, -17, 0, -2.5, -14.5, 7.25, -2.5, -12.5574, 0, -2.5, -14.5, 6, 0, -10.3923, 7.25, -2.5, -12.5574, 0, -2.5, -14.5, 0, 0, -12, 6, 0, -10.3923)
+
+[sub_resource type="CylinderMesh" id="CylinderMesh_1hr2x"]
+material = ExtResource("3_8k4fv")
+top_radius = 3.0
+bottom_radius = 5.0
+height = 10.0
+radial_segments = 32
+
+[sub_resource type="CylinderMesh" id="CylinderMesh_l0thy"]
+material = ExtResource("3_8k4fv")
+top_radius = 0.0
+bottom_radius = 5.0
+height = 5.0
+radial_segments = 32
+
+[node name="ring_start" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = SubResource("GDScript_jas2p")
+mesh = NodePath("Ring")
+
+[node name="shape" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
+shape = SubResource("ConcavePolygonShape3D_wl74k")
+
+[node name="Ring" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
+mesh = ExtResource("1_ksild")
+skeleton = NodePath("")
+
+[node name="editor_guide_cylinder" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, -5)
+mesh = SubResource("CylinderMesh_1hr2x")
+
+[node name="editor_guide_point" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, -12.5)
+mesh = SubResource("CylinderMesh_l0thy")
+
+[node name="camera" parent="." instance=ExtResource("3_cpkl8")]
diff --git a/assets/blocks/start_guide.material b/assets/blocks/start_guide.material
new file mode 100644
index 0000000..3b1fc6d
--- /dev/null
+++ b/assets/blocks/start_guide.material
Binary files differ
diff --git a/assets/blocks/tree.gd b/assets/blocks/tree.gd
new file mode 100644
index 0000000..4da5745
--- /dev/null
+++ b/assets/blocks/tree.gd
@@ -0,0 +1,17 @@
+extends Decoration
+
+@export var hl_top_mat: BaseMaterial3D
+@export var hl_trunk_mat: BaseMaterial3D
+@export var top_mat: BaseMaterial3D
+@export var trunk_mat: BaseMaterial3D
+
+func get_aabb():
+ return %trunk.get_aabb().merge(%top.get_aabb())
+
+func highlight() -> void:
+ %trunk.set_surface_override_material(0, hl_trunk_mat)
+ %top.set_surface_override_material(0, hl_top_mat)
+
+func un_highlight() -> void:
+ %trunk.set_surface_override_material(0, trunk_mat)
+ %top.set_surface_override_material(0, top_mat)
diff --git a/assets/blocks/tree.tscn b/assets/blocks/tree.tscn
new file mode 100644
index 0000000..fb838b1
--- /dev/null
+++ b/assets/blocks/tree.tscn
@@ -0,0 +1,64 @@
+[gd_scene load_steps=11 format=3 uid="uid://d2nwkpdn3gnx3"]
+
+[ext_resource type="Script" path="res://assets/blocks/tree.gd" id="1_aqri3"]
+[ext_resource type="ArrayMesh" uid="uid://wpn040a4trym" path="res://assets/meshes/tree_bottom.tres" id="2_aqfsv"]
+[ext_resource type="ArrayMesh" uid="uid://dnglrbqb00hnw" path="res://assets/meshes/tree_top.mesh" id="3_ek4hf"]
+[ext_resource type="PackedScene" uid="uid://ccfnlmu6xnhxg" path="res://ui/editor/cameras/tall_side_slant_cam.tscn" id="4_ruq6c"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_id6f0"]
+resource_name = "tree top hl"
+albedo_color = Color(0.333333, 0.67451, 0.172549, 1)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_70boo"]
+resource_name = "tree trunk hl"
+albedo_color = Color(0.705882, 0.435294, 0.384314, 1)
+metallic_specular = 0.0
+roughness = 0.0
+texture_filter = 0
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bo2t4"]
+resource_name = "tree top"
+albedo_color = Color(0.286275, 0.580392, 0.14902, 1)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_wm34v"]
+resource_name = "tree trunk"
+albedo_color = Color(0.403922, 0.223529, 0.192157, 1)
+metallic_specular = 0.0
+roughness = 0.0
+texture_filter = 0
+
+[sub_resource type="CylinderShape3D" id="CylinderShape3D_0lfwo"]
+height = 3.0
+radius = 1.0
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_woi3d"]
+points = PackedVector3Array(0, -1.5, -2.949, -2.08531, -1.5, -2.08531, 0, -0.900059, -2.35955, 2.08474, -1.5, -2.08531, -2.949, -1.5, 0, -2.35955, -0.900059, 0, -1.25165, -0.300117, -1.25165, 0, 0.299824, -1.18006, 1.25107, -0.300117, -1.25165, 2.949, -1.5, 0, -2.08531, -1.5, 2.08474, -1.25165, -0.300117, 1.25107, -1.18006, 0.299824, 0, -0.417409, 0.899765, -0.417409, 0, 1.5, 0, 1.25107, -0.300117, 1.25107, 2.08474, -1.5, 2.08474, 0, -1.5, 2.949)
+
+[node name="tree" type="StaticBody3D"]
+input_ray_pickable = false
+script = ExtResource("1_aqri3")
+hl_top_mat = SubResource("StandardMaterial3D_id6f0")
+hl_trunk_mat = SubResource("StandardMaterial3D_70boo")
+top_mat = SubResource("StandardMaterial3D_bo2t4")
+trunk_mat = SubResource("StandardMaterial3D_wm34v")
+
+[node name="trunk" type="MeshInstance3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
+mesh = ExtResource("2_aqfsv")
+surface_material_override/0 = SubResource("StandardMaterial3D_wm34v")
+
+[node name="top" type="MeshInstance3D" parent="."]
+unique_name_in_owner = true
+mesh = ExtResource("3_ek4hf")
+surface_material_override/0 = SubResource("StandardMaterial3D_bo2t4")
+
+[node name="collision1" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
+shape = SubResource("CylinderShape3D_0lfwo")
+
+[node name="collision2" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.98431, 0)
+shape = SubResource("ConvexPolygonShape3D_woi3d")
+
+[node name="camera" parent="." instance=ExtResource("4_ruq6c")]
diff --git a/assets/blocks/walls/corner_wall.tscn b/assets/blocks/walls/corner_wall.tscn
new file mode 100644
index 0000000..6a55cca
--- /dev/null
+++ b/assets/blocks/walls/corner_wall.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=4 format=3 uid="uid://clvtje1uy8v2s"]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_kfuvf"]
+[ext_resource type="ArrayMesh" uid="uid://tdpui03o1a0i" path="res://assets/meshes/walls/corner_wall.tres" id="2_wftl1"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_y18tm"]
+points = PackedVector3Array(-4.99354, -0.5, -6.00711, -5, -0.5, -5.00078, -4.99354, 2.5, -6.00711, 6.00711, -0.5, 4.99246, -5, 2.5, -5.00078, 4.9997, -0.5, 5, 6.00711, 2.5, 4.99246, 4.9997, 2.5, 5)
+
+[node name="corner_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_kfuvf")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 1.06581e-14, 0, 1, 0, -1.06581e-14, 0, 1, 0, 0, 0)
+mesh = ExtResource("2_wftl1")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 1.06581e-14, 0, 1, 0, -1.06581e-14, 0, 1, 0, 0, 0)
+shape = SubResource("ConvexPolygonShape3D_y18tm")
diff --git a/assets/blocks/walls/diagonal_wall.tscn b/assets/blocks/walls/diagonal_wall.tscn
new file mode 100644
index 0000000..42f0bae
--- /dev/null
+++ b/assets/blocks/walls/diagonal_wall.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=4 format=3 uid="uid://dforj6583ykxh"]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_ftymv"]
+[ext_resource type="ArrayMesh" uid="uid://8dvooynpliqm" path="res://assets/meshes/walls/diagonal_wall.tres" id="2_88wck"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_x2x34"]
+points = PackedVector3Array(-5, 2.5, 6, -5, 2.5, 5, -5, -0.500343, 6, 5, -0.00019598, 6, 5, -0.00019598, 5, -5, -0.500343, 5, 5, -3, 6, 5, -3, 5)
+
+[node name="diagonal_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_ftymv")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -11)
+mesh = ExtResource("2_88wck")
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -11)
+shape = SubResource("ConvexPolygonShape3D_x2x34")
diff --git a/assets/blocks/walls/flat_wall.tscn b/assets/blocks/walls/flat_wall.tscn
new file mode 100644
index 0000000..14e465f
--- /dev/null
+++ b/assets/blocks/walls/flat_wall.tscn
@@ -0,0 +1,22 @@
+[gd_scene load_steps=4 format=3 uid="uid://lq13suvwdu6g"]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_8sr8v"]
+[ext_resource type="ArrayMesh" uid="uid://c5yviammd3ie" path="res://assets/meshes/walls/flat_wall.mesh" id="2_xr5wx"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_s6p00"]
+points = PackedVector3Array(5, -0.5, -5, 6, -0.5, -5, 5, -0.5, 5, 5, 2.5, -5, 6, 2.5, -5, 6, -0.5, 5, 5, 2.5, 5, 6, 2.5, 5)
+
+[node name="flat_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_8sr8v")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+mesh = ExtResource("2_xr5wx")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+visible = false
+shape = SubResource("ConvexPolygonShape3D_s6p00")
diff --git a/assets/blocks/walls/large_curved_wall.tscn b/assets/blocks/walls/large_curved_wall.tscn
new file mode 100644
index 0000000..80fcc5a
--- /dev/null
+++ b/assets/blocks/walls/large_curved_wall.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=4 format=3]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_k2b4a"]
+[ext_resource type="ArrayMesh" uid="uid://dtexmiikiu1om" path="res://assets/meshes/walls/large_curved_wall.tres" id="2_3bnhc"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_41m1v"]
+data = PackedVector3Array(2.7164, -5, -6.4805, 0.9808, -2, -10, 2.7164, -2, -6.4805, 2.7164, -5, -6.4805, 0.9808, -5, -10, 0.9808, -2, -10, -10, -5, -20.9808, -13.5195, -2, -22.7164, -10, -2, -20.9808, -10, -5, -20.9808, -13.5195, -5, -22.7164, -13.5195, -2, -22.7164, 4.7433, -5, 1.0842, 3.9778, -2, -2.7646, 4.7433, -2, 1.0842, 4.7433, -5, 1.0842, 3.9778, -5, -2.7646, 3.9778, -2, -2.7646, -3.7868, -5, -16.2132, -6.7372, -2, -18.8006, -3.7868, -2, -16.2132, -3.7868, -5, -16.2132, -6.7372, -5, -18.8006, -6.7372, -2, -18.8006, -21.0842, -5, -24.7434, -25, -2, -25, -21.0842, -2, -24.7434, -21.0842, -5, -24.7434, -25, -5, -25, -25, -2, -25, 0.9808, -5, -10, -1.1994, -2, -13.2628, 0.9808, -2, -10, 0.9808, -5, -10, -1.1994, -5, -13.2628, -1.1994, -2, -13.2628, -13.5195, -5, -22.7164, -17.2354, -2, -23.9778, -13.5195, -2, -22.7164, -13.5195, -5, -22.7164, -17.2354, -5, -23.9778, -17.2354, -2, -23.9778, 3.9778, -5, -2.7646, 2.7164, -2, -6.4805, 3.9778, -2, -2.7646, 3.9778, -5, -2.7646, 2.7164, -5, -6.4805, 2.7164, -2, -6.4805, -6.7372, -5, -18.8006, -10, -2, -20.9808, -6.7372, -2, -18.8006, -6.7372, -5, -18.8006, -10, -5, -20.9808, -10, -2, -20.9808, 5, -5, 5, 4.7433, -2, 1.0842, 5, -2, 5, 5, -5, 5, 4.7433, -5, 1.0842, 4.7433, -2, 1.0842, -1.1994, -5, -13.2628, -3.7868, -2, -16.2132, -1.1994, -2, -13.2628, -1.1994, -5, -13.2628, -3.7868, -5, -16.2132, -3.7868, -2, -16.2132, -17.2354, -5, -23.9778, -21.0842, -2, -24.7434, -17.2354, -2, -23.9778, -17.2354, -5, -23.9778, -21.0842, -5, -24.7434, -21.0842, -2, -24.7434, 3.6403, -5, -6.8632, 1.8468, -2, -10.5, 1.8468, -5, -10.5, 3.6403, -5, -6.8632, 3.6403, -2, -6.8632, 1.8468, -2, -10.5, -9.5, -5, -21.8468, -13.1368, -2, -23.6403, -13.1368, -5, -23.6403, -9.5, -5, -21.8468, -9.5, -2, -21.8468, -13.1368, -2, -23.6403, 5.7348, -5, 0.9537, 4.9437, -2, -3.0234, 4.9437, -5, -3.0234, 5.7348, -5, 0.9537, 5.7348, -2, 0.9537, 4.9437, -2, -3.0234, -3.0797, -5, -16.9203, -6.1284, -2, -19.594, -6.1284, -5, -19.594, -3.0797, -5, -16.9203, -3.0797, -2, -16.9203, -6.1284, -2, -19.594, -20.9537, -5, -25.7348, -25, -2, -25.9979, -25, -5, -25.9979, -20.9537, -5, -25.7348, -20.9537, -2, -25.7348, -25, -2, -25.9979, 1.8468, -5, -10.5, -0.406, -2, -13.8716, -0.406, -5, -13.8716, 1.8468, -5, -10.5, 1.8468, -2, -10.5, -0.406, -2, -13.8716, -13.1368, -5, -23.6403, -16.9766, -2, -24.9437, -16.9766, -5, -24.9437, -13.1368, -5, -23.6403, -13.1368, -2, -23.6403, -16.9766, -2, -24.9437, 4.9437, -5, -3.0234, 3.6403, -2, -6.8632, 3.6403, -5, -6.8632, 4.9437, -5, -3.0234, 4.9437, -2, -3.0234, 3.6403, -2, -6.8632, -6.1284, -5, -19.594, -9.5, -2, -21.8468, -9.5, -5, -21.8468, -6.1284, -5, -19.594, -6.1284, -2, -19.594, -9.5, -2, -21.8468, 5.9979, -5, 5, 5.7348, -2, 0.9537, 5.7348, -5, 0.9537, 5.9979, -5, 5, 5.9979, -2, 5, 5.7348, -2, 0.9537, -0.406, -5, -13.8716, -3.0797, -2, -16.9203, -3.0797, -5, -16.9203, -0.406, -5, -13.8716, -0.406, -2, -13.8716, -3.0797, -2, -16.9203, -16.9766, -5, -24.9437, -20.9537, -2, -25.7348, -20.9537, -5, -25.7348, -16.9766, -5, -24.9437, -16.9766, -2, -24.9437, -20.9537, -2, -25.7348, 5, -2, 5, 5.9979, -5, 5, 5, -5, 5, 5, -2, 5, 5.9979, -2, 5, 5.9979, -5, 5, 2.7164, -2, -6.4805, 4.9437, -2, -3.0234, 3.9778, -2, -2.7646, 2.7164, -2, -6.4805, 3.6403, -2, -6.8632, 4.9437, -2, -3.0234, -6.7372, -5, -18.8006, -9.5, -5, -21.8468, -10, -5, -20.9808, -6.7372, -5, -18.8006, -6.1284, -5, -19.594, -9.5, -5, -21.8468, -21.0842, -2, -24.7434, -16.9766, -2, -24.9437, -17.2354, -2, -23.9778, -21.0842, -2, -24.7434, -20.9537, -2, -25.7348, -16.9766, -2, -24.9437, 5, -5, 5, 5.7348, -5, 0.9537, 4.7433, -5, 1.0842, 5, -5, 5, 5.9979, -5, 5, 5.7348, -5, 0.9537, 0.9808, -2, -10, 3.6403, -2, -6.8632, 2.7164, -2, -6.4805, 0.9808, -2, -10, 1.8468, -2, -10.5, 3.6403, -2, -6.8632, -10, -5, -20.9808, -13.1368, -5, -23.6403, -13.5195, -5, -22.7164, -10, -5, -20.9808, -9.5, -5, -21.8468, -13.1368, -5, -23.6403, -25, -2, -25, -20.9537, -2, -25.7348, -21.0842, -2, -24.7434, -25, -2, -25, -25, -2, -25.9979, -20.9537, -2, -25.7348, 4.7433, -5, 1.0842, 4.9437, -5, -3.0234, 3.9778, -5, -2.7646, 4.7433, -5, 1.0842, 5.7348, -5, 0.9537, 4.9437, -5, -3.0234, -1.1994, -2, -13.2628, 1.8468, -2, -10.5, 0.9808, -2, -10, -1.1994, -2, -13.2628, -0.406, -2, -13.8716, 1.8468, -2, -10.5, -13.5195, -5, -22.7164, -16.9766, -5, -24.9437, -17.2354, -5, -23.9778, -13.5195, -5, -22.7164, -13.1368, -5, -23.6403, -16.9766, -5, -24.9437, 3.9778, -5, -2.7646, 3.6403, -5, -6.8632, 2.7164, -5, -6.4805, 3.9778, -5, -2.7646, 4.9437, -5, -3.0234, 3.6403, -5, -6.8632, -3.7868, -2, -16.2132, -0.406, -2, -13.8716, -1.1994, -2, -13.2628, -3.7868, -2, -16.2132, -3.0797, -2, -16.9203, -0.406, -2, -13.8716, -17.2354, -5, -23.9778, -20.9537, -5, -25.7348, -21.0842, -5, -24.7434, -17.2354, -5, -23.9778, -16.9766, -5, -24.9437, -20.9537, -5, -25.7348, 2.7164, -5, -6.4805, 1.8468, -5, -10.5, 0.9808, -5, -10, 2.7164, -5, -6.4805, 3.6403, -5, -6.8632, 1.8468, -5, -10.5, -6.7372, -2, -18.8006, -3.0797, -2, -16.9203, -3.7868, -2, -16.2132, -6.7372, -2, -18.8006, -6.1284, -2, -19.594, -3.0797, -2, -16.9203, -21.0842, -5, -24.7434, -25, -5, -25.9979, -25, -5, -25, -21.0842, -5, -24.7434, -20.9537, -5, -25.7348, -25, -5, -25.9979, 0.9808, -5, -10, -0.406, -5, -13.8716, -1.1994, -5, -13.2628, 0.9808, -5, -10, 1.8468, -5, -10.5, -0.406, -5, -13.8716, -10, -2, -20.9808, -6.1284, -2, -19.594, -6.7372, -2, -18.8006, -10, -2, -20.9808, -9.5, -2, -21.8468, -6.1284, -2, -19.594, 4.7433, -2, 1.0842, 5.9979, -2, 5, 5, -2, 5, 4.7433, -2, 1.0842, 5.7348, -2, 0.9537, 5.9979, -2, 5, -1.1994, -5, -13.2628, -3.0797, -5, -16.9203, -3.7868, -5, -16.2132, -1.1994, -5, -13.2628, -0.406, -5, -13.8716, -3.0797, -5, -16.9203, -13.5195, -2, -22.7164, -9.5, -2, -21.8468, -10, -2, -20.9808, -13.5195, -2, -22.7164, -13.1368, -2, -23.6403, -9.5, -2, -21.8468, 3.9778, -2, -2.7646, 5.7348, -2, 0.9537, 4.7433, -2, 1.0842, 3.9778, -2, -2.7646, 4.9437, -2, -3.0234, 5.7348, -2, 0.9537, -25, -5, -25, -25, -2, -25.9979, -25, -2, -25, -25, -5, -25, -25, -5, -25.9979, -25, -2, -25.9979, -3.7868, -5, -16.2132, -6.1284, -5, -19.594, -6.7372, -5, -18.8006, -3.7868, -5, -16.2132, -3.0797, -5, -16.9203, -6.1284, -5, -19.594, -17.2354, -2, -23.9778, -13.1368, -2, -23.6403, -13.5195, -2, -22.7164, -17.2354, -2, -23.9778, -16.9766, -2, -24.9437, -13.1368, -2, -23.6403)
+
+[node name="large curved wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_k2b4a")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 4.5, 0)
+mesh = ExtResource("2_3bnhc")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 4.5, 0)
+shape = SubResource("ConcavePolygonShape3D_41m1v")
diff --git a/assets/blocks/walls/small_curved_wall.tscn b/assets/blocks/walls/small_curved_wall.tscn
new file mode 100644
index 0000000..79eba61
--- /dev/null
+++ b/assets/blocks/walls/small_curved_wall.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=4 format=3]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_58f2h"]
+[ext_resource type="ArrayMesh" uid="uid://cpisquk518aee" path="res://assets/meshes/walls/small_curved_wall.tres" id="2_jgrr8"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_n3qp6"]
+data = PackedVector3Array(-22.3895, -5, -14.8289, -19.8236, -2, -14.3185, -22.3895, -2, -14.8289, -22.3895, -5, -14.8289, -19.8236, -5, -14.3185, -19.8236, -2, -14.3185, -7.6795, -5, -5, -6.5224, -2, -2.6537, -7.6795, -2, -5, -7.6795, -5, -5, -6.5224, -5, -2.6537, -6.5224, -2, -2.6537, -17.3463, -5, -13.4776, -15, -2, -12.3205, -17.3463, -2, -13.4776, -17.3463, -5, -13.4776, -15, -5, -12.3205, -15, -2, -12.3205, -5.6815, -5, -0.1764, -5.1711, -2, 2.3895, -5.6815, -2, -0.1764, -5.6815, -5, -0.1764, -5.1711, -5, 2.3895, -5.1711, -2, 2.3895, -12.8248, -5, -10.8671, -10.8579, -2, -9.1421, -12.8248, -2, -10.8671, -12.8248, -5, -10.8671, -10.8579, -5, -9.1421, -10.8579, -2, -9.1421, -25, -5, -15, -22.3895, -2, -14.8289, -25, -2, -15, -25, -5, -15, -22.3895, -5, -14.8289, -22.3895, -2, -14.8289, -9.1329, -5, -7.1752, -7.6795, -2, -5, -9.1329, -2, -7.1752, -9.1329, -5, -7.1752, -7.6795, -5, -5, -7.6795, -2, -5, -19.8236, -5, -14.3185, -17.3463, -2, -13.4776, -19.8236, -2, -14.3185, -19.8236, -5, -14.3185, -17.3463, -5, -13.4776, -17.3463, -2, -13.4776, -6.5224, -5, -2.6537, -5.6815, -2, -0.1764, -6.5224, -2, -2.6537, -6.5224, -5, -2.6537, -5.6815, -5, -0.1764, -5.6815, -2, -0.1764, -15, -5, -12.3205, -12.8248, -2, -10.8671, -15, -2, -12.3205, -15, -5, -12.3205, -12.8248, -5, -10.8671, -12.8248, -2, -10.8671, -5.1711, -5, 2.3895, -5, -2, 5, -5.1711, -2, 2.3895, -5.1711, -5, 2.3895, -5, -5, 5, -5, -2, 5, -10.8579, -5, -9.1421, -9.1329, -2, -7.1752, -10.8579, -2, -9.1421, -10.8579, -5, -9.1421, -9.1329, -5, -7.1752, -9.1329, -2, -7.1752, -22.52, -5, -13.8375, -20.0824, -2, -13.3526, -20.0824, -5, -13.3526, -22.52, -5, -13.8375, -22.52, -2, -13.8375, -20.0824, -2, -13.3526, -8.5455, -5, -4.5, -7.4463, -2, -2.271, -7.4463, -5, -2.271, -8.5455, -5, -4.5, -8.5455, -2, -4.5, -7.4463, -2, -2.271, -17.729, -5, -12.5537, -15.5, -2, -11.4545, -15.5, -5, -11.4545, -17.729, -5, -12.5537, -17.729, -2, -12.5537, -15.5, -2, -11.4545, -6.6474, -5, 0.0824, -6.1625, -2, 2.52, -6.1625, -5, 2.52, -6.6474, -5, 0.0824, -6.6474, -2, 0.0824, -6.1625, -2, 2.52, -13.4335, -5, -10.0737, -11.565, -2, -8.435, -11.565, -5, -8.435, -13.4335, -5, -10.0737, -13.4335, -2, -10.0737, -11.565, -2, -8.435, -25, -5, -14.0021, -22.52, -2, -13.8375, -22.52, -5, -13.8375, -25, -5, -14.0021, -25, -2, -14.0021, -22.52, -2, -13.8375, -9.9263, -5, -6.5665, -8.5455, -2, -4.5, -8.5455, -5, -4.5, -9.9263, -5, -6.5665, -9.9263, -2, -6.5665, -8.5455, -2, -4.5, -20.0824, -5, -13.3526, -17.729, -2, -12.5537, -17.729, -5, -12.5537, -20.0824, -5, -13.3526, -20.0824, -2, -13.3526, -17.729, -2, -12.5537, -7.4463, -5, -2.271, -6.6474, -2, 0.0824, -6.6474, -5, 0.0824, -7.4463, -5, -2.271, -7.4463, -2, -2.271, -6.6474, -2, 0.0824, -15.5, -5, -11.4545, -13.4335, -2, -10.0737, -13.4335, -5, -10.0737, -15.5, -5, -11.4545, -15.5, -2, -11.4545, -13.4335, -2, -10.0737, -6.1625, -5, 2.52, -5.9979, -2, 5, -5.9979, -5, 5, -6.1625, -5, 2.52, -6.1625, -2, 2.52, -5.9979, -2, 5, -11.565, -5, -8.435, -9.9263, -2, -6.5665, -9.9263, -5, -6.5665, -11.565, -5, -8.435, -11.565, -2, -8.435, -9.9263, -2, -6.5665, -22.3895, -5, -14.8289, -20.0824, -5, -13.3526, -19.8236, -5, -14.3185, -22.3895, -5, -14.8289, -22.52, -5, -13.8375, -20.0824, -5, -13.3526, -7.6795, -5, -5, -7.4463, -5, -2.271, -6.5224, -5, -2.6537, -7.6795, -5, -5, -8.5455, -5, -4.5, -7.4463, -5, -2.271, -10.8579, -2, -9.1421, -13.4335, -2, -10.0737, -12.8248, -2, -10.8671, -10.8579, -2, -9.1421, -11.565, -2, -8.435, -13.4335, -2, -10.0737, -25, -5, -15, -22.52, -5, -13.8375, -22.3895, -5, -14.8289, -25, -5, -15, -25, -5, -14.0021, -22.52, -5, -13.8375, -25, -2, -15, -25, -5, -14.0021, -25, -5, -15, -25, -2, -15, -25, -2, -14.0021, -25, -5, -14.0021, -9.1329, -5, -7.1752, -8.5455, -5, -4.5, -7.6795, -5, -5, -9.1329, -5, -7.1752, -9.9263, -5, -6.5665, -8.5455, -5, -4.5, -12.8248, -2, -10.8671, -15.5, -2, -11.4545, -15, -2, -12.3205, -12.8248, -2, -10.8671, -13.4335, -2, -10.0737, -15.5, -2, -11.4545, -5, -2, 5, -6.1625, -2, 2.52, -5.1711, -2, 2.3895, -5, -2, 5, -5.9979, -2, 5, -6.1625, -2, 2.52, -10.8579, -5, -9.1421, -9.9263, -5, -6.5665, -9.1329, -5, -7.1752, -10.8579, -5, -9.1421, -11.565, -5, -8.435, -9.9263, -5, -6.5665, -15, -2, -12.3205, -17.729, -2, -12.5537, -17.3463, -2, -13.4776, -15, -2, -12.3205, -15.5, -2, -11.4545, -17.729, -2, -12.5537, -5, -5, 5, -5.9979, -2, 5, -5, -2, 5, -5, -5, 5, -5.9979, -5, 5, -5.9979, -2, 5, -5.1711, -2, 2.3895, -6.6474, -2, 0.0824, -5.6815, -2, -0.1764, -5.1711, -2, 2.3895, -6.1625, -2, 2.52, -6.6474, -2, 0.0824, -12.8248, -5, -10.8671, -11.565, -5, -8.435, -10.8579, -5, -9.1421, -12.8248, -5, -10.8671, -13.4335, -5, -10.0737, -11.565, -5, -8.435, -17.3463, -2, -13.4776, -20.0824, -2, -13.3526, -19.8236, -2, -14.3185, -17.3463, -2, -13.4776, -17.729, -2, -12.5537, -20.0824, -2, -13.3526, -5.6815, -2, -0.1764, -7.4463, -2, -2.271, -6.5224, -2, -2.6537, -5.6815, -2, -0.1764, -6.6474, -2, 0.0824, -7.4463, -2, -2.271, -15, -5, -12.3205, -13.4335, -5, -10.0737, -12.8248, -5, -10.8671, -15, -5, -12.3205, -15.5, -5, -11.4545, -13.4335, -5, -10.0737, -19.8236, -2, -14.3185, -22.52, -2, -13.8375, -22.3895, -2, -14.8289, -19.8236, -2, -14.3185, -20.0824, -2, -13.3526, -22.52, -2, -13.8375, -5.1711, -5, 2.3895, -5.9979, -5, 5, -5, -5, 5, -5.1711, -5, 2.3895, -6.1625, -5, 2.52, -5.9979, -5, 5, -6.5224, -2, -2.6537, -8.5455, -2, -4.5, -7.6795, -2, -5, -6.5224, -2, -2.6537, -7.4463, -2, -2.271, -8.5455, -2, -4.5, -17.3463, -5, -13.4776, -15.5, -5, -11.4545, -15, -5, -12.3205, -17.3463, -5, -13.4776, -17.729, -5, -12.5537, -15.5, -5, -11.4545, -22.3895, -2, -14.8289, -25, -2, -14.0021, -25, -2, -15, -22.3895, -2, -14.8289, -22.52, -2, -13.8375, -25, -2, -14.0021, -5.6815, -5, -0.1764, -6.1625, -5, 2.52, -5.1711, -5, 2.3895, -5.6815, -5, -0.1764, -6.6474, -5, 0.0824, -6.1625, -5, 2.52, -7.6795, -2, -5, -9.9263, -2, -6.5665, -9.1329, -2, -7.1752, -7.6795, -2, -5, -8.5455, -2, -4.5, -9.9263, -2, -6.5665, -19.8236, -5, -14.3185, -17.729, -5, -12.5537, -17.3463, -5, -13.4776, -19.8236, -5, -14.3185, -20.0824, -5, -13.3526, -17.729, -5, -12.5537, -6.5224, -5, -2.6537, -6.6474, -5, 0.0824, -5.6815, -5, -0.1764, -6.5224, -5, -2.6537, -7.4463, -5, -2.271, -6.6474, -5, 0.0824, -9.1329, -2, -7.1752, -11.565, -2, -8.435, -10.8579, -2, -9.1421, -9.1329, -2, -7.1752, -9.9263, -2, -6.5665, -11.565, -2, -8.435)
+
+[node name="flat_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_58f2h")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 4.5, 0)
+mesh = ExtResource("2_jgrr8")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 4.5, 0)
+shape = SubResource("ConcavePolygonShape3D_n3qp6")
diff --git a/assets/blocks/walls/small_curved_wall_inner.tscn b/assets/blocks/walls/small_curved_wall_inner.tscn
new file mode 100644
index 0000000..5723d86
--- /dev/null
+++ b/assets/blocks/walls/small_curved_wall_inner.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=4 format=3 uid="uid://clxoturhpmobw"]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_58f2h"]
+[ext_resource type="ArrayMesh" uid="uid://cwdxvx27qpdok" path="res://assets/meshes/walls/small_curved_wall_inner.tres" id="2_2wepk"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_11pkl"]
+data = PackedVector3Array(-7.2513, 2.5, -9.9671, -4.6854, -0.5, -9.4567, -7.2513, -0.5, -9.9671, -7.2513, 2.5, -9.9671, -4.6854, 2.5, -9.4567, -4.6854, -0.5, -9.4567, -9.8618, 2.5, -10.1382, -7.2513, -0.5, -9.9671, -9.8618, -0.5, -10.1382, -9.8618, 2.5, -10.1382, -7.2513, 2.5, -9.9671, -7.2513, -0.5, -9.9671, -4.6854, 2.5, -9.4567, -2.2081, -0.5, -8.6158, -4.6854, -0.5, -9.4567, -4.6854, 2.5, -9.4567, -2.2081, 2.5, -8.6158, -2.2081, -0.5, -8.6158, 0.1382, 2.5, -7.4587, 2.3134, -0.5, -6.0053, 0.1382, -0.5, -7.4587, 0.1382, 2.5, -7.4587, 2.3134, 2.5, -6.0053, 2.3134, -0.5, -6.0053, -2.2081, 2.5, -8.6158, 0.1382, -0.5, -7.4587, -2.2081, -0.5, -8.6158, -2.2081, 2.5, -8.6158, 0.1382, 2.5, -7.4587, 0.1382, -0.5, -7.4587, 2.3134, 2.5, -6.0053, 4.2803, -0.5, -4.2803, 2.3134, -0.5, -6.0053, 2.3134, 2.5, -6.0053, 4.2803, 2.5, -4.2803, 4.2803, -0.5, -4.2803, 6.0053, 2.5, -2.3134, 7.4587, -0.5, -0.1382, 6.0053, -0.5, -2.3134, 6.0053, 2.5, -2.3134, 7.4587, 2.5, -0.1382, 7.4587, -0.5, -0.1382, 4.2803, 2.5, -4.2803, 6.0053, -0.5, -2.3134, 4.2803, -0.5, -4.2803, 4.2803, 2.5, -4.2803, 6.0053, 2.5, -2.3134, 6.0053, -0.5, -2.3134, 7.4587, 2.5, -0.1382, 8.6158, -0.5, 2.2081, 7.4587, -0.5, -0.1382, 7.4587, 2.5, -0.1382, 8.6158, 2.5, 2.2081, 8.6158, -0.5, 2.2081, 9.4567, 2.5, 4.6854, 9.9671, -0.5, 7.2513, 9.4567, -0.5, 4.6854, 9.4567, 2.5, 4.6854, 9.9671, 2.5, 7.2513, 9.9671, -0.5, 7.2513, 8.6158, 2.5, 2.2081, 9.4567, -0.5, 4.6854, 8.6158, -0.5, 2.2081, 8.6158, 2.5, 2.2081, 9.4567, 2.5, 4.6854, 9.4567, -0.5, 4.6854, 9.9671, 2.5, 7.2513, 10.1382, -0.5, 9.8618, 9.9671, -0.5, 7.2513, 9.9671, 2.5, 7.2513, 10.1382, 2.5, 9.8618, 10.1382, -0.5, 9.8618, -7.1208, 2.5, -10.9585, -4.4266, -0.5, -10.4226, -4.4266, 2.5, -10.4226, -7.1208, 2.5, -10.9585, -7.1208, -0.5, -10.9585, -4.4266, -0.5, -10.4226, -9.8618, 2.5, -11.1382, -7.1208, -0.5, -10.9585, -7.1208, 2.5, -10.9585, -9.8618, 2.5, -11.1382, -9.8618, -0.5, -11.1382, -7.1208, -0.5, -10.9585, -4.4266, 2.5, -10.4226, -1.8255, -0.5, -9.5397, -1.8255, 2.5, -9.5397, -4.4266, 2.5, -10.4226, -4.4266, -0.5, -10.4226, -1.8255, -0.5, -9.5397, 0.6382, 2.5, -8.3247, 2.9222, -0.5, -6.7986, 2.9222, 2.5, -6.7986, 0.6382, 2.5, -8.3247, 0.6382, -0.5, -8.3247, 2.9222, -0.5, -6.7986, -1.8255, 2.5, -9.5397, 0.6382, -0.5, -8.3247, 0.6382, 2.5, -8.3247, -1.8255, 2.5, -9.5397, -1.8255, -0.5, -9.5397, 0.6382, -0.5, -8.3247, 2.9222, 2.5, -6.7986, 4.9874, -0.5, -4.9874, 4.9874, 2.5, -4.9874, 2.9222, 2.5, -6.7986, 2.9222, -0.5, -6.7986, 4.9874, -0.5, -4.9874, 6.7986, 2.5, -2.9222, 8.3247, -0.5, -0.6382, 8.3247, 2.5, -0.6382, 6.7986, 2.5, -2.9222, 6.7986, -0.5, -2.9222, 8.3247, -0.5, -0.6382, 4.9874, 2.5, -4.9874, 6.7986, -0.5, -2.9222, 6.7986, 2.5, -2.9222, 4.9874, 2.5, -4.9874, 4.9874, -0.5, -4.9874, 6.7986, -0.5, -2.9222, 8.3247, 2.5, -0.6382, 9.5397, -0.5, 1.8254, 9.5397, 2.5, 1.8254, 8.3247, 2.5, -0.6382, 8.3247, -0.5, -0.6382, 9.5397, -0.5, 1.8254, 10.4226, 2.5, 4.4266, 10.9585, -0.5, 7.1207, 10.9585, 2.5, 7.1207, 10.4226, 2.5, 4.4266, 10.4226, -0.5, 4.4266, 10.9585, -0.5, 7.1207, 9.5397, 2.5, 1.8254, 10.4226, -0.5, 4.4266, 10.4226, 2.5, 4.4266, 9.5397, 2.5, 1.8254, 9.5397, -0.5, 1.8254, 10.4226, -0.5, 4.4266, 10.9585, 2.5, 7.1207, 11.1382, -0.5, 9.8618, 11.1382, 2.5, 9.8618, 10.9585, 2.5, 7.1207, 10.9585, -0.5, 7.1207, 11.1382, -0.5, 9.8618, 0.1382, 2.5, -7.4587, 2.9222, 2.5, -6.7986, 2.3134, 2.5, -6.0053, 0.1382, 2.5, -7.4587, 0.6382, 2.5, -8.3247, 2.9222, 2.5, -6.7986, 8.6158, 2.5, 2.2081, 10.4226, 2.5, 4.4266, 9.4567, 2.5, 4.6854, 8.6158, 2.5, 2.2081, 9.5397, 2.5, 1.8254, 10.4226, 2.5, 4.4266, -4.6854, 2.5, -9.4567, -1.8255, 2.5, -9.5397, -2.2081, 2.5, -8.6158, -4.6854, 2.5, -9.4567, -4.4266, 2.5, -10.4226, -1.8255, 2.5, -9.5397, 7.4587, -0.5, -0.1382, 6.7986, -0.5, -2.9222, 6.0053, -0.5, -2.3134, 7.4587, -0.5, -0.1382, 8.3247, -0.5, -0.6382, 6.7986, -0.5, -2.9222, -2.2081, -0.5, -8.6158, -4.4266, -0.5, -10.4226, -4.6854, -0.5, -9.4567, -2.2081, -0.5, -8.6158, -1.8255, -0.5, -9.5397, -4.4266, -0.5, -10.4226, 6.0053, 2.5, -2.3134, 8.3247, 2.5, -0.6382, 7.4587, 2.5, -0.1382, 6.0053, 2.5, -2.3134, 6.7986, 2.5, -2.9222, 8.3247, 2.5, -0.6382, -9.8618, 2.5, -10.1382, -7.1208, 2.5, -10.9585, -7.2513, 2.5, -9.9671, -9.8618, 2.5, -10.1382, -9.8618, 2.5, -11.1382, -7.1208, 2.5, -10.9585, 2.3134, 2.5, -6.0053, 4.9874, 2.5, -4.9874, 4.2803, 2.5, -4.2803, 2.3134, 2.5, -6.0053, 2.9222, 2.5, -6.7986, 4.9874, 2.5, -4.9874, 9.9671, -0.5, 7.2513, 10.4226, -0.5, 4.4266, 9.4567, -0.5, 4.6854, 9.9671, -0.5, 7.2513, 10.9585, -0.5, 7.1207, 10.4226, -0.5, 4.4266, -7.2513, -0.5, -9.9671, -9.8618, -0.5, -11.1382, -9.8618, -0.5, -10.1382, -7.2513, -0.5, -9.9671, -7.1208, -0.5, -10.9585, -9.8618, -0.5, -11.1382, 4.2803, -0.5, -4.2803, 2.9222, -0.5, -6.7986, 2.3134, -0.5, -6.0053, 4.2803, -0.5, -4.2803, 4.9874, -0.5, -4.9874, 2.9222, -0.5, -6.7986, 9.4567, 2.5, 4.6854, 10.9585, 2.5, 7.1207, 9.9671, 2.5, 7.2513, 9.4567, 2.5, 4.6854, 10.4226, 2.5, 4.4266, 10.9585, 2.5, 7.1207, -2.2081, 2.5, -8.6158, 0.6382, 2.5, -8.3247, 0.1382, 2.5, -7.4587, -2.2081, 2.5, -8.6158, -1.8255, 2.5, -9.5397, 0.6382, 2.5, -8.3247, 7.4587, 2.5, -0.1382, 9.5397, 2.5, 1.8254, 8.6158, 2.5, 2.2081, 7.4587, 2.5, -0.1382, 8.3247, 2.5, -0.6382, 9.5397, 2.5, 1.8254, 10.1382, 2.5, 9.8618, 11.1382, -0.5, 9.8618, 10.1382, -0.5, 9.8618, 10.1382, 2.5, 9.8618, 11.1382, 2.5, 9.8618, 11.1382, -0.5, 9.8618, 0.1382, -0.5, -7.4587, -1.8255, -0.5, -9.5397, -2.2081, -0.5, -8.6158, 0.1382, -0.5, -7.4587, 0.6382, -0.5, -8.3247, -1.8255, -0.5, -9.5397, 8.6158, -0.5, 2.2081, 8.3247, -0.5, -0.6382, 7.4587, -0.5, -0.1382, 8.6158, -0.5, 2.2081, 9.5397, -0.5, 1.8254, 8.3247, -0.5, -0.6382, -4.6854, -0.5, -9.4567, -7.1208, -0.5, -10.9585, -7.2513, -0.5, -9.9671, -4.6854, -0.5, -9.4567, -4.4266, -0.5, -10.4226, -7.1208, -0.5, -10.9585, 4.2803, 2.5, -4.2803, 6.7986, 2.5, -2.9222, 6.0053, 2.5, -2.3134, 4.2803, 2.5, -4.2803, 4.9874, 2.5, -4.9874, 6.7986, 2.5, -2.9222, 9.9671, 2.5, 7.2513, 11.1382, 2.5, 9.8618, 10.1382, 2.5, 9.8618, 9.9671, 2.5, 7.2513, 10.9585, 2.5, 7.1207, 11.1382, 2.5, 9.8618, -7.2513, 2.5, -9.9671, -4.4266, 2.5, -10.4226, -4.6854, 2.5, -9.4567, -7.2513, 2.5, -9.9671, -7.1208, 2.5, -10.9585, -4.4266, 2.5, -10.4226, 6.0053, -0.5, -2.3134, 4.9874, -0.5, -4.9874, 4.2803, -0.5, -4.2803, 6.0053, -0.5, -2.3134, 6.7986, -0.5, -2.9222, 4.9874, -0.5, -4.9874, 10.1382, -0.5, 9.8618, 10.9585, -0.5, 7.1207, 9.9671, -0.5, 7.2513, 10.1382, -0.5, 9.8618, 11.1382, -0.5, 9.8618, 10.9585, -0.5, 7.1207, 2.3134, -0.5, -6.0053, 0.6382, -0.5, -8.3247, 0.1382, -0.5, -7.4587, 2.3134, -0.5, -6.0053, 2.9222, -0.5, -6.7986, 0.6382, -0.5, -8.3247, 9.4567, -0.5, 4.6854, 9.5397, -0.5, 1.8254, 8.6158, -0.5, 2.2081, 9.4567, -0.5, 4.6854, 10.4226, -0.5, 4.4266, 9.5397, -0.5, 1.8254, -9.8618, -0.5, -10.1382, -9.8618, 2.5, -11.1382, -9.8618, 2.5, -10.1382, -9.8618, -0.5, -10.1382, -9.8618, -0.5, -11.1382, -9.8618, 2.5, -11.1382)
+
+[node name="flat_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_58f2h")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.0613899, 0, 0.122786)
+mesh = ExtResource("2_2wepk")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+shape = SubResource("ConcavePolygonShape3D_11pkl")
diff --git a/assets/blocks/walls/tall_corner_diagonal_wall.tscn b/assets/blocks/walls/tall_corner_diagonal_wall.tscn
new file mode 100644
index 0000000..0ac1a00
--- /dev/null
+++ b/assets/blocks/walls/tall_corner_diagonal_wall.tscn
@@ -0,0 +1,22 @@
+[gd_scene load_steps=4 format=3 uid="uid://cvagg3inem8cy"]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_q6ubx"]
+[ext_resource type="ArrayMesh" uid="uid://c4d2oixq5f5uq" path="res://assets/meshes/walls/tall_corner_diagonal_wall.tres" id="2_jshw1"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_ud3fk"]
+points = PackedVector3Array(-5.00071, -0.5, -5, -5.00071, 2.4998, -5, 5, -0.5, 4.99966, -5.70711, -0.5, -4.2936, -5.70711, 2.4998, -4.2936, 5, 5, 4.99966, 4.29255, -0.5, 5.70711, 4.29255, 5, 5.70711)
+
+[node name="tall_corner_diagonal_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_q6ubx")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+editor_description = "cant use boxmesh cuz uvs wierd"
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+mesh = ExtResource("2_jshw1")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+shape = SubResource("ConvexPolygonShape3D_ud3fk")
diff --git a/assets/blocks/walls/tall_diagonal_wall.tscn b/assets/blocks/walls/tall_diagonal_wall.tscn
new file mode 100644
index 0000000..361e522
--- /dev/null
+++ b/assets/blocks/walls/tall_diagonal_wall.tscn
@@ -0,0 +1,22 @@
+[gd_scene load_steps=4 format=3]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_sidsm"]
+[ext_resource type="ArrayMesh" uid="uid://pe8b3dso12w3" path="res://assets/meshes/walls/tall_diagonal_wall.tres" id="2_xt8ec"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_s8eep"]
+points = PackedVector3Array(5, 7.5, 6, 5, 7.5, 5, -5, 2.5, 6, 5, -0.5, 6, 5, -0.5, 5, -5, 2.5, 5, -5, -0.5, 6, -5, -0.5, 5)
+
+[node name="tall_diagonal_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_sidsm")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
+mesh = ExtResource("2_xt8ec")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
+visible = false
+shape = SubResource("ConvexPolygonShape3D_s8eep")
diff --git a/assets/blocks/walls/tall_wall.tscn b/assets/blocks/walls/tall_wall.tscn
new file mode 100644
index 0000000..615a879
--- /dev/null
+++ b/assets/blocks/walls/tall_wall.tscn
@@ -0,0 +1,22 @@
+[gd_scene load_steps=4 format=3 uid="uid://8mjs78vkeleb"]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_xbiyt"]
+[ext_resource type="ArrayMesh" uid="uid://dfs62b7cohday" path="res://assets/meshes/walls/tall_wall.tres" id="2_kc1g3"]
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_n6nfl"]
+size = Vector3(10, 5.5, 1)
+
+[node name="flat_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_xbiyt")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+editor_description = "cant use boxmesh cuz uvs wierd"
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+mesh = ExtResource("2_kc1g3")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.25, -5.5)
+shape = SubResource("BoxShape3D_n6nfl")
diff --git a/assets/blocks/walls/turn_wall.tscn b/assets/blocks/walls/turn_wall.tscn
new file mode 100644
index 0000000..5fe5598
--- /dev/null
+++ b/assets/blocks/walls/turn_wall.tscn
@@ -0,0 +1,20 @@
+[gd_scene load_steps=4 format=3 uid="uid://bfe6ps3cjf37j"]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_o1ifj"]
+[ext_resource type="ArrayMesh" uid="uid://d27ytirksdd4d" path="res://assets/meshes/walls/turn_wall.tres" id="2_xc7vs"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_ahxbf"]
+data = PackedVector3Array(1.4789, -0.5, -3.1402, 1, -0.5, -4.6603, 0.5, -0.5, -3.7942, 1.4789, -0.5, -3.1402, 2.0876, -0.5, -3.9335, 1, -0.5, -4.6603, 4.923, -0.5, 2.8253, 5, 2.4, 4, 5, -0.5, 4, 4.923, -0.5, 2.8253, 4.923, 2.3, 2.8253, 5, 2.4, 4, -5, -0.5, -5, -5, 2.5, -6, -5, 2.5, -5, -5, -0.5, -5, -5, -0.5, -6, -5, 2.5, -6, 0.5, 2, -3.7942, 2.0876, 2.5, -3.9335, 1.4789, 1.9, -3.1402, 0.5, 2, -3.7942, 1, 2.5, -4.6603, 2.0876, 2.5, -3.9335, -2.8253, -0.5, -4.923, -3.9673, -0.5, -5.9995, -4, -0.5, -5, -2.8253, -0.5, -4.923, -2.6947, -0.5, -5.9144, -3.9673, -0.5, -5.9995, 4.6933, -0.5, 1.6706, 5.2388, -0.5, 0.1732, 4.3149, -0.5, 0.5558, 4.6933, -0.5, 1.6706, 5.6593, -0.5, 1.4118, 5.2388, -0.5, 0.1732, -4, 2.4, -5, -2.6947, 2.5, -5.9144, -2.8253, 2.3, -4.923, -4, 2.4, -5, -3.9673, 2.5, -5.9995, -2.6947, 2.5, -5.9144, 4.3149, 2.1, 0.5558, 5.6593, 2.5, 1.4118, 4.6933, 2.2, 1.6706, 4.3149, 2.1, 0.5558, 5.2388, 2.5, 0.1732, 5.6593, 2.5, 1.4118, 2.364, -0.5, -2.364, 2.0876, -0.5, -3.9335, 1.4789, -0.5, -3.1402, 2.364, -0.5, -2.364, 3.0711, -0.5, -3.0711, 2.0876, -0.5, -3.9335, 1.4789, 1.9, -3.1402, 3.0711, 2.5, -3.0711, 2.364, 1.9, -2.364, 1.4789, 1.9, -3.1402, 2.0876, 2.5, -3.9335, 3.0711, 2.5, -3.0711, -1.6706, -0.5, -4.6933, -2.6947, -0.5, -5.9144, -2.8253, -0.5, -4.923, -1.6706, -0.5, -4.6933, -1.4118, -0.5, -5.6593, -2.6947, -0.5, -5.9144, 4.923, -0.5, 2.8253, 5.6593, -0.5, 1.4118, 4.6933, -0.5, 1.6706, 4.923, -0.5, 2.8253, 5.9144, -0.5, 2.6947, 5.6593, -0.5, 1.4118, -2.8253, 2.3, -4.923, -1.4118, 2.5, -5.6593, -1.6706, 2.2, -4.6933, -2.8253, 2.3, -4.923, -2.6947, 2.5, -5.9144, -1.4118, 2.5, -5.6593, 4.6933, 2.2, 1.6706, 5.9144, 2.5, 2.6947, 4.923, 2.3, 2.8253, 4.6933, 2.2, 1.6706, 5.6593, 2.5, 1.4118, 5.9144, 2.5, 2.6947, 3.1402, -0.5, -1.4789, 3.0711, -0.5, -3.0711, 2.364, -0.5, -2.364, 3.1402, -0.5, -1.4789, 3.9335, -0.5, -2.0876, 3.0711, -0.5, -3.0711, 5.9995, -0.5, 3.9673, 6, 2.5, 5, 5.9995, 2.5, 3.9673, 5.9995, -0.5, 3.9673, 6, -0.5, 5, 6, 2.5, 5, -5, -0.5, -6, -3.9673, 2.5, -5.9995, -5, 2.5, -6, -5, -0.5, -6, -3.9673, -0.5, -5.9995, -3.9673, 2.5, -5.9995, 5.9995, 2.5, 3.9673, 5.9144, -0.5, 2.6947, 5.9995, -0.5, 3.9673, 5.9995, 2.5, 3.9673, 5.9144, 2.5, 2.6947, 5.9144, -0.5, 2.6947, 5.9144, 2.5, 2.6947, 5.6593, -0.5, 1.4118, 5.9144, -0.5, 2.6947, 5.9144, 2.5, 2.6947, 5.6593, 2.5, 1.4118, 5.6593, -0.5, 1.4118, 5.6593, 2.5, 1.4118, 5.2388, -0.5, 0.1732, 5.6593, -0.5, 1.4118, 5.6593, 2.5, 1.4118, 5.2388, 2.5, 0.1732, 5.2388, -0.5, 0.1732, 5.2388, 2.5, 0.1732, 4.6603, -0.5, -1, 5.2388, -0.5, 0.1732, 5.2388, 2.5, 0.1732, 4.6603, 2.5, -1, 4.6603, -0.5, -1, 4.6603, 2.5, -1, 3.9335, -0.5, -2.0876, 4.6603, -0.5, -1, 4.6603, 2.5, -1, 3.9335, 2.5, -2.0876, 3.9335, -0.5, -2.0876, 3.9335, 2.5, -2.0876, 3.0711, -0.5, -3.0711, 3.9335, -0.5, -2.0876, 3.9335, 2.5, -2.0876, 3.0711, 2.5, -3.0711, 3.0711, -0.5, -3.0711, 3.0711, 2.5, -3.0711, 2.0876, -0.5, -3.9335, 3.0711, -0.5, -3.0711, 3.0711, 2.5, -3.0711, 2.0876, 2.5, -3.9335, 2.0876, -0.5, -3.9335, 2.0876, 2.5, -3.9335, 1, -0.5, -4.6603, 2.0876, -0.5, -3.9335, 2.0876, 2.5, -3.9335, 1, 2.5, -4.6603, 1, -0.5, -4.6603, 1, 2.5, -4.6603, -0.1732, -0.5, -5.2388, 1, -0.5, -4.6603, 1, 2.5, -4.6603, -0.1732, 2.5, -5.2388, -0.1732, -0.5, -5.2388, -0.1732, 2.5, -5.2388, -1.4118, -0.5, -5.6593, -0.1732, -0.5, -5.2388, -0.1732, 2.5, -5.2388, -1.4118, 2.5, -5.6593, -1.4118, -0.5, -5.6593, -1.4118, 2.5, -5.6593, -2.6947, -0.5, -5.9144, -1.4118, -0.5, -5.6593, -1.4118, 2.5, -5.6593, -2.6947, 2.5, -5.9144, -2.6947, -0.5, -5.9144, -2.6947, 2.5, -5.9144, -3.9673, -0.5, -5.9995, -2.6947, -0.5, -5.9144, -2.6947, 2.5, -5.9144, -3.9673, 2.5, -5.9995, -3.9673, -0.5, -5.9995, 3.7942, 2, -0.5, 5.2388, 2.5, 0.1732, 4.3149, 2.1, 0.5558, 3.7942, 2, -0.5, 4.6603, 2.5, -1, 5.2388, 2.5, 0.1732, -4, -0.5, -5, -5, -0.5, -6, -5, -0.5, -5, -4, -0.5, -5, -3.9673, -0.5, -5.9995, -5, -0.5, -6, 5, 2.5, 5, 6, -0.5, 5, 5, -0.5, 5, 5, 2.5, 5, 6, 2.5, 5, 6, -0.5, 5, 4.3149, -0.5, 0.5558, 4.6603, -0.5, -1, 3.7942, -0.5, -0.5, 4.3149, -0.5, 0.5558, 5.2388, -0.5, 0.1732, 4.6603, -0.5, -1, 5, -0.5, 5, 5.9995, -0.5, 3.9673, 5, -0.5, 4, 5, -0.5, 5, 6, -0.5, 5, 5.9995, -0.5, 3.9673, -0.5558, 2.1, -4.3149, 1, 2.5, -4.6603, 0.5, 2, -3.7942, -0.5558, 2.1, -4.3149, -0.1732, 2.5, -5.2388, 1, 2.5, -4.6603, -5, 2.5, -5, -3.9673, 2.5, -5.9995, -4, 2.4, -5, -5, 2.5, -5, -5, 2.5, -6, -3.9673, 2.5, -5.9995, 0.5, -0.5, -3.7942, -0.1732, -0.5, -5.2388, -0.5558, -0.5, -4.3149, 0.5, -0.5, -3.7942, 1, -0.5, -4.6603, -0.1732, -0.5, -5.2388, 3.1402, 1.9, -1.4789, 4.6603, 2.5, -1, 3.7942, 2, -0.5, 3.1402, 1.9, -1.4789, 3.9335, 2.5, -2.0876, 4.6603, 2.5, -1, 5, 2.4, 4, 6, 2.5, 5, 5, 2.5, 5, 5, 2.4, 4, 5.9995, 2.5, 3.9673, 6, 2.5, 5, 4.923, 2.3, 2.8253, 5.9995, 2.5, 3.9673, 5, 2.4, 4, 4.923, 2.3, 2.8253, 5.9144, 2.5, 2.6947, 5.9995, 2.5, 3.9673, 3.7942, -0.5, -0.5, 3.9335, -0.5, -2.0876, 3.1402, -0.5, -1.4789, 3.7942, -0.5, -0.5, 4.6603, -0.5, -1, 3.9335, -0.5, -2.0876, -1.6706, 2.2, -4.6933, -0.1732, 2.5, -5.2388, -0.5558, 2.1, -4.3149, -1.6706, 2.2, -4.6933, -1.4118, 2.5, -5.6593, -0.1732, 2.5, -5.2388, 5, -0.5, 4, 5.9144, -0.5, 2.6947, 4.923, -0.5, 2.8253, 5, -0.5, 4, 5.9995, -0.5, 3.9673, 5.9144, -0.5, 2.6947, -0.5558, -0.5, -4.3149, -1.4118, -0.5, -5.6593, -1.6706, -0.5, -4.6933, -0.5558, -0.5, -4.3149, -0.1732, -0.5, -5.2388, -1.4118, -0.5, -5.6593, 2.364, 1.9, -2.364, 3.9335, 2.5, -2.0876, 3.1402, 1.9, -1.4789, 2.364, 1.9, -2.364, 3.0711, 2.5, -3.0711, 3.9335, 2.5, -2.0876, -2.8253, -0.5, -4.923, -1.6706, 2.2, -4.6933, -1.6706, -0.5, -4.6933, -2.8253, -0.5, -4.923, -2.8253, 2.3, -4.923, -1.6706, 2.2, -4.6933, -1.6706, -0.5, -4.6933, -0.5558, 2.1, -4.3149, -0.5558, -0.5, -4.3149, -1.6706, -0.5, -4.6933, -1.6706, 2.2, -4.6933, -0.5558, 2.1, -4.3149, -0.5558, -0.5, -4.3149, 0.5, 2, -3.7942, 0.5, -0.5, -3.7942, -0.5558, -0.5, -4.3149, -0.5558, 2.1, -4.3149, 0.5, 2, -3.7942, 0.5, -0.5, -3.7942, 1.4789, 1.9, -3.1402, 1.4789, -0.5, -3.1402, 0.5, -0.5, -3.7942, 0.5, 2, -3.7942, 1.4789, 1.9, -3.1402, 1.4789, -0.5, -3.1402, 2.364, 1.9, -2.364, 2.364, -0.5, -2.364, 1.4789, -0.5, -3.1402, 1.4789, 1.9, -3.1402, 2.364, 1.9, -2.364, 2.364, -0.5, -2.364, 3.1402, 1.9, -1.4789, 3.1402, -0.5, -1.4789, 2.364, -0.5, -2.364, 2.364, 1.9, -2.364, 3.1402, 1.9, -1.4789, 3.1402, -0.5, -1.4789, 3.7942, 2, -0.5, 3.7942, -0.5, -0.5, 3.1402, -0.5, -1.4789, 3.1402, 1.9, -1.4789, 3.7942, 2, -0.5, 3.7942, -0.5, -0.5, 4.3149, 2.1, 0.5558, 4.3149, -0.5, 0.5558, 3.7942, -0.5, -0.5, 3.7942, 2, -0.5, 4.3149, 2.1, 0.5558, 4.3149, -0.5, 0.5558, 4.6933, 2.2, 1.6706, 4.6933, -0.5, 1.6706, 4.3149, -0.5, 0.5558, 4.3149, 2.1, 0.5558, 4.6933, 2.2, 1.6706, 4.6933, -0.5, 1.6706, 4.923, 2.3, 2.8253, 4.923, -0.5, 2.8253, 4.6933, -0.5, 1.6706, 4.6933, 2.2, 1.6706, 4.923, 2.3, 2.8253, 5, 2.4, 4, 5, -0.5, 5, 5, -0.5, 4, 5, 2.4, 4, 5, 2.5, 5, 5, -0.5, 5, -4, -0.5, -5, -2.8253, 2.3, -4.923, -2.8253, -0.5, -4.923, -4, -0.5, -5, -4, 2.4, -5, -2.8253, 2.3, -4.923, -5, -0.5, -5, -4, 2.4, -5, -4, -0.5, -5, -5, -0.5, -5, -5, 2.5, -5, -4, 2.4, -5)
+
+[node name="turn_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_o1ifj")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+mesh = ExtResource("2_xc7vs")
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
+visible = false
+shape = SubResource("ConcavePolygonShape3D_ahxbf")
diff --git a/assets/blocks/walls/turn_wall_inner.tscn b/assets/blocks/walls/turn_wall_inner.tscn
new file mode 100644
index 0000000..cf3f19a
--- /dev/null
+++ b/assets/blocks/walls/turn_wall_inner.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=4 format=3 uid="uid://bm34lkdsai4fq"]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_41e1s"]
+[ext_resource type="ArrayMesh" uid="uid://bx645tiy0eiik" path="res://assets/meshes/walls/turn_wall_inner.tres" id="2_a5kcq"]
+
+[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_uwi24"]
+data = PackedVector3Array(-9.8618, -0.5, -0.1382, -8.5565, 2.5, -0.0526, -9.8618, 2.5, -0.1382, -9.8618, -0.5, -0.1382, -8.5565, -0.5, -0.0526, -8.5565, 2.5, -0.0526, -7.2736, -0.5, 0.2025, -6.035, 2.5, 0.623, -7.2736, 2.5, 0.2025, -7.2736, -0.5, 0.2025, -6.035, -0.5, 0.623, -6.035, 2.5, 0.623, -8.5565, -0.5, -0.0526, -7.2736, 2.5, 0.2025, -8.5565, 2.5, -0.0526, -8.5565, -0.5, -0.0526, -7.2736, -0.5, 0.2025, -7.2736, 2.5, 0.2025, -6.035, -0.5, 0.623, -4.8618, 2.5, 1.2015, -6.035, 2.5, 0.623, -6.035, -0.5, 0.623, -4.8618, -0.5, 1.2015, -4.8618, 2.5, 1.2015, -4.8618, -0.5, 1.2015, -3.7742, 2.5, 1.9283, -4.8618, 2.5, 1.2015, -4.8618, -0.5, 1.2015, -3.7742, -0.5, 1.9283, -3.7742, 2.5, 1.9283, -3.7742, -0.5, 1.9283, -2.7907, 2.5, 2.7907, -3.7742, 2.5, 1.9283, -3.7742, -0.5, 1.9283, -2.7907, -0.5, 2.7907, -2.7907, 2.5, 2.7907, -2.7907, -0.5, 2.7907, -1.9283, 2.5, 3.7742, -2.7907, 2.5, 2.7907, -2.7907, -0.5, 2.7907, -1.9283, -0.5, 3.7742, -1.9283, 2.5, 3.7742, -1.9283, -0.5, 3.7742, -1.2015, 2.5, 4.8618, -1.9283, 2.5, 3.7742, -1.9283, -0.5, 3.7742, -1.2015, -0.5, 4.8618, -1.2015, 2.5, 4.8618, -1.2015, -0.5, 4.8618, -0.623, 2.5, 6.035, -1.2015, 2.5, 4.8618, -1.2015, -0.5, 4.8618, -0.623, -0.5, 6.035, -0.623, 2.5, 6.035, -0.623, -0.5, 6.035, -0.2025, 2.5, 7.2736, -0.623, 2.5, 6.035, -0.623, -0.5, 6.035, -0.2025, -0.5, 7.2736, -0.2025, 2.5, 7.2736, -0.2025, -0.5, 7.2736, 0.0526, 2.5, 8.5565, -0.2025, 2.5, 7.2736, -0.2025, -0.5, 7.2736, 0.0526, -0.5, 8.5565, 0.0526, 2.5, 8.5565, 0.0526, -0.5, 8.5565, 0.1382, 2.5, 9.8618, 0.0526, 2.5, 8.5565, 0.0526, -0.5, 8.5565, 0.1382, -0.5, 9.8618, 0.1382, 2.5, 9.8618, -9.8618, -0.5, 0.8618, -8.6871, 2.5, 0.9388, -8.6871, -0.5, 0.9388, -9.8618, -0.5, 0.8618, -9.8618, 2.5, 0.8618, -8.6871, 2.5, 0.9388, -7.5324, -0.5, 1.1685, -6.4177, 2.5, 1.5469, -6.4177, -0.5, 1.5469, -7.5324, -0.5, 1.1685, -7.5324, 2.5, 1.1685, -6.4177, 2.5, 1.5469, -8.6871, -0.5, 0.9388, -7.5324, 2.5, 1.1685, -7.5324, -0.5, 1.1685, -8.6871, -0.5, 0.9388, -8.6871, 2.5, 0.9388, -7.5324, 2.5, 1.1685, -6.4177, -0.5, 1.5469, -5.3618, 2.5, 2.0676, -5.3618, -0.5, 2.0676, -6.4177, -0.5, 1.5469, -6.4177, 2.5, 1.5469, -5.3618, 2.5, 2.0676, -5.3618, -0.5, 2.0676, -4.3829, 2.5, 2.7216, -4.3829, -0.5, 2.7216, -5.3618, -0.5, 2.0676, -5.3618, 2.5, 2.0676, -4.3829, 2.5, 2.7216, -4.3829, -0.5, 2.7216, -3.4978, 2.5, 3.4978, -3.4978, -0.5, 3.4978, -4.3829, -0.5, 2.7216, -4.3829, 2.5, 2.7216, -3.4978, 2.5, 3.4978, -3.4978, -0.5, 3.4978, -2.7216, 2.5, 4.3829, -2.7216, -0.5, 4.3829, -3.4978, -0.5, 3.4978, -3.4978, 2.5, 3.4978, -2.7216, 2.5, 4.3829, -2.7216, -0.5, 4.3829, -2.0676, 2.5, 5.3618, -2.0676, -0.5, 5.3618, -2.7216, -0.5, 4.3829, -2.7216, 2.5, 4.3829, -2.0676, 2.5, 5.3618, -2.0676, -0.5, 5.3618, -1.5469, 2.5, 6.4176, -1.5469, -0.5, 6.4176, -2.0676, -0.5, 5.3618, -2.0676, 2.5, 5.3618, -1.5469, 2.5, 6.4176, -1.5469, -0.5, 6.4176, -1.1685, 2.5, 7.5324, -1.1685, -0.5, 7.5324, -1.5469, -0.5, 6.4176, -1.5469, 2.5, 6.4176, -1.1685, 2.5, 7.5324, -1.1685, -0.5, 7.5324, -0.9388, 2.5, 8.6871, -0.9388, -0.5, 8.6871, -1.1685, -0.5, 7.5324, -1.1685, 2.5, 7.5324, -0.9388, 2.5, 8.6871, -0.9388, -0.5, 8.6871, -0.8618, 2.5, 9.8618, -0.8618, -0.5, 9.8618, -0.9388, -0.5, 8.6871, -0.9388, 2.5, 8.6871, -0.8618, 2.5, 9.8618, -8.5565, -0.5, -0.0526, -7.5324, -0.5, 1.1685, -7.2736, -0.5, 0.2025, -8.5565, -0.5, -0.0526, -8.6871, -0.5, 0.9388, -7.5324, -0.5, 1.1685, -2.7907, -0.5, 2.7907, -2.7216, -0.5, 4.3829, -1.9283, -0.5, 3.7742, -2.7907, -0.5, 2.7907, -3.4978, -0.5, 3.4978, -2.7216, -0.5, 4.3829, 0.0526, -0.5, 8.5565, -0.8618, -0.5, 9.8618, 0.1382, -0.5, 9.8618, 0.0526, -0.5, 8.5565, -0.9388, -0.5, 8.6871, -0.8618, -0.5, 9.8618, -3.7742, 2.5, 1.9283, -5.3618, 2.5, 2.0676, -4.8618, 2.5, 1.2015, -3.7742, 2.5, 1.9283, -4.3829, 2.5, 2.7216, -5.3618, 2.5, 2.0676, -0.623, -0.5, 6.035, -1.1685, -0.5, 7.5324, -0.2025, -0.5, 7.2736, -0.623, -0.5, 6.035, -1.5469, -0.5, 6.4176, -1.1685, -0.5, 7.5324, -9.8618, 2.5, -0.1382, -9.8618, -0.5, 0.8618, -9.8618, -0.5, -0.1382, -9.8618, 2.5, -0.1382, -9.8618, 2.5, 0.8618, -9.8618, -0.5, 0.8618, -4.8618, -0.5, 1.2015, -4.3829, -0.5, 2.7216, -3.7742, -0.5, 1.9283, -4.8618, -0.5, 1.2015, -5.3618, -0.5, 2.0676, -4.3829, -0.5, 2.7216, -0.2025, 2.5, 7.2736, -1.5469, 2.5, 6.4176, -0.623, 2.5, 6.035, -0.2025, 2.5, 7.2736, -1.1685, 2.5, 7.5324, -1.5469, 2.5, 6.4176, -6.035, 2.5, 0.623, -7.5324, 2.5, 1.1685, -7.2736, 2.5, 0.2025, -6.035, 2.5, 0.623, -6.4177, 2.5, 1.5469, -7.5324, 2.5, 1.1685, -1.2015, 2.5, 4.8618, -2.7216, 2.5, 4.3829, -1.9283, 2.5, 3.7742, -1.2015, 2.5, 4.8618, -2.0676, 2.5, 5.3618, -2.7216, 2.5, 4.3829, -7.2736, -0.5, 0.2025, -6.4177, -0.5, 1.5469, -6.035, -0.5, 0.623, -7.2736, -0.5, 0.2025, -7.5324, -0.5, 1.1685, -6.4177, -0.5, 1.5469, -1.9283, -0.5, 3.7742, -2.0676, -0.5, 5.3618, -1.2015, -0.5, 4.8618, -1.9283, -0.5, 3.7742, -2.7216, -0.5, 4.3829, -2.0676, -0.5, 5.3618, -8.5565, 2.5, -0.0526, -9.8618, 2.5, 0.8618, -9.8618, 2.5, -0.1382, -8.5565, 2.5, -0.0526, -8.6871, 2.5, 0.9388, -9.8618, 2.5, 0.8618, -2.7907, 2.5, 2.7907, -4.3829, 2.5, 2.7216, -3.7742, 2.5, 1.9283, -2.7907, 2.5, 2.7907, -3.4978, 2.5, 3.4978, -4.3829, 2.5, 2.7216, 0.0526, 2.5, 8.5565, -1.1685, 2.5, 7.5324, -0.2025, 2.5, 7.2736, 0.0526, 2.5, 8.5565, -0.9388, 2.5, 8.6871, -1.1685, 2.5, 7.5324, -9.8618, -0.5, -0.1382, -8.6871, -0.5, 0.9388, -8.5565, -0.5, -0.0526, -9.8618, -0.5, -0.1382, -9.8618, -0.5, 0.8618, -8.6871, -0.5, 0.9388, -3.7742, -0.5, 1.9283, -3.4978, -0.5, 3.4978, -2.7907, -0.5, 2.7907, -3.7742, -0.5, 1.9283, -4.3829, -0.5, 2.7216, -3.4978, -0.5, 3.4978, -0.2025, -0.5, 7.2736, -0.9388, -0.5, 8.6871, 0.0526, -0.5, 8.5565, -0.2025, -0.5, 7.2736, -1.1685, -0.5, 7.5324, -0.9388, -0.5, 8.6871, -4.8618, 2.5, 1.2015, -6.4177, 2.5, 1.5469, -6.035, 2.5, 0.623, -4.8618, 2.5, 1.2015, -5.3618, 2.5, 2.0676, -6.4177, 2.5, 1.5469, -0.623, 2.5, 6.035, -2.0676, 2.5, 5.3618, -1.2015, 2.5, 4.8618, -0.623, 2.5, 6.035, -1.5469, 2.5, 6.4176, -2.0676, 2.5, 5.3618, 0.1382, -0.5, 9.8618, -0.8618, 2.5, 9.8618, 0.1382, 2.5, 9.8618, 0.1382, -0.5, 9.8618, -0.8618, -0.5, 9.8618, -0.8618, 2.5, 9.8618, -6.035, -0.5, 0.623, -5.3618, -0.5, 2.0676, -4.8618, -0.5, 1.2015, -6.035, -0.5, 0.623, -6.4177, -0.5, 1.5469, -5.3618, -0.5, 2.0676, -1.2015, -0.5, 4.8618, -1.5469, -0.5, 6.4176, -0.623, -0.5, 6.035, -1.2015, -0.5, 4.8618, -2.0676, -0.5, 5.3618, -1.5469, -0.5, 6.4176, -7.2736, 2.5, 0.2025, -8.6871, 2.5, 0.9388, -8.5565, 2.5, -0.0526, -7.2736, 2.5, 0.2025, -7.5324, 2.5, 1.1685, -8.6871, 2.5, 0.9388, -1.9283, 2.5, 3.7742, -3.4978, 2.5, 3.4978, -2.7907, 2.5, 2.7907, -1.9283, 2.5, 3.7742, -2.7216, 2.5, 4.3829, -3.4978, 2.5, 3.4978, 0.1382, 2.5, 9.8618, -0.9388, 2.5, 8.6871, 0.0526, 2.5, 8.5565, 0.1382, 2.5, 9.8618, -0.8618, 2.5, 9.8618, -0.9388, 2.5, 8.6871)
+
+[node name="turn_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_41e1s")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.173262, 0, 0.138609)
+mesh = ExtResource("2_a5kcq")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.173262, 0, 0.138609)
+shape = SubResource("ConcavePolygonShape3D_uwi24")
diff --git a/assets/blocks/walls/x_wall.tscn b/assets/blocks/walls/x_wall.tscn
new file mode 100644
index 0000000..a1865c1
--- /dev/null
+++ b/assets/blocks/walls/x_wall.tscn
@@ -0,0 +1,22 @@
+[gd_scene load_steps=4 format=3 uid="uid://bxodo0cs3ewce"]
+
+[ext_resource type="Script" path="res://classes/wall.gd" id="1_iglgm"]
+[ext_resource type="ArrayMesh" uid="uid://b7vu2ekwlvagf" path="res://assets/meshes/walls/x_wall.tres" id="2_rjvwv"]
+
+[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_vv844"]
+points = PackedVector3Array(4.99985, -0.5, -5, 6, -0.5, -5, 3.5, -0.5, 0, 4.99985, 2.5, -5, 6, 2.5, -5, 6, -0.5, 5, 4.99985, -0.5, 5, 3.5, 2.5, 0, 6, 2.5, 5, 4.99985, 2.5, 5)
+
+[node name="x_wall" type="StaticBody3D" node_paths=PackedStringArray("mesh")]
+collision_mask = 0
+input_ray_pickable = false
+script = ExtResource("1_iglgm")
+mesh = NodePath("mesh")
+
+[node name="mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+mesh = ExtResource("2_rjvwv")
+
+[node name="collision" type="CollisionShape3D" parent="."]
+editor_description = "this collision is inaccurate but should be fine"
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
+shape = SubResource("ConvexPolygonShape3D_vv844")
diff --git a/assets/cars/cruella/cruella.blend b/assets/cars/cruella/cruella.blend
index 19497b7..c9bc00f 100644
--- a/assets/cars/cruella/cruella.blend
+++ b/assets/cars/cruella/cruella.blend
Binary files differ
diff --git a/assets/cars/engine.gd b/assets/cars/engine.gd
index 911965e..09d1fe8 100644
--- a/assets/cars/engine.gd
+++ b/assets/cars/engine.gd
@@ -1,16 +1,24 @@
-extends EngineNoise
+extends AudioStreamPlayer3D
+class_name EngineNoise
-@onready var car = get_parent().get_parent();
-@onready var player: AudioStreamPlayer3D = get_parent();
+@onready var strem: EngineStream = stream
+@onready var car = get_parent()
+var volume: float = 1: set = set_v, get = get_v
func _ready() -> void:
set_process(false)
for i in 4:
await RenderingServer.frame_post_draw # buffer underrun causes it to stop, and the cpu is busy when loading the track and rendering and stuff. https://github.com/godotengine/godot/pull/73162
- player.play()
- set_stream(player.get_stream_playback())
+ play()
+ strem.set_stream(get_stream_playback())
set_process(true)
func _process(_d: float):
- set_rpm(car.engine_rpm)
- update()
+ strem.engine_rpm = car.engine_rpm
+ strem.update()
+
+func set_v(v: float) -> void:
+ strem.engine_volume = v
+
+func get_v() -> float:
+ return strem.engine_volume
diff --git a/assets/cars/engine.tscn b/assets/cars/engine.tscn
index 598833b..6135ed0 100644
--- a/assets/cars/engine.tscn
+++ b/assets/cars/engine.tscn
@@ -1,27 +1,12 @@
-[gd_scene load_steps=4 format=3 uid="uid://ceocarryg6o86"]
+[gd_scene load_steps=3 format=3 uid="uid://ceocarryg6o86"]
[ext_resource type="Script" path="res://assets/cars/engine.gd" id="1_12n5h"]
-[sub_resource type="AudioStreamGenerator" id="AudioStreamGenerator_qo6ul"]
-mix_rate = 30000.0
-buffer_length = 0.2
-
-[sub_resource type="GDScript" id="GDScript_dvwcc"]
-resource_name = "engine_inbetween"
-script/source = "extends AudioStreamPlayer3D
-
-@onready var gen: EngineNoise = $generator
-
-@onready var volume: float: # not decibels
- set(v):
- volume = v
- gen.set_volume(v)
-"
+[sub_resource type="EngineStream" id="EngineStream_8vj1r"]
+mix_rate = 20000.0
+buffer_length = 0.1
[node name="Engine" type="AudioStreamPlayer3D"]
-stream = SubResource("AudioStreamGenerator_qo6ul")
+stream = SubResource("EngineStream_8vj1r")
doppler_tracking = 2
-script = SubResource("GDScript_dvwcc")
-
-[node name="generator" type="EngineNoise" parent="."]
script = ExtResource("1_12n5h")
diff --git a/assets/cars/kenney_sedan/ghost.tscn b/assets/cars/kenney_sedan/ghost.tscn
index da6f59f..a217e57 100644
--- a/assets/cars/kenney_sedan/ghost.tscn
+++ b/assets/cars/kenney_sedan/ghost.tscn
@@ -381,4 +381,7 @@ skeleton = NodePath("")
[node name="particles" parent="fr" instance=ExtResource("4_4uffx")]
transform = Transform3D(2.33967, 0, 0, 0, 2.33967, 0, 0, 0, 2.33967, 0.7019, 0.7019, -1.54418)
+[node name="Camera3D" type="Camera3D" parent="."]
+transform = Transform3D(0.34778, -0.676755, 0.648885, 0, 0.692088, 0.721814, -0.937576, -0.251032, 0.240694, 2.04217, 2.1612, 3.66584)
+
[node name="Engine" parent="." instance=ExtResource("4_ku3bs")]
diff --git a/assets/cars/kenney_sedan/sedan.tscn b/assets/cars/kenney_sedan/sedan.tscn
index e24be28..b897942 100644
--- a/assets/cars/kenney_sedan/sedan.tscn
+++ b/assets/cars/kenney_sedan/sedan.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=23 format=3 uid="uid://c157wew5y33bo"]
+[gd_scene load_steps=24 format=3 uid="uid://c157wew5y33bo"]
[ext_resource type="Script" path="res://classes/car.gd" id="1_pdccm"]
[ext_resource type="Material" uid="uid://b6d4vebgc2y88" path="res://assets/cars/kenney_sedan/red_paint.tres" id="2_luxc5"]
@@ -10,7 +10,7 @@
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_hs0do"]
friction = 0.7
-bounce = 0.7
+bounce = 0.09
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_8bpd4"]
resource_name = "plastic"
@@ -323,16 +323,24 @@ _surfaces = [{
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_8qmjc")
-[sub_resource type="BoxShape3D" id="BoxShape3D_cknfd"]
-size = Vector3(2.9, 2.1, 5.5)
+[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_uyq1o"]
+radius = 0.845291
+height = 5.12084
+
+[sub_resource type="BoxShape3D" id="BoxShape3D_mkjgy"]
+size = Vector3(2.353, 3.44463, 1)
[node name="Sedan" type="VehicleBody3D"]
collision_layer = 2
collision_mask = 3
mass = 1000.0
center_of_mass_mode = 1
+center_of_mass = Vector3(0, 0.3, 0)
physics_material_override = SubResource("PhysicsMaterial_hs0do")
gravity_scale = 3.0
+continuous_cd = true
+max_contacts_reported = 4
+contact_monitor = true
can_sleep = false
script = ExtResource("1_pdccm")
@@ -352,7 +360,6 @@ use_as_traction = true
wheel_radius = 0.7
wheel_rest_length = 0.4
wheel_friction_slip = 1.8
-suspension_travel = 0.2
suspension_stiffness = 50.0
suspension_max_force = 18000.0
damping_compression = 0.8
@@ -372,7 +379,6 @@ use_as_traction = true
wheel_radius = 0.7
wheel_rest_length = 0.4
wheel_friction_slip = 1.8
-suspension_travel = 0.2
suspension_stiffness = 50.0
suspension_max_force = 18000.0
damping_compression = 0.8
@@ -394,7 +400,6 @@ use_as_steering = true
wheel_radius = 0.7
wheel_rest_length = 0.4
wheel_friction_slip = 2.0
-suspension_travel = 0.2
suspension_stiffness = 50.0
suspension_max_force = 18000.0
damping_compression = 0.8
@@ -413,7 +418,6 @@ use_as_steering = true
wheel_radius = 0.7
wheel_rest_length = 0.4
wheel_friction_slip = 2.0
-suspension_travel = 0.2
suspension_stiffness = 50.0
suspension_max_force = 18000.0
damping_compression = 0.8
@@ -426,10 +430,6 @@ skeleton = NodePath("")
[node name="particles" parent="fr" instance=ExtResource("4_axi2x")]
-[node name="Coll" type="CollisionShape3D" parent="."]
-transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.48339, 0)
-shape = SubResource("BoxShape3D_cknfd")
-
[node name="Engine" parent="." instance=ExtResource("4_gseqg")]
[node name="Gearbox" type="Node3D" parent="."]
@@ -443,4 +443,12 @@ volume_db = -25.0
stream = ExtResource("19_stkh0")
volume_db = -10.0
+[node name="coll1" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 1.25229, 0)
+shape = SubResource("CapsuleShape3D_uyq1o")
+
+[node name="coll2" type="CollisionShape3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 2.01516, 0.558206)
+shape = SubResource("BoxShape3D_mkjgy")
+
[connection signal="shifted" from="." to="Gearbox" method="_on_sedan_shifted"]
diff --git a/assets/cars/sparks.gd b/assets/cars/sparks.gd
new file mode 100644
index 0000000..f25dde3
--- /dev/null
+++ b/assets/cars/sparks.gd
@@ -0,0 +1,4 @@
+extends GPUParticles3D
+
+func _ready() -> void:
+ get_tree().create_timer(lifetime+.5).timeout.connect(queue_free)
diff --git a/assets/cars/sparks.tscn b/assets/cars/sparks.tscn
new file mode 100644
index 0000000..164c09a
--- /dev/null
+++ b/assets/cars/sparks.tscn
@@ -0,0 +1,39 @@
+[gd_scene load_steps=5 format=3 uid="uid://bg1gm56iyns8a"]
+
+[ext_resource type="Script" path="res://assets/cars/sparks.gd" id="1_34m1u"]
+
+[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_7tl5g"]
+spread = 10.0
+flatness = 0.15
+gravity = Vector3(0, -0.5, 0)
+initial_velocity_min = 0.5
+initial_velocity_max = 20.0
+linear_accel_min = 0.01
+linear_accel_max = 4.09
+scale_min = 0.5
+scale_max = 1.5
+hue_variation_min = 0.59
+hue_variation_max = 0.59
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0lec5"]
+shading_mode = 0
+albedo_color = Color(1, 0.784314, 0.231373, 1)
+
+[sub_resource type="CylinderMesh" id="CylinderMesh_tbgsw"]
+material = SubResource("StandardMaterial3D_0lec5")
+top_radius = 0.02
+bottom_radius = 0.02
+height = 0.04
+radial_segments = 8
+
+[node name="crash" type="GPUParticles3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.98517, 2.26511, 0)
+emitting = false
+amount = 10
+lifetime = 2.0
+one_shot = true
+explosiveness = 1.0
+randomness = 0.1
+process_material = SubResource("ParticleProcessMaterial_7tl5g")
+draw_pass_1 = SubResource("CylinderMesh_tbgsw")
+script = ExtResource("1_34m1u")
diff --git a/assets/mats/grass.tres b/assets/mats/grass.tres
index 0e63a35..965836a 100644
--- a/assets/mats/grass.tres
+++ b/assets/mats/grass.tres
@@ -7,5 +7,5 @@ albedo_texture = ExtResource("1_2pspn")
emission = Color(0, 0.0745098, 0.219608, 1)
emission_energy_multiplier = 16.0
ao_light_affect = 0.33
-uv1_scale = Vector3(100, 100, 100)
+uv1_scale = Vector3(5, 5, 5)
texture_filter = 0
diff --git a/assets/mats/grass_highlight.tres b/assets/mats/grass_highlight.tres
new file mode 100644
index 0000000..f853942
--- /dev/null
+++ b/assets/mats/grass_highlight.tres
@@ -0,0 +1,12 @@
+[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://bh4mpm1s6ngh2"]
+
+[ext_resource type="Texture2D" uid="uid://dyk71hogwv01g" path="res://assets/textures/grass.png" id="1_o8n4b"]
+
+[resource]
+albedo_color = Color(1.5, 1.5, 1.5, 1)
+albedo_texture = ExtResource("1_o8n4b")
+emission = Color(0, 0.0745098, 0.219608, 1)
+emission_energy_multiplier = 16.0
+ao_light_affect = 0.33
+uv1_scale = Vector3(100, 100, 100)
+texture_filter = 0
diff --git a/assets/mats/outline.tres b/assets/mats/outline.tres
index e516864..fa483df 100644
--- a/assets/mats/outline.tres
+++ b/assets/mats/outline.tres
@@ -6,4 +6,4 @@ shading_mode = 0
albedo_color = Color(0, 0, 0, 1)
disable_receive_shadows = true
grow = true
-grow_amount = 2.0
+grow_amount = 1.0
diff --git a/assets/mats/outline_highlight.tres b/assets/mats/outline_highlight.tres
new file mode 100644
index 0000000..52dd325
--- /dev/null
+++ b/assets/mats/outline_highlight.tres
@@ -0,0 +1,9 @@
+[gd_resource type="StandardMaterial3D" format=3 uid="uid://t7fn8554gl6p"]
+
+[resource]
+cull_mode = 1
+shading_mode = 0
+albedo_color = Color(0.92549, 0.886275, 0, 1)
+disable_receive_shadows = true
+grow = true
+grow_amount = 1.0
diff --git a/assets/mats/platform.material b/assets/mats/platform.material
new file mode 100644
index 0000000..20ebb99
--- /dev/null
+++ b/assets/mats/platform.material
Binary files differ
diff --git a/assets/mats/platform_highlight.material b/assets/mats/platform_highlight.material
new file mode 100644
index 0000000..bdafbba
--- /dev/null
+++ b/assets/mats/platform_highlight.material
Binary files differ
diff --git a/assets/mats/ring_checkpoint_highlight.tres b/assets/mats/ring_checkpoint_highlight.tres
new file mode 100644
index 0000000..9027acf
--- /dev/null
+++ b/assets/mats/ring_checkpoint_highlight.tres
@@ -0,0 +1,12 @@
+[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://dnbtk72slm1xd"]
+
+[ext_resource type="Texture2D" uid="uid://bvpakhb1dybl1" path="res://assets/textures/checkpoint.png" id="1_aitu8"]
+[ext_resource type="Material" uid="uid://t7fn8554gl6p" path="res://assets/mats/outline_highlight.tres" id="2_njx8e"]
+
+[resource]
+next_pass = ExtResource("2_njx8e")
+albedo_color = Color(1.5, 1.5, 1.5, 1)
+albedo_texture = ExtResource("1_aitu8")
+metallic_specular = 0.0
+uv1_scale = Vector3(8, 8, 8)
+texture_filter = 0
diff --git a/assets/mats/ring_finish_highlight.tres b/assets/mats/ring_finish_highlight.tres
new file mode 100644
index 0000000..9100c30
--- /dev/null
+++ b/assets/mats/ring_finish_highlight.tres
@@ -0,0 +1,12 @@
+[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://djl4cvi3wxk1y"]
+
+[ext_resource type="Texture2D" uid="uid://c4e2s06xl4u0x" path="res://assets/textures/finish.png" id="1_jl8u5"]
+[ext_resource type="Material" uid="uid://t7fn8554gl6p" path="res://assets/mats/outline_highlight.tres" id="2_pm0cf"]
+
+[resource]
+next_pass = ExtResource("2_pm0cf")
+albedo_color = Color(1.5, 1.5, 1.5, 1)
+albedo_texture = ExtResource("1_jl8u5")
+metallic_specular = 0.0
+uv1_scale = Vector3(8, 8, 8)
+texture_filter = 0
diff --git a/assets/mats/ring_start_highlight.tres b/assets/mats/ring_start_highlight.tres
new file mode 100644
index 0000000..ff76201
--- /dev/null
+++ b/assets/mats/ring_start_highlight.tres
@@ -0,0 +1,12 @@
+[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://bv86ngwyxh7jf"]
+
+[ext_resource type="Texture2D" uid="uid://bt35gqul2twf6" path="res://assets/textures/start.png" id="1_cn0cg"]
+[ext_resource type="Material" uid="uid://t7fn8554gl6p" path="res://assets/mats/outline_highlight.tres" id="2_wwty5"]
+
+[resource]
+next_pass = ExtResource("2_wwty5")
+albedo_color = Color(1.5, 1.5, 1.5, 1)
+albedo_texture = ExtResource("1_cn0cg")
+metallic_specular = 0.0
+uv1_scale = Vector3(8, 8, 8)
+texture_filter = 0
diff --git a/assets/mats/road.tres b/assets/mats/road.tres
index 85db5d5..662ece1 100644
--- a/assets/mats/road.tres
+++ b/assets/mats/road.tres
@@ -5,5 +5,5 @@
[resource]
albedo_texture = ExtResource("1_hqst8")
metallic_specular = 0.0
-uv1_scale = Vector3(8, 8, 8)
+uv1_scale = Vector3(2, 2, 2)
texture_filter = 0
diff --git a/assets/mats/road_highlight.tres b/assets/mats/road_highlight.tres
new file mode 100644
index 0000000..95a94e1
--- /dev/null
+++ b/assets/mats/road_highlight.tres
@@ -0,0 +1,10 @@
+[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://cgahye6xlgwga"]
+
+[ext_resource type="Texture2D" uid="uid://2fjjxft1ip57" path="res://assets/textures/road.png" id="1_k1hyl"]
+
+[resource]
+albedo_color = Color(1.5, 1.5, 1.5, 1)
+albedo_texture = ExtResource("1_k1hyl")
+metallic_specular = 0.0
+uv1_scale = Vector3(8, 8, 8)
+texture_filter = 0
diff --git a/assets/mats/shader_sky.tres b/assets/mats/shader_sky.tres
index 67e4b53..4526979 100644
--- a/assets/mats/shader_sky.tres
+++ b/assets/mats/shader_sky.tres
@@ -62,9 +62,9 @@ shader_parameter/cloud_noise1 = SubResource("NoiseTexture_uhc2h")
shader_parameter/cloud_noise2 = SubResource("NoiseTexture_vkbkn")
shader_parameter/day_bottom_color = Color(0.4, 1, 1, 1)
shader_parameter/day_top_color = Color(0, 0.8, 1, 1)
-shader_parameter/offset_horizon = 0.4
+shader_parameter/offset_horizon = 0.236
shader_parameter/horizon_intensity = -0.443
-shader_parameter/sun_set = Color(0.56, 0.24, 0, 1)
+shader_parameter/sun_set = Color(0.87451, 0.388235, 0, 1)
shader_parameter/horizon_color_day = Color(0.57, 0.53, 0.26, 1)
shader_parameter/horizon_color_night = Color(0.09, 0.16, 0.04, 1)
shader_parameter/moon_color = Color(1, 1, 1, 1)
@@ -73,18 +73,18 @@ shader_parameter/moon_crescent = -0.085
shader_parameter/dark_falloff = 3.915
shader_parameter/night_bottom_color = Color(0, 0, 0.2, 1)
shader_parameter/night_top_color = Color(0, 0, 0, 1)
-shader_parameter/stars_speed = 0.02
-shader_parameter/stars_cutoff = 0.744
+shader_parameter/stars_speed = 0.01
+shader_parameter/stars_cutoff = 0.69
shader_parameter/stars_sky_color = Color(0, 0.11, 0.05, 1)
shader_parameter/offset_stars = 0.015
-shader_parameter/stars_intensity = -2.998
-shader_parameter/star_falloff = 1.485
+shader_parameter/stars_intensity = -2.829
+shader_parameter/star_falloff = 1.0
shader_parameter/stars_fade_modulation = 0.91
shader_parameter/stars_texture = SubResource("NoiseTexture_d3r0e")
shader_parameter/base_noise = ExtResource("2_mnx47")
shader_parameter/sun_color = Color(1, 1, 1, 1)
-shader_parameter/sun_radius = 0.4
+shader_parameter/sun_radius = 0.3
shader_parameter/flat_sun = true
shader_parameter/enable_horizon_fade = true
shader_parameter/horizon_fade_size = 0.2
-shader_parameter/horizon_fade_blend = 0.2
+shader_parameter/horizon_fade_blend = 0.1
diff --git a/assets/mats/wall.tres b/assets/mats/wall.tres
index 5074300..4e33966 100644
--- a/assets/mats/wall.tres
+++ b/assets/mats/wall.tres
@@ -1,8 +1,8 @@
-[gd_resource type="StandardMaterial3D" load_steps=2 format=3]
+[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dd3673p284fqe"]
[ext_resource type="Texture2D" uid="uid://b1re5kwpgdg07" path="res://assets/textures/wall.png" id="1_0m2od"]
[resource]
albedo_texture = ExtResource("1_0m2od")
-uv1_scale = Vector3(0.2, 0.2, 0.2)
+uv1_scale = Vector3(16, 16, 16)
texture_filter = 0
diff --git a/assets/mats/wall_highlight.tres b/assets/mats/wall_highlight.tres
new file mode 100644
index 0000000..2adbe2a
--- /dev/null
+++ b/assets/mats/wall_highlight.tres
@@ -0,0 +1,9 @@
+[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://swcqd28aeu4n"]
+
+[ext_resource type="Texture2D" uid="uid://b1re5kwpgdg07" path="res://assets/textures/wall.png" id="1_s407v"]
+
+[resource]
+albedo_color = Color(1.5, 1.5, 1.5, 1)
+albedo_texture = ExtResource("1_s407v")
+uv1_scale = Vector3(16, 16, 16)
+texture_filter = 0
diff --git a/assets/meshes/checkpoint.tres b/assets/meshes/checkpoint.tres
index b065f89..891be0f 100644
--- a/assets/meshes/checkpoint.tres
+++ b/assets/meshes/checkpoint.tres
@@ -4,7 +4,7 @@
[resource]
material = ExtResource("1_64nbs")
-inner_radius = 25.0
-outer_radius = 40.0
+inner_radius = 12.0
+outer_radius = 17.0
rings = 32
ring_segments = 16
diff --git a/assets/meshes/platforms/corner.mesh b/assets/meshes/platforms/corner.mesh
new file mode 100644
index 0000000..04a5839
--- /dev/null
+++ b/assets/meshes/platforms/corner.mesh
Binary files differ
diff --git a/assets/meshes/platforms/depression.tres b/assets/meshes/platforms/depression.tres
new file mode 100644
index 0000000..a54bce1
--- /dev/null
+++ b/assets/meshes/platforms/depression.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://d07uut724gmam"]
+
+[ext_resource type="Material" uid="uid://cwyjtikumcq3k" path="res://assets/mats/platform.material" id="1_lp6gg"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_q85ss"]
+_surfaces = [{
+"aabb": AABB(-5, -3, -5, 10, 3.5, 10),
+"format": 4097,
+"index_count": 288,
+"index_data": PackedByteArray(8, 0, 3, 0, 13, 0, 8, 0, 2, 0, 3, 0, 20, 0, 7, 0, 25, 0, 20, 0, 6, 0, 7, 0, 14, 0, 5, 0, 19, 0, 14, 0, 4, 0, 5, 0, 26, 0, 1, 0, 31, 0, 26, 0, 0, 0, 1, 0, 47, 0, 4, 0, 14, 0, 47, 0, 28, 0, 4, 0, 38, 0, 1, 0, 11, 0, 38, 0, 31, 0, 1, 0, 23, 0, 13, 0, 3, 0, 23, 0, 32, 0, 13, 0, 32, 0, 12, 0, 13, 0, 32, 0, 35, 0, 12, 0, 35, 0, 11, 0, 12, 0, 35, 0, 38, 0, 11, 0, 20, 0, 16, 0, 6, 0, 20, 0, 41, 0, 16, 0, 41, 0, 15, 0, 16, 0, 41, 0, 44, 0, 15, 0, 44, 0, 14, 0, 15, 0, 44, 0, 47, 0, 14, 0, 6, 0, 17, 0, 7, 0, 6, 0, 16, 0, 17, 0, 16, 0, 18, 0, 17, 0, 16, 0, 15, 0, 18, 0, 15, 0, 19, 0, 18, 0, 15, 0, 14, 0, 19, 0, 0, 0, 11, 0, 1, 0, 0, 0, 10, 0, 11, 0, 10, 0, 12, 0, 11, 0, 10, 0, 9, 0, 12, 0, 9, 0, 13, 0, 12, 0, 9, 0, 8, 0, 13, 0, 9, 0, 49, 0, 46, 0, 9, 0, 10, 0, 49, 0, 46, 0, 48, 0, 45, 0, 46, 0, 49, 0, 48, 0, 45, 0, 47, 0, 44, 0, 45, 0, 48, 0, 47, 0, 8, 0, 46, 0, 43, 0, 8, 0, 9, 0, 46, 0, 43, 0, 45, 0, 42, 0, 43, 0, 46, 0, 45, 0, 42, 0, 44, 0, 41, 0, 42, 0, 45, 0, 44, 0, 2, 0, 43, 0, 22, 0, 2, 0, 8, 0, 43, 0, 22, 0, 42, 0, 21, 0, 22, 0, 43, 0, 42, 0, 21, 0, 41, 0, 20, 0, 21, 0, 42, 0, 41, 0, 18, 0, 40, 0, 37, 0, 18, 0, 19, 0, 40, 0, 37, 0, 39, 0, 36, 0, 37, 0, 40, 0, 39, 0, 36, 0, 38, 0, 35, 0, 36, 0, 39, 0, 38, 0, 17, 0, 37, 0, 34, 0, 17, 0, 18, 0, 37, 0, 34, 0, 36, 0, 33, 0, 34, 0, 37, 0, 36, 0, 33, 0, 35, 0, 32, 0, 33, 0, 36, 0, 35, 0, 7, 0, 34, 0, 25, 0, 7, 0, 17, 0, 34, 0, 25, 0, 33, 0, 24, 0, 25, 0, 34, 0, 33, 0, 24, 0, 32, 0, 23, 0, 24, 0, 33, 0, 32, 0, 19, 0, 29, 0, 40, 0, 19, 0, 5, 0, 29, 0, 40, 0, 30, 0, 39, 0, 40, 0, 29, 0, 30, 0, 39, 0, 31, 0, 38, 0, 39, 0, 30, 0, 31, 0, 10, 0, 26, 0, 49, 0, 10, 0, 0, 0, 26, 0, 49, 0, 27, 0, 48, 0, 49, 0, 26, 0, 27, 0, 48, 0, 28, 0, 47, 0, 48, 0, 27, 0, 28, 0, 4, 0, 29, 0, 5, 0, 4, 0, 28, 0, 29, 0, 28, 0, 30, 0, 29, 0, 28, 0, 27, 0, 30, 0, 27, 0, 31, 0, 30, 0, 27, 0, 26, 0, 31, 0, 2, 0, 23, 0, 3, 0, 2, 0, 22, 0, 23, 0, 22, 0, 24, 0, 23, 0, 22, 0, 21, 0, 24, 0, 21, 0, 25, 0, 24, 0, 21, 0, 20, 0, 25, 0),
+"lods": [0.230532, PackedByteArray(10, 0, 3, 0, 13, 0, 10, 0, 2, 0, 3, 0, 0, 0, 10, 0, 13, 0, 0, 0, 13, 0, 1, 0, 20, 0, 7, 0, 23, 0, 20, 0, 6, 0, 7, 0, 2, 0, 20, 0, 23, 0, 2, 0, 23, 0, 3, 0, 14, 0, 5, 0, 18, 0, 14, 0, 4, 0, 5, 0, 6, 0, 14, 0, 18, 0, 6, 0, 18, 0, 7, 0, 26, 0, 1, 0, 31, 0, 26, 0, 0, 0, 1, 0, 4, 0, 26, 0, 31, 0, 4, 0, 31, 0, 5, 0, 14, 0, 26, 0, 4, 0, 10, 0, 26, 0, 14, 0, 10, 0, 0, 0, 26, 0, 20, 0, 10, 0, 14, 0, 2, 0, 10, 0, 20, 0, 20, 0, 14, 0, 6, 0, 31, 0, 1, 0, 13, 0, 18, 0, 31, 0, 13, 0, 18, 0, 5, 0, 31, 0, 23, 0, 18, 0, 13, 0, 7, 0, 18, 0, 23, 0, 23, 0, 13, 0, 3, 0), 0.246172, PackedByteArray(8, 0, 3, 0, 13, 0, 8, 0, 2, 0, 3, 0, 10, 0, 8, 0, 13, 0, 10, 0, 13, 0, 12, 0, 10, 0, 12, 0, 11, 0, 0, 0, 10, 0, 11, 0, 0, 0, 11, 0, 1, 0, 20, 0, 7, 0, 25, 0, 20, 0, 6, 0, 7, 0, 21, 0, 20, 0, 25, 0, 21, 0, 25, 0, 24, 0, 22, 0, 21, 0, 24, 0, 22, 0, 24, 0, 23, 0, 2, 0, 22, 0, 23, 0, 2, 0, 23, 0, 3, 0, 14, 0, 5, 0, 19, 0, 14, 0, 4, 0, 5, 0, 15, 0, 14, 0, 19, 0, 15, 0, 19, 0, 18, 0, 16, 0, 15, 0, 18, 0, 6, 0, 16, 0, 18, 0, 6, 0, 18, 0, 7, 0, 26, 0, 1, 0, 31, 0, 26, 0, 0, 0, 1, 0, 27, 0, 26, 0, 31, 0, 27, 0, 31, 0, 30, 0, 28, 0, 27, 0, 30, 0, 28, 0, 30, 0, 29, 0, 4, 0, 28, 0, 29, 0, 4, 0, 29, 0, 5, 0, 14, 0, 28, 0, 4, 0, 10, 0, 28, 0, 14, 0, 10, 0, 27, 0, 28, 0, 10, 0, 26, 0, 27, 0, 10, 0, 0, 0, 26, 0, 22, 0, 10, 0, 14, 0, 8, 0, 10, 0, 22, 0, 2, 0, 8, 0, 22, 0, 22, 0, 14, 0, 20, 0, 21, 0, 22, 0, 20, 0, 20, 0, 14, 0, 15, 0, 20, 0, 15, 0, 16, 0, 20, 0, 16, 0, 6, 0, 31, 0, 1, 0, 11, 0, 13, 0, 31, 0, 11, 0, 13, 0, 11, 0, 12, 0, 25, 0, 31, 0, 13, 0, 24, 0, 25, 0, 13, 0, 24, 0, 13, 0, 23, 0, 23, 0, 13, 0, 3, 0, 18, 0, 31, 0, 25, 0, 7, 0, 18, 0, 25, 0, 18, 0, 30, 0, 31, 0, 18, 0, 29, 0, 30, 0, 19, 0, 29, 0, 18, 0, 19, 0, 5, 0, 29, 0)],
+"primitive": 3,
+"vertex_count": 50,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 192, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 0, 128, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 0, 128, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 192, 0, 0, 160, 64, 0, 0, 24, 192, 0, 0, 32, 64, 0, 0, 160, 64, 0, 0, 224, 191, 0, 0, 0, 128, 0, 0, 160, 64, 0, 0, 144, 191, 0, 0, 32, 192, 0, 0, 160, 64, 0, 0, 0, 190, 0, 0, 32, 192, 0, 0, 160, 64, 0, 0, 64, 191, 0, 0, 0, 128, 0, 0, 160, 64, 0, 0, 176, 191, 0, 0, 32, 64, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 32, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 32, 192, 0, 0, 144, 191, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 224, 191, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 24, 192, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 176, 191, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 64, 191, 0, 0, 160, 64, 0, 0, 32, 192, 0, 0, 0, 190, 0, 0, 160, 64, 0, 0, 32, 192, 0, 0, 176, 62, 0, 0, 32, 192, 0, 0, 0, 0, 0, 0, 64, 62, 0, 0, 32, 192, 0, 0, 32, 64, 0, 0, 0, 61, 0, 0, 32, 192, 0, 0, 32, 192, 0, 0, 64, 62, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 128, 0, 0, 32, 64, 0, 0, 224, 190, 0, 0, 0, 128, 0, 0, 32, 192, 0, 0, 0, 61, 0, 0, 32, 64, 0, 0, 0, 0, 0, 0, 224, 190, 0, 0, 32, 64, 0, 0, 32, 64, 0, 0, 104, 191, 0, 0, 32, 64, 0, 0, 32, 64, 0, 0, 120, 191, 0, 0, 32, 192, 0, 0, 0, 0, 0, 0, 80, 191, 0, 0, 32, 192, 0, 0, 32, 192, 0, 0, 40, 191, 0, 0, 32, 192, 0, 0, 32, 64, 0, 0, 184, 191, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 144, 191, 0, 0, 0, 128, 0, 0, 32, 192, 0, 0, 80, 191, 0, 0, 0, 128, 0, 0, 32, 64, 0, 0, 244, 191, 0, 0, 32, 64, 0, 0, 0, 0, 0, 0, 184, 191, 0, 0, 32, 64, 0, 0, 32, 192, 0, 0, 120, 191, 0, 0, 32, 64)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "depression_Cube_001"
+_surfaces = [{
+"aabb": AABB(-5, -3, -5, 10, 3.5, 10),
+"attribute_data": PackedByteArray(0, 0, 0, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 96, 63, 0, 0, 128, 62, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 224, 62, 0, 0, 192, 62, 0, 0, 80, 63, 0, 0, 0, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 96, 63, 0, 0, 0, 62, 0, 0, 160, 62, 0, 0, 192, 62, 0, 0, 112, 63, 0, 0, 32, 63, 0, 0, 112, 63, 0, 0, 96, 63, 0, 0, 160, 62, 0, 0, 32, 63, 0, 0, 96, 63, 0, 0, 96, 63, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 80, 63, 0, 0, 96, 63, 0, 0, 224, 62, 0, 0, 192, 62, 0, 0, 160, 62, 0, 0, 192, 62, 0, 0, 160, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 224, 62, 0, 0, 192, 62, 0, 0, 224, 62, 0, 0, 32, 63, 0, 0, 224, 62, 0, 0, 32, 63, 0, 0, 224, 62, 0, 0, 32, 63, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 160, 62, 0, 0, 32, 63, 0, 0, 160, 62, 0, 0, 160, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 16, 63, 255, 255, 127, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 64, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 48, 63, 0, 0, 32, 63, 0, 0, 48, 63, 0, 0, 80, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 16, 63, 0, 0, 48, 63, 0, 0, 0, 63, 0, 0, 64, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 61, 0, 0, 128, 62, 0, 0, 128, 62, 0, 0, 192, 62, 4, 0, 0, 62, 0, 0, 160, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 64, 62, 0, 0, 32, 63, 0, 0, 64, 62, 0, 0, 48, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 61, 0, 0, 80, 63, 0, 0, 128, 62, 0, 0, 80, 63, 0, 0, 224, 62, 0, 0, 64, 63, 0, 0, 224, 62, 0, 0, 48, 63, 0, 0, 224, 62, 0, 0, 80, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 48, 63, 0, 0, 192, 62, 0, 0, 80, 63, 0, 0, 160, 62, 0, 0, 64, 63, 0, 0, 160, 62, 0, 0, 48, 63, 0, 0, 160, 62, 0, 0, 160, 62, 0, 0, 224, 62, 255, 255, 127, 62, 0, 0, 224, 62, 0, 0, 64, 62, 0, 0, 224, 62, 0, 0, 160, 62, 0, 0, 192, 62, 255, 255, 127, 62, 0, 0, 192, 62, 0, 0, 64, 62, 0, 0, 192, 62, 0, 0, 160, 62, 0, 0, 160, 62, 255, 255, 127, 62, 0, 0, 160, 62, 0, 0, 64, 62, 0, 0, 160, 62),
+"format": 4119,
+"index_count": 288,
+"index_data": PackedByteArray(25, 0, 9, 0, 34, 0, 25, 0, 7, 0, 9, 0, 49, 0, 21, 0, 58, 0, 49, 0, 19, 0, 21, 0, 37, 0, 17, 0, 47, 0, 37, 0, 14, 0, 17, 0, 61, 0, 3, 0, 70, 0, 61, 0, 1, 0, 3, 0, 87, 0, 12, 0, 36, 0, 87, 0, 64, 0, 12, 0, 78, 0, 5, 0, 31, 0, 78, 0, 71, 0, 5, 0, 55, 0, 35, 0, 11, 0, 55, 0, 72, 0, 35, 0, 72, 0, 33, 0, 35, 0, 72, 0, 75, 0, 33, 0, 75, 0, 31, 0, 33, 0, 75, 0, 78, 0, 31, 0, 48, 0, 40, 0, 18, 0, 48, 0, 81, 0, 40, 0, 81, 0, 38, 0, 40, 0, 81, 0, 84, 0, 38, 0, 84, 0, 36, 0, 38, 0, 84, 0, 87, 0, 36, 0, 20, 0, 43, 0, 23, 0, 20, 0, 41, 0, 43, 0, 41, 0, 45, 0, 43, 0, 41, 0, 39, 0, 45, 0, 39, 0, 47, 0, 45, 0, 39, 0, 37, 0, 47, 0, 2, 0, 30, 0, 4, 0, 2, 0, 29, 0, 30, 0, 29, 0, 32, 0, 30, 0, 29, 0, 27, 0, 32, 0, 27, 0, 34, 0, 32, 0, 27, 0, 25, 0, 34, 0, 26, 0, 89, 0, 86, 0, 26, 0, 28, 0, 89, 0, 86, 0, 88, 0, 85, 0, 86, 0, 89, 0, 88, 0, 85, 0, 87, 0, 84, 0, 85, 0, 88, 0, 87, 0, 24, 0, 86, 0, 83, 0, 24, 0, 26, 0, 86, 0, 83, 0, 85, 0, 82, 0, 83, 0, 86, 0, 85, 0, 82, 0, 84, 0, 81, 0, 82, 0, 85, 0, 84, 0, 6, 0, 83, 0, 52, 0, 6, 0, 24, 0, 83, 0, 52, 0, 82, 0, 50, 0, 52, 0, 83, 0, 82, 0, 50, 0, 81, 0, 48, 0, 50, 0, 82, 0, 81, 0, 44, 0, 80, 0, 77, 0, 44, 0, 46, 0, 80, 0, 77, 0, 79, 0, 76, 0, 77, 0, 80, 0, 79, 0, 76, 0, 78, 0, 75, 0, 76, 0, 79, 0, 78, 0, 42, 0, 77, 0, 74, 0, 42, 0, 44, 0, 77, 0, 74, 0, 76, 0, 73, 0, 74, 0, 77, 0, 76, 0, 73, 0, 75, 0, 72, 0, 73, 0, 76, 0, 75, 0, 22, 0, 74, 0, 59, 0, 22, 0, 42, 0, 74, 0, 59, 0, 73, 0, 57, 0, 59, 0, 74, 0, 73, 0, 57, 0, 72, 0, 55, 0, 57, 0, 73, 0, 72, 0, 46, 0, 67, 0, 80, 0, 46, 0, 16, 0, 67, 0, 80, 0, 69, 0, 79, 0, 80, 0, 67, 0, 69, 0, 79, 0, 71, 0, 78, 0, 79, 0, 69, 0, 71, 0, 28, 0, 60, 0, 89, 0, 28, 0, 0, 0, 60, 0, 89, 0, 62, 0, 88, 0, 89, 0, 60, 0, 62, 0, 88, 0, 64, 0, 87, 0, 88, 0, 62, 0, 64, 0, 13, 0, 66, 0, 15, 0, 13, 0, 65, 0, 66, 0, 65, 0, 68, 0, 66, 0, 65, 0, 63, 0, 68, 0, 63, 0, 70, 0, 68, 0, 63, 0, 61, 0, 70, 0, 8, 0, 54, 0, 10, 0, 8, 0, 53, 0, 54, 0, 53, 0, 56, 0, 54, 0, 53, 0, 51, 0, 56, 0, 51, 0, 58, 0, 56, 0, 51, 0, 49, 0, 58, 0),
+"lods": [0.230532, PackedByteArray(29, 0, 9, 0, 34, 0, 29, 0, 7, 0, 9, 0, 2, 0, 29, 0, 34, 0, 2, 0, 34, 0, 4, 0, 49, 0, 21, 0, 54, 0, 49, 0, 19, 0, 21, 0, 8, 0, 49, 0, 54, 0, 8, 0, 54, 0, 10, 0, 37, 0, 17, 0, 45, 0, 37, 0, 14, 0, 17, 0, 20, 0, 37, 0, 45, 0, 20, 0, 45, 0, 23, 0, 61, 0, 3, 0, 70, 0, 61, 0, 1, 0, 3, 0, 13, 0, 61, 0, 70, 0, 13, 0, 70, 0, 15, 0, 36, 0, 60, 0, 12, 0, 28, 0, 60, 0, 36, 0, 28, 0, 0, 0, 60, 0, 48, 0, 28, 0, 36, 0, 6, 0, 28, 0, 48, 0, 48, 0, 36, 0, 18, 0, 71, 0, 5, 0, 35, 0, 44, 0, 71, 0, 35, 0, 44, 0, 16, 0, 71, 0, 55, 0, 44, 0, 35, 0, 22, 0, 44, 0, 55, 0, 55, 0, 35, 0, 11, 0), 0.246172, PackedByteArray(25, 0, 9, 0, 34, 0, 25, 0, 7, 0, 9, 0, 29, 0, 25, 0, 34, 0, 29, 0, 34, 0, 32, 0, 29, 0, 32, 0, 30, 0, 2, 0, 29, 0, 30, 0, 2, 0, 30, 0, 4, 0, 49, 0, 21, 0, 58, 0, 49, 0, 19, 0, 21, 0, 51, 0, 49, 0, 58, 0, 51, 0, 58, 0, 56, 0, 53, 0, 51, 0, 56, 0, 53, 0, 56, 0, 54, 0, 8, 0, 53, 0, 54, 0, 8, 0, 54, 0, 10, 0, 37, 0, 17, 0, 47, 0, 37, 0, 14, 0, 17, 0, 39, 0, 37, 0, 47, 0, 39, 0, 47, 0, 45, 0, 41, 0, 39, 0, 45, 0, 20, 0, 41, 0, 45, 0, 20, 0, 45, 0, 23, 0, 61, 0, 3, 0, 70, 0, 61, 0, 1, 0, 3, 0, 63, 0, 61, 0, 70, 0, 63, 0, 70, 0, 68, 0, 65, 0, 63, 0, 68, 0, 65, 0, 68, 0, 66, 0, 13, 0, 65, 0, 66, 0, 13, 0, 66, 0, 15, 0, 36, 0, 64, 0, 12, 0, 28, 0, 64, 0, 36, 0, 28, 0, 62, 0, 64, 0, 28, 0, 60, 0, 62, 0, 28, 0, 0, 0, 60, 0, 52, 0, 28, 0, 36, 0, 24, 0, 28, 0, 52, 0, 6, 0, 24, 0, 52, 0, 52, 0, 36, 0, 48, 0, 50, 0, 52, 0, 48, 0, 48, 0, 36, 0, 38, 0, 48, 0, 38, 0, 40, 0, 48, 0, 40, 0, 18, 0, 71, 0, 5, 0, 31, 0, 35, 0, 71, 0, 31, 0, 35, 0, 31, 0, 33, 0, 59, 0, 71, 0, 35, 0, 57, 0, 59, 0, 35, 0, 57, 0, 35, 0, 55, 0, 55, 0, 35, 0, 11, 0, 44, 0, 71, 0, 59, 0, 22, 0, 44, 0, 59, 0, 44, 0, 69, 0, 71, 0, 44, 0, 67, 0, 69, 0, 46, 0, 67, 0, 44, 0, 46, 0, 16, 0, 67, 0)],
+"material": ExtResource("1_lp6gg"),
+"primitive": 3,
+"vertex_count": 90,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 101, 102, 102, 22, 240, 232, 132, 180, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 102, 150, 101, 230, 249, 22, 124, 203, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 121, 120, 195, 3, 30, 252, 15, 190, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 194, 131, 120, 248, 253, 3, 238, 193, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 9, 89, 122, 19, 5, 233, 129, 180, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 122, 147, 9, 217, 250, 22, 207, 203, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 101, 102, 50, 3, 80, 252, 192, 189, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 192, 50, 131, 101, 230, 226, 3, 239, 193, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 192, 7, 117, 78, 7, 106, 248, 60, 188, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 0, 128, 181, 110, 212, 13, 187, 241, 228, 184, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 0, 128, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 64, 10, 105, 172, 19, 194, 235, 231, 181, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 64, 172, 147, 10, 233, 59, 20, 22, 202, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 0, 128, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 0, 128, 212, 141, 180, 238, 66, 14, 25, 199, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 192, 78, 135, 7, 245, 147, 7, 193, 195, 0, 0, 160, 64, 0, 0, 24, 192, 0, 0, 32, 64, 249, 90, 30, 17, 215, 235, 191, 181, 0, 0, 160, 64, 0, 0, 24, 192, 0, 0, 32, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 224, 191, 0, 0, 0, 128, 55, 95, 243, 11, 213, 241, 187, 184, 0, 0, 160, 64, 0, 0, 224, 191, 0, 0, 0, 128, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 144, 191, 0, 0, 32, 192, 225, 99, 68, 6, 138, 248, 18, 188, 0, 0, 160, 64, 0, 0, 144, 191, 0, 0, 32, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 190, 0, 0, 32, 192, 68, 134, 224, 227, 157, 7, 254, 195, 0, 0, 160, 64, 0, 0, 0, 190, 0, 0, 32, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 191, 0, 0, 0, 128, 243, 139, 55, 223, 77, 14, 83, 199, 0, 0, 160, 64, 0, 0, 64, 191, 0, 0, 0, 128, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 176, 191, 0, 0, 32, 64, 30, 145, 249, 218, 71, 20, 77, 202, 0, 0, 160, 64, 0, 0, 176, 191, 0, 0, 32, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 160, 192, 10, 105, 72, 3, 49, 252, 234, 189, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 160, 192, 181, 110, 117, 3, 39, 252, 244, 189, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 160, 192, 7, 117, 168, 3, 32, 252, 0, 190, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 32, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 32, 192, 0, 0, 0, 63, 0, 0, 160, 192, 168, 131, 7, 245, 253, 3, 238, 193, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 160, 192, 117, 131, 180, 238, 20, 4, 235, 193, 0, 0, 32, 64, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 32, 64, 0, 0, 0, 63, 0, 0, 160, 192, 71, 131, 10, 233, 39, 4, 230, 193, 0, 0, 32, 192, 0, 0, 144, 191, 0, 0, 160, 64, 225, 99, 217, 21, 240, 232, 132, 180, 0, 0, 32, 192, 0, 0, 144, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 0, 0, 0, 0, 224, 191, 0, 0, 160, 64, 55, 95, 212, 20, 216, 232, 132, 180, 0, 0, 0, 0, 0, 0, 224, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 254, 255, 0, 0, 32, 64, 0, 0, 24, 192, 0, 0, 160, 64, 249, 90, 231, 19, 189, 232, 131, 180, 0, 0, 32, 64, 0, 0, 24, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 254, 255, 0, 0, 32, 64, 0, 0, 176, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 32, 64, 0, 0, 176, 191, 0, 0, 160, 64, 230, 147, 249, 218, 248, 22, 158, 203, 0, 0, 0, 0, 0, 0, 64, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 254, 255, 0, 0, 0, 0, 0, 0, 64, 191, 0, 0, 160, 64, 211, 148, 55, 223, 245, 22, 146, 203, 0, 0, 32, 192, 0, 0, 0, 190, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 254, 255, 0, 0, 32, 192, 0, 0, 0, 190, 0, 0, 160, 64, 216, 149, 224, 227, 246, 22, 134, 203, 0, 0, 32, 192, 0, 0, 176, 62, 0, 0, 32, 192, 26, 135, 201, 241, 133, 7, 194, 195, 0, 0, 0, 0, 0, 0, 64, 62, 0, 0, 32, 192, 185, 134, 205, 235, 132, 7, 193, 195, 0, 0, 32, 64, 0, 0, 0, 61, 0, 0, 32, 192, 101, 134, 105, 230, 135, 7, 195, 195, 0, 0, 32, 192, 0, 0, 64, 62, 0, 0, 0, 128, 118, 141, 205, 235, 54, 14, 26, 199, 0, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 128, 202, 140, 105, 230, 54, 14, 26, 199, 0, 0, 32, 64, 0, 0, 224, 190, 0, 0, 0, 128, 45, 140, 138, 225, 52, 14, 26, 199, 0, 0, 32, 192, 0, 0, 0, 61, 0, 0, 32, 64, 47, 147, 105, 230, 50, 20, 24, 202, 0, 0, 0, 0, 0, 0, 224, 190, 0, 0, 32, 64, 70, 146, 138, 225, 50, 20, 24, 202, 0, 0, 32, 64, 0, 0, 104, 191, 0, 0, 32, 64, 112, 145, 28, 221, 50, 20, 24, 202, 0, 0, 32, 64, 0, 0, 120, 191, 0, 0, 32, 192, 105, 102, 102, 6, 120, 248, 59, 188, 0, 0, 0, 0, 0, 0, 80, 191, 0, 0, 32, 192, 206, 107, 186, 6, 122, 248, 60, 188, 0, 0, 32, 192, 0, 0, 40, 191, 0, 0, 32, 192, 201, 113, 26, 7, 121, 248, 60, 188, 0, 0, 32, 64, 0, 0, 184, 191, 0, 0, 0, 128, 139, 97, 45, 12, 202, 241, 228, 184, 0, 0, 0, 0, 0, 0, 144, 191, 0, 0, 0, 128, 106, 102, 202, 12, 200, 241, 228, 184, 0, 0, 32, 192, 0, 0, 80, 191, 0, 0, 0, 128, 206, 107, 119, 13, 200, 241, 228, 184, 0, 0, 32, 64, 0, 0, 244, 191, 0, 0, 32, 64, 28, 93, 113, 17, 204, 235, 230, 181, 0, 0, 0, 0, 0, 0, 184, 191, 0, 0, 32, 64, 139, 97, 70, 18, 204, 235, 229, 181, 0, 0, 32, 192, 0, 0, 120, 191, 0, 0, 32, 64, 105, 102, 47, 19, 204, 235, 230, 181)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_q85ss")
diff --git a/assets/meshes/platforms/diagonal.tres b/assets/meshes/platforms/diagonal.tres
new file mode 100644
index 0000000..cd64e14
--- /dev/null
+++ b/assets/meshes/platforms/diagonal.tres
@@ -0,0 +1,31 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://nw0f20urbu50"]
+
+[ext_resource type="Material" uid="uid://cwyjtikumcq3k" path="res://assets/mats/platform.material" id="1_a348c"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_s5wrq"]
+_surfaces = [{
+"aabb": AABB(-5, -3, -5, 10, 3.5, 10),
+"format": 4097,
+"index_count": 36,
+"index_data": PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 2, 0, 7, 0, 3, 0, 2, 0, 6, 0, 7, 0, 6, 0, 5, 0, 7, 0, 6, 0, 4, 0, 5, 0, 4, 0, 1, 0, 5, 0, 4, 0, 0, 0, 1, 0, 2, 0, 4, 0, 6, 0, 2, 0, 0, 0, 4, 0, 7, 0, 1, 0, 3, 0, 7, 0, 5, 0, 1, 0),
+"primitive": 3,
+"vertex_count": 8,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 192)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "diagonal_Cube_001"
+_surfaces = [{
+"aabb": AABB(-5, -3, -5, 10, 3.5, 10),
+"attribute_data": PackedByteArray(0, 0, 0, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 96, 63, 0, 0, 128, 62, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63),
+"format": 4119,
+"index_count": 36,
+"index_data": PackedByteArray(2, 0, 9, 0, 4, 0, 2, 0, 7, 0, 9, 0, 8, 0, 21, 0, 10, 0, 8, 0, 19, 0, 21, 0, 20, 0, 17, 0, 23, 0, 20, 0, 14, 0, 17, 0, 13, 0, 3, 0, 15, 0, 13, 0, 1, 0, 3, 0, 6, 0, 12, 0, 18, 0, 6, 0, 0, 0, 12, 0, 22, 0, 5, 0, 11, 0, 22, 0, 16, 0, 5, 0),
+"material": ExtResource("1_a348c"),
+"primitive": 3,
+"vertex_count": 24,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 102, 102, 152, 25, 102, 230, 50, 179, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 152, 153, 102, 230, 152, 25, 203, 204, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 102, 102, 152, 25, 102, 230, 50, 179, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 152, 153, 102, 230, 152, 25, 203, 204, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 102, 102, 152, 25, 102, 230, 50, 179, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 152, 153, 102, 230, 152, 25, 203, 204, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 192, 102, 102, 152, 25, 102, 230, 50, 179, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 192, 152, 153, 102, 230, 152, 25, 203, 204, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_s5wrq")
diff --git a/assets/meshes/platforms/poke.tres b/assets/meshes/platforms/poke.tres
new file mode 100644
index 0000000..e1cdafe
--- /dev/null
+++ b/assets/meshes/platforms/poke.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://7h6mvi4idtq1"]
+
+[ext_resource type="Material" uid="uid://cwyjtikumcq3k" path="res://assets/mats/platform.material" id="1_rdbra"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_q7end"]
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -5, 10, 3.5, 10),
+"format": 4097,
+"index_count": 288,
+"index_data": PackedByteArray(29, 0, 4, 0, 28, 0, 29, 0, 5, 0, 4, 0, 11, 0, 0, 0, 10, 0, 11, 0, 1, 0, 0, 0, 49, 0, 3, 0, 23, 0, 49, 0, 13, 0, 3, 0, 23, 0, 2, 0, 22, 0, 23, 0, 3, 0, 2, 0, 17, 0, 6, 0, 16, 0, 17, 0, 7, 0, 6, 0, 38, 0, 2, 0, 8, 0, 38, 0, 22, 0, 2, 0, 26, 0, 10, 0, 0, 0, 26, 0, 32, 0, 10, 0, 32, 0, 9, 0, 10, 0, 32, 0, 35, 0, 9, 0, 35, 0, 8, 0, 9, 0, 35, 0, 38, 0, 8, 0, 5, 0, 14, 0, 4, 0, 5, 0, 19, 0, 14, 0, 19, 0, 15, 0, 14, 0, 19, 0, 18, 0, 15, 0, 18, 0, 16, 0, 15, 0, 18, 0, 17, 0, 16, 0, 31, 0, 11, 0, 43, 0, 31, 0, 1, 0, 11, 0, 43, 0, 12, 0, 46, 0, 43, 0, 11, 0, 12, 0, 46, 0, 13, 0, 49, 0, 46, 0, 12, 0, 13, 0, 3, 0, 8, 0, 2, 0, 3, 0, 13, 0, 8, 0, 13, 0, 9, 0, 8, 0, 13, 0, 12, 0, 9, 0, 12, 0, 10, 0, 9, 0, 12, 0, 11, 0, 10, 0, 18, 0, 47, 0, 17, 0, 18, 0, 44, 0, 47, 0, 44, 0, 48, 0, 47, 0, 44, 0, 45, 0, 48, 0, 45, 0, 49, 0, 48, 0, 45, 0, 46, 0, 49, 0, 19, 0, 44, 0, 18, 0, 19, 0, 41, 0, 44, 0, 41, 0, 45, 0, 44, 0, 41, 0, 42, 0, 45, 0, 42, 0, 46, 0, 45, 0, 42, 0, 43, 0, 46, 0, 5, 0, 41, 0, 19, 0, 5, 0, 29, 0, 41, 0, 29, 0, 42, 0, 41, 0, 29, 0, 30, 0, 42, 0, 30, 0, 43, 0, 42, 0, 30, 0, 31, 0, 43, 0, 15, 0, 40, 0, 37, 0, 15, 0, 16, 0, 40, 0, 37, 0, 39, 0, 36, 0, 37, 0, 40, 0, 39, 0, 36, 0, 38, 0, 35, 0, 36, 0, 39, 0, 38, 0, 14, 0, 37, 0, 34, 0, 14, 0, 15, 0, 37, 0, 34, 0, 36, 0, 33, 0, 34, 0, 37, 0, 36, 0, 33, 0, 35, 0, 32, 0, 33, 0, 36, 0, 35, 0, 4, 0, 34, 0, 28, 0, 4, 0, 14, 0, 34, 0, 28, 0, 33, 0, 27, 0, 28, 0, 34, 0, 33, 0, 27, 0, 32, 0, 26, 0, 27, 0, 33, 0, 32, 0, 16, 0, 20, 0, 40, 0, 16, 0, 6, 0, 20, 0, 40, 0, 21, 0, 39, 0, 40, 0, 20, 0, 21, 0, 39, 0, 22, 0, 38, 0, 39, 0, 21, 0, 22, 0, 7, 0, 20, 0, 6, 0, 7, 0, 25, 0, 20, 0, 25, 0, 21, 0, 20, 0, 25, 0, 24, 0, 21, 0, 24, 0, 22, 0, 21, 0, 24, 0, 23, 0, 22, 0, 17, 0, 25, 0, 7, 0, 17, 0, 47, 0, 25, 0, 47, 0, 24, 0, 25, 0, 47, 0, 48, 0, 24, 0, 48, 0, 23, 0, 24, 0, 48, 0, 49, 0, 23, 0, 1, 0, 26, 0, 0, 0, 1, 0, 31, 0, 26, 0, 31, 0, 27, 0, 26, 0, 31, 0, 30, 0, 27, 0, 30, 0, 28, 0, 27, 0, 30, 0, 29, 0, 28, 0),
+"lods": [0.230045, PackedByteArray(29, 0, 4, 0, 28, 0, 29, 0, 5, 0, 4, 0, 30, 0, 29, 0, 28, 0, 30, 0, 28, 0, 27, 0, 31, 0, 30, 0, 27, 0, 31, 0, 27, 0, 26, 0, 1, 0, 31, 0, 26, 0, 1, 0, 26, 0, 0, 0, 11, 0, 0, 0, 10, 0, 11, 0, 1, 0, 0, 0, 12, 0, 11, 0, 10, 0, 12, 0, 10, 0, 9, 0, 13, 0, 12, 0, 9, 0, 13, 0, 9, 0, 8, 0, 3, 0, 13, 0, 8, 0, 3, 0, 8, 0, 2, 0, 13, 0, 3, 0, 23, 0, 25, 0, 13, 0, 23, 0, 25, 0, 23, 0, 24, 0, 17, 0, 25, 0, 7, 0, 18, 0, 25, 0, 17, 0, 18, 0, 19, 0, 25, 0, 19, 0, 13, 0, 25, 0, 5, 0, 29, 0, 19, 0, 29, 0, 30, 0, 19, 0, 19, 0, 11, 0, 13, 0, 30, 0, 11, 0, 19, 0, 11, 0, 12, 0, 13, 0, 30, 0, 31, 0, 11, 0, 31, 0, 1, 0, 11, 0, 23, 0, 2, 0, 22, 0, 23, 0, 3, 0, 2, 0, 24, 0, 23, 0, 22, 0, 24, 0, 22, 0, 21, 0, 25, 0, 24, 0, 21, 0, 7, 0, 25, 0, 21, 0, 7, 0, 21, 0, 6, 0, 17, 0, 6, 0, 15, 0, 17, 0, 7, 0, 6, 0, 18, 0, 17, 0, 15, 0, 19, 0, 18, 0, 15, 0, 19, 0, 15, 0, 14, 0, 5, 0, 19, 0, 14, 0, 5, 0, 14, 0, 4, 0, 26, 0, 10, 0, 0, 0, 27, 0, 10, 0, 26, 0, 27, 0, 9, 0, 10, 0, 27, 0, 2, 0, 9, 0, 9, 0, 2, 0, 8, 0, 14, 0, 2, 0, 27, 0, 28, 0, 14, 0, 27, 0, 4, 0, 14, 0, 28, 0, 14, 0, 15, 0, 2, 0, 15, 0, 21, 0, 2, 0, 2, 0, 21, 0, 22, 0, 15, 0, 6, 0, 21, 0)],
+"primitive": 3,
+"vertex_count": 50,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 192, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 0, 128, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 0, 128, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 192, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 32, 64, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 0, 128, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 32, 192, 0, 0, 160, 64, 0, 0, 24, 64, 0, 0, 32, 192, 0, 0, 160, 64, 0, 0, 224, 63, 0, 0, 0, 128, 0, 0, 160, 64, 0, 0, 144, 63, 0, 0, 32, 64, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 32, 192, 0, 0, 144, 63, 0, 0, 160, 192, 0, 0, 0, 0, 0, 0, 224, 63, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 24, 64, 0, 0, 160, 192, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 32, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 32, 64, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 32, 64, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 32, 64, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 128, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 0, 128, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 32, 192, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 32, 192, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 32, 192, 0, 0, 32, 64, 0, 0, 120, 63, 0, 0, 32, 64, 0, 0, 0, 0, 0, 0, 80, 63, 0, 0, 32, 64, 0, 0, 32, 192, 0, 0, 40, 63, 0, 0, 32, 64, 0, 0, 32, 64, 0, 0, 184, 63, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 144, 63, 0, 0, 0, 128, 0, 0, 32, 192, 0, 0, 80, 63, 0, 0, 0, 128, 0, 0, 32, 64, 0, 0, 244, 63, 0, 0, 32, 192, 0, 0, 0, 0, 0, 0, 184, 63, 0, 0, 32, 192, 0, 0, 32, 192, 0, 0, 120, 63, 0, 0, 32, 192)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "poke_Cube_001"
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -5, 10, 3.5, 10),
+"attribute_data": PackedByteArray(0, 0, 0, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 96, 63, 0, 0, 128, 62, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 224, 62, 0, 0, 192, 62, 0, 0, 80, 63, 0, 0, 0, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 96, 63, 0, 0, 0, 62, 0, 0, 160, 62, 0, 0, 192, 62, 0, 0, 112, 63, 0, 0, 32, 63, 0, 0, 112, 63, 0, 0, 96, 63, 0, 0, 160, 62, 0, 0, 32, 63, 0, 0, 96, 63, 0, 0, 96, 63, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 80, 63, 0, 0, 96, 63, 0, 0, 224, 62, 0, 0, 192, 62, 0, 0, 160, 62, 0, 0, 192, 62, 0, 0, 160, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 224, 62, 0, 0, 192, 62, 0, 0, 224, 62, 0, 0, 32, 63, 0, 0, 224, 62, 0, 0, 32, 63, 0, 0, 224, 62, 0, 0, 32, 63, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 160, 62, 0, 0, 32, 63, 0, 0, 160, 62, 0, 0, 160, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 16, 63, 255, 255, 127, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 64, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 48, 63, 0, 0, 32, 63, 0, 0, 48, 63, 0, 0, 80, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 16, 63, 0, 0, 48, 63, 0, 0, 0, 63, 0, 0, 64, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 61, 0, 0, 128, 62, 0, 0, 128, 62, 0, 0, 192, 62, 4, 0, 0, 62, 0, 0, 160, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 64, 62, 0, 0, 32, 63, 0, 0, 64, 62, 0, 0, 48, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 61, 0, 0, 80, 63, 0, 0, 128, 62, 0, 0, 64, 62, 0, 0, 160, 62, 0, 0, 128, 62, 0, 0, 160, 62, 0, 0, 160, 62, 0, 0, 160, 62, 0, 0, 64, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 160, 62, 0, 0, 192, 62, 0, 0, 64, 62, 0, 0, 224, 62, 0, 0, 128, 62, 0, 0, 224, 62, 0, 0, 160, 62, 0, 0, 224, 62, 0, 0, 48, 63, 0, 0, 160, 62, 0, 0, 64, 63, 0, 0, 160, 62, 0, 0, 80, 63, 0, 0, 160, 62, 0, 0, 48, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 80, 63, 0, 0, 192, 62, 0, 0, 48, 63, 0, 0, 224, 62, 0, 0, 64, 63, 0, 0, 224, 62, 0, 0, 80, 63, 0, 0, 224, 62),
+"format": 4119,
+"index_count": 288,
+"index_data": PackedByteArray(66, 0, 13, 0, 65, 0, 66, 0, 16, 0, 13, 0, 30, 0, 2, 0, 29, 0, 30, 0, 4, 0, 2, 0, 89, 0, 11, 0, 55, 0, 89, 0, 35, 0, 11, 0, 54, 0, 8, 0, 53, 0, 54, 0, 10, 0, 8, 0, 43, 0, 20, 0, 41, 0, 43, 0, 23, 0, 20, 0, 78, 0, 6, 0, 24, 0, 78, 0, 52, 0, 6, 0, 60, 0, 28, 0, 0, 0, 60, 0, 72, 0, 28, 0, 72, 0, 26, 0, 28, 0, 72, 0, 75, 0, 26, 0, 75, 0, 24, 0, 26, 0, 75, 0, 78, 0, 24, 0, 17, 0, 37, 0, 14, 0, 17, 0, 47, 0, 37, 0, 47, 0, 39, 0, 37, 0, 47, 0, 45, 0, 39, 0, 45, 0, 41, 0, 39, 0, 45, 0, 43, 0, 41, 0, 71, 0, 31, 0, 83, 0, 71, 0, 5, 0, 31, 0, 83, 0, 33, 0, 86, 0, 83, 0, 31, 0, 33, 0, 86, 0, 35, 0, 89, 0, 86, 0, 33, 0, 35, 0, 9, 0, 25, 0, 7, 0, 9, 0, 34, 0, 25, 0, 34, 0, 27, 0, 25, 0, 34, 0, 32, 0, 27, 0, 32, 0, 29, 0, 27, 0, 32, 0, 30, 0, 29, 0, 44, 0, 87, 0, 42, 0, 44, 0, 84, 0, 87, 0, 84, 0, 88, 0, 87, 0, 84, 0, 85, 0, 88, 0, 85, 0, 89, 0, 88, 0, 85, 0, 86, 0, 89, 0, 46, 0, 84, 0, 44, 0, 46, 0, 81, 0, 84, 0, 81, 0, 85, 0, 84, 0, 81, 0, 82, 0, 85, 0, 82, 0, 86, 0, 85, 0, 82, 0, 83, 0, 86, 0, 15, 0, 81, 0, 46, 0, 15, 0, 67, 0, 81, 0, 67, 0, 82, 0, 81, 0, 67, 0, 69, 0, 82, 0, 69, 0, 83, 0, 82, 0, 69, 0, 71, 0, 83, 0, 38, 0, 80, 0, 77, 0, 38, 0, 40, 0, 80, 0, 77, 0, 79, 0, 76, 0, 77, 0, 80, 0, 79, 0, 76, 0, 78, 0, 75, 0, 76, 0, 79, 0, 78, 0, 36, 0, 77, 0, 74, 0, 36, 0, 38, 0, 77, 0, 74, 0, 76, 0, 73, 0, 74, 0, 77, 0, 76, 0, 73, 0, 75, 0, 72, 0, 73, 0, 76, 0, 75, 0, 12, 0, 74, 0, 64, 0, 12, 0, 36, 0, 74, 0, 64, 0, 73, 0, 62, 0, 64, 0, 74, 0, 73, 0, 62, 0, 72, 0, 60, 0, 62, 0, 73, 0, 72, 0, 40, 0, 48, 0, 80, 0, 40, 0, 18, 0, 48, 0, 80, 0, 50, 0, 79, 0, 80, 0, 48, 0, 50, 0, 79, 0, 52, 0, 78, 0, 79, 0, 50, 0, 52, 0, 22, 0, 49, 0, 19, 0, 22, 0, 58, 0, 49, 0, 58, 0, 51, 0, 49, 0, 58, 0, 56, 0, 51, 0, 56, 0, 53, 0, 51, 0, 56, 0, 54, 0, 53, 0, 42, 0, 59, 0, 21, 0, 42, 0, 87, 0, 59, 0, 87, 0, 57, 0, 59, 0, 87, 0, 88, 0, 57, 0, 88, 0, 55, 0, 57, 0, 88, 0, 89, 0, 55, 0, 3, 0, 61, 0, 1, 0, 3, 0, 70, 0, 61, 0, 70, 0, 63, 0, 61, 0, 70, 0, 68, 0, 63, 0, 68, 0, 65, 0, 63, 0, 68, 0, 66, 0, 65, 0),
+"lods": [0.230045, PackedByteArray(66, 0, 13, 0, 65, 0, 66, 0, 16, 0, 13, 0, 68, 0, 66, 0, 65, 0, 68, 0, 65, 0, 63, 0, 70, 0, 68, 0, 63, 0, 70, 0, 63, 0, 61, 0, 3, 0, 70, 0, 61, 0, 3, 0, 61, 0, 1, 0, 30, 0, 2, 0, 29, 0, 30, 0, 4, 0, 2, 0, 32, 0, 30, 0, 29, 0, 32, 0, 29, 0, 27, 0, 34, 0, 32, 0, 27, 0, 34, 0, 27, 0, 25, 0, 9, 0, 34, 0, 25, 0, 9, 0, 25, 0, 7, 0, 35, 0, 11, 0, 55, 0, 59, 0, 35, 0, 55, 0, 59, 0, 55, 0, 57, 0, 42, 0, 59, 0, 21, 0, 44, 0, 59, 0, 42, 0, 44, 0, 46, 0, 59, 0, 46, 0, 35, 0, 59, 0, 15, 0, 67, 0, 46, 0, 67, 0, 69, 0, 46, 0, 46, 0, 31, 0, 35, 0, 69, 0, 31, 0, 46, 0, 31, 0, 33, 0, 35, 0, 69, 0, 71, 0, 31, 0, 71, 0, 5, 0, 31, 0, 54, 0, 8, 0, 53, 0, 54, 0, 10, 0, 8, 0, 56, 0, 54, 0, 53, 0, 56, 0, 53, 0, 51, 0, 58, 0, 56, 0, 51, 0, 22, 0, 58, 0, 51, 0, 22, 0, 51, 0, 19, 0, 43, 0, 20, 0, 39, 0, 43, 0, 23, 0, 20, 0, 45, 0, 43, 0, 39, 0, 47, 0, 45, 0, 39, 0, 47, 0, 39, 0, 37, 0, 17, 0, 47, 0, 37, 0, 17, 0, 37, 0, 14, 0, 60, 0, 28, 0, 0, 0, 62, 0, 28, 0, 60, 0, 62, 0, 26, 0, 28, 0, 62, 0, 6, 0, 26, 0, 26, 0, 6, 0, 24, 0, 36, 0, 6, 0, 62, 0, 64, 0, 36, 0, 62, 0, 12, 0, 36, 0, 64, 0, 36, 0, 38, 0, 6, 0, 38, 0, 50, 0, 6, 0, 6, 0, 50, 0, 52, 0, 38, 0, 18, 0, 50, 0)],
+"material": ExtResource("1_rdbra"),
+"primitive": 3,
+"vertex_count": 90,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 60, 124, 120, 248, 222, 3, 0, 190, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 152, 105, 101, 230, 249, 22, 130, 180, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 64, 204, 124, 101, 230, 224, 3, 14, 190, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 192, 132, 108, 9, 217, 159, 23, 130, 180, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 0, 128, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 0, 128, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 32, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 64, 176, 120, 7, 245, 132, 7, 53, 188, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 0, 128, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 0, 128, 43, 114, 180, 238, 52, 14, 221, 184, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 32, 192, 82, 108, 10, 233, 46, 20, 225, 181, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 32, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 32, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 0, 128, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 0, 128, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 32, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 32, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 24, 64, 0, 0, 32, 192, 224, 110, 249, 218, 156, 20, 219, 181, 0, 0, 160, 64, 0, 0, 24, 64, 0, 0, 32, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 224, 63, 0, 0, 0, 128, 11, 116, 55, 223, 168, 14, 216, 184, 0, 0, 160, 64, 0, 0, 224, 63, 0, 0, 0, 128, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 144, 63, 0, 0, 32, 64, 186, 121, 224, 227, 255, 7, 48, 188, 0, 0, 160, 64, 0, 0, 144, 63, 0, 0, 32, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 32, 192, 0, 0, 144, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 32, 192, 0, 0, 144, 63, 0, 0, 160, 192, 38, 106, 224, 227, 14, 23, 132, 180, 0, 0, 0, 0, 0, 0, 224, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 0, 0, 0, 0, 224, 63, 0, 0, 160, 192, 43, 107, 55, 223, 37, 23, 132, 180, 0, 0, 32, 64, 0, 0, 24, 64, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 32, 64, 0, 0, 24, 64, 0, 0, 160, 192, 24, 108, 249, 218, 62, 23, 131, 180, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 254, 255, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 254, 255, 0, 0, 32, 64, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 32, 64, 0, 0, 0, 63, 0, 0, 160, 64, 183, 124, 10, 233, 205, 3, 235, 189, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 254, 255, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 160, 64, 137, 124, 180, 238, 215, 3, 244, 189, 0, 0, 32, 192, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 254, 255, 0, 0, 32, 192, 0, 0, 0, 63, 0, 0, 160, 64, 86, 124, 7, 245, 222, 3, 0, 190, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 32, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 32, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 32, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 0, 128, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 128, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 0, 128, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 32, 192, 0, 0, 0, 191, 0, 0, 32, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 32, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 32, 64, 0, 0, 0, 191, 0, 0, 32, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 32, 64, 0, 0, 120, 63, 0, 0, 32, 64, 153, 121, 105, 230, 135, 7, 59, 188, 0, 0, 0, 0, 0, 0, 80, 63, 0, 0, 32, 64, 69, 121, 205, 235, 133, 7, 60, 188, 0, 0, 32, 192, 0, 0, 40, 63, 0, 0, 32, 64, 228, 120, 201, 241, 134, 7, 60, 188, 0, 0, 32, 64, 0, 0, 184, 63, 0, 0, 0, 128, 209, 115, 138, 225, 54, 14, 228, 184, 0, 0, 0, 0, 0, 0, 144, 63, 0, 0, 0, 128, 52, 115, 105, 230, 54, 14, 228, 184, 0, 0, 32, 192, 0, 0, 80, 63, 0, 0, 0, 128, 136, 114, 205, 235, 54, 14, 228, 184, 0, 0, 32, 64, 0, 0, 244, 63, 0, 0, 32, 192, 142, 110, 28, 221, 51, 20, 230, 181, 0, 0, 0, 0, 0, 0, 184, 63, 0, 0, 32, 192, 184, 109, 138, 225, 51, 20, 229, 181, 0, 0, 32, 192, 0, 0, 120, 63, 0, 0, 32, 192, 207, 108, 105, 230, 50, 20, 230, 181)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_q7end")
diff --git a/assets/meshes/platforms/poke_corner.tres b/assets/meshes/platforms/poke_corner.tres
new file mode 100644
index 0000000..95d96d0
--- /dev/null
+++ b/assets/meshes/platforms/poke_corner.tres
@@ -0,0 +1,31 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://buyff2c3guxdj"]
+
+[ext_resource type="Material" uid="uid://cwyjtikumcq3k" path="res://assets/mats/platform.material" id="1_r2n3h"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_257m7"]
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -5, 10, 3.5, 10),
+"format": 4097,
+"index_count": 24,
+"index_data": PackedByteArray(1, 0, 2, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 0, 5, 0, 1, 0, 0, 0, 4, 0, 5, 0, 4, 0, 3, 0, 5, 0, 4, 0, 2, 0, 3, 0, 1, 0, 5, 0, 3, 0, 0, 0, 2, 0, 4, 0),
+"primitive": 3,
+"vertex_count": 6,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 192)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "poke_corner_Cube_001"
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -5, 10, 3.5, 10),
+"attribute_data": PackedByteArray(0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63),
+"format": 4119,
+"index_count": 24,
+"index_data": PackedByteArray(3, 0, 6, 0, 0, 0, 3, 0, 9, 0, 6, 0, 2, 0, 15, 0, 4, 0, 2, 0, 13, 0, 15, 0, 14, 0, 11, 0, 17, 0, 14, 0, 8, 0, 11, 0, 5, 0, 16, 0, 10, 0, 1, 0, 7, 0, 12, 0),
+"material": ExtResource("1_r2n3h"),
+"primitive": 3,
+"vertex_count": 18,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 63, 255, 127, 243, 188, 243, 60, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 63, 255, 127, 226, 182, 226, 54, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 152, 153, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 63, 255, 127, 248, 131, 248, 3, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 64, 255, 63, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 64, 152, 153, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 192, 152, 153, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_257m7")
diff --git a/assets/meshes/platforms/ramp.tres b/assets/meshes/platforms/ramp.tres
new file mode 100644
index 0000000..b2721f0
--- /dev/null
+++ b/assets/meshes/platforms/ramp.tres
@@ -0,0 +1,31 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://bf6hiaub2ecc7"]
+
+[ext_resource type="Material" uid="uid://cwyjtikumcq3k" path="res://assets/mats/platform.material" id="1_kjodo"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_bw4px"]
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -5, 10, 3.5, 10),
+"format": 4097,
+"index_count": 36,
+"index_data": PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 2, 0, 7, 0, 3, 0, 2, 0, 6, 0, 7, 0, 6, 0, 5, 0, 7, 0, 6, 0, 4, 0, 5, 0, 4, 0, 1, 0, 5, 0, 4, 0, 0, 0, 1, 0, 2, 0, 4, 0, 6, 0, 2, 0, 0, 0, 4, 0, 7, 0, 1, 0, 3, 0, 7, 0, 5, 0, 1, 0),
+"primitive": 3,
+"vertex_count": 8,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 192)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "ramp_Cube_001"
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -5, 10, 3.5, 10),
+"attribute_data": PackedByteArray(0, 0, 0, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 96, 63, 0, 0, 128, 62, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63),
+"format": 4119,
+"index_count": 36,
+"index_data": PackedByteArray(2, 0, 9, 0, 4, 0, 2, 0, 7, 0, 9, 0, 8, 0, 22, 0, 10, 0, 8, 0, 19, 0, 22, 0, 20, 0, 17, 0, 23, 0, 20, 0, 14, 0, 17, 0, 13, 0, 3, 0, 16, 0, 13, 0, 1, 0, 3, 0, 6, 0, 12, 0, 18, 0, 6, 0, 0, 0, 12, 0, 21, 0, 5, 0, 11, 0, 21, 0, 15, 0, 5, 0),
+"material": ExtResource("1_kjodo"),
+"primitive": 3,
+"vertex_count": 24,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 102, 102, 102, 230, 152, 25, 50, 179, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 102, 102, 102, 230, 152, 25, 50, 179, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 64, 102, 102, 102, 230, 152, 25, 50, 179, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 192, 102, 102, 102, 230, 152, 25, 50, 179, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 64, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_bw4px")
diff --git a/assets/meshes/platforms/small_wide_turn.tres b/assets/meshes/platforms/small_wide_turn.tres
new file mode 100644
index 0000000..8535749
--- /dev/null
+++ b/assets/meshes/platforms/small_wide_turn.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://dhvhlj43vxfla"]
+
+[ext_resource type="Material" uid="uid://cwyjtikumcq3k" path="res://assets/mats/platform.material" id="1_vbf77"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_qwqmo"]
+_surfaces = [{
+"aabb": AABB(-9.8618, -0.5, -10.1382, 20, 1, 20),
+"format": 4097,
+"index_count": 300,
+"index_data": PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 7, 0, 10, 0, 11, 0, 7, 0, 6, 0, 10, 0, 3, 0, 6, 0, 7, 0, 3, 0, 2, 0, 6, 0, 0, 0, 5, 0, 4, 0, 0, 0, 1, 0, 5, 0, 8, 0, 13, 0, 12, 0, 8, 0, 9, 0, 13, 0, 4, 0, 9, 0, 8, 0, 4, 0, 5, 0, 9, 0, 11, 0, 14, 0, 15, 0, 11, 0, 10, 0, 14, 0, 19, 0, 22, 0, 23, 0, 19, 0, 18, 0, 22, 0, 15, 0, 18, 0, 19, 0, 15, 0, 14, 0, 18, 0, 12, 0, 17, 0, 16, 0, 12, 0, 13, 0, 17, 0, 16, 0, 21, 0, 20, 0, 16, 0, 17, 0, 21, 0, 23, 0, 26, 0, 27, 0, 23, 0, 22, 0, 26, 0, 20, 0, 25, 0, 24, 0, 20, 0, 21, 0, 25, 0, 31, 0, 34, 0, 35, 0, 31, 0, 30, 0, 34, 0, 27, 0, 30, 0, 31, 0, 27, 0, 26, 0, 30, 0, 24, 0, 29, 0, 28, 0, 24, 0, 25, 0, 29, 0, 28, 0, 33, 0, 32, 0, 28, 0, 29, 0, 33, 0, 35, 0, 38, 0, 39, 0, 35, 0, 34, 0, 38, 0, 32, 0, 37, 0, 36, 0, 32, 0, 33, 0, 37, 0, 43, 0, 46, 0, 47, 0, 43, 0, 42, 0, 46, 0, 39, 0, 42, 0, 43, 0, 39, 0, 38, 0, 42, 0, 36, 0, 41, 0, 40, 0, 36, 0, 37, 0, 41, 0, 40, 0, 45, 0, 44, 0, 40, 0, 41, 0, 45, 0, 2, 0, 10, 0, 6, 0, 10, 0, 18, 0, 14, 0, 18, 0, 26, 0, 22, 0, 26, 0, 34, 0, 30, 0, 34, 0, 42, 0, 38, 0, 42, 0, 50, 0, 46, 0, 50, 0, 44, 0, 48, 0, 50, 0, 40, 0, 44, 0, 34, 0, 50, 0, 42, 0, 18, 0, 34, 0, 26, 0, 2, 0, 18, 0, 10, 0, 4, 0, 2, 0, 0, 0, 8, 0, 2, 0, 4, 0, 2, 0, 34, 0, 18, 0, 34, 0, 40, 0, 50, 0, 34, 0, 36, 0, 40, 0, 8, 0, 34, 0, 2, 0, 12, 0, 34, 0, 8, 0, 34, 0, 32, 0, 36, 0, 34, 0, 28, 0, 32, 0, 16, 0, 34, 0, 12, 0, 20, 0, 34, 0, 16, 0, 34, 0, 24, 0, 28, 0, 34, 0, 20, 0, 24, 0, 48, 0, 51, 0, 50, 0, 48, 0, 49, 0, 51, 0, 45, 0, 51, 0, 49, 0, 51, 0, 43, 0, 47, 0, 43, 0, 35, 0, 39, 0, 35, 0, 27, 0, 31, 0, 27, 0, 19, 0, 23, 0, 19, 0, 11, 0, 15, 0, 11, 0, 3, 0, 7, 0, 3, 0, 5, 0, 1, 0, 3, 0, 9, 0, 5, 0, 19, 0, 3, 0, 11, 0, 35, 0, 19, 0, 27, 0, 51, 0, 35, 0, 43, 0, 41, 0, 51, 0, 45, 0, 37, 0, 51, 0, 41, 0, 51, 0, 19, 0, 35, 0, 19, 0, 9, 0, 3, 0, 19, 0, 13, 0, 9, 0, 37, 0, 19, 0, 51, 0, 33, 0, 19, 0, 37, 0, 19, 0, 17, 0, 13, 0, 19, 0, 21, 0, 17, 0, 29, 0, 19, 0, 33, 0, 19, 0, 25, 0, 21, 0, 25, 0, 19, 0, 29, 0, 47, 0, 50, 0, 51, 0, 47, 0, 46, 0, 50, 0, 44, 0, 49, 0, 48, 0, 44, 0, 45, 0, 49, 0),
+"lods": [0.450927, PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 3, 0, 6, 0, 11, 0, 3, 0, 2, 0, 6, 0, 11, 0, 6, 0, 22, 0, 11, 0, 22, 0, 19, 0, 19, 0, 22, 0, 27, 0, 27, 0, 22, 0, 38, 0, 27, 0, 38, 0, 35, 0, 35, 0, 38, 0, 43, 0, 43, 0, 38, 0, 46, 0, 43, 0, 46, 0, 50, 0, 43, 0, 50, 0, 51, 0, 0, 0, 13, 0, 4, 0, 0, 0, 1, 0, 13, 0, 4, 0, 13, 0, 8, 0, 8, 0, 13, 0, 20, 0, 20, 0, 13, 0, 33, 0, 20, 0, 33, 0, 28, 0, 28, 0, 33, 0, 32, 0, 32, 0, 33, 0, 45, 0, 32, 0, 45, 0, 40, 0, 40, 0, 45, 0, 49, 0, 40, 0, 49, 0, 48, 0, 38, 0, 50, 0, 46, 0, 50, 0, 40, 0, 48, 0, 38, 0, 40, 0, 50, 0, 38, 0, 32, 0, 40, 0, 38, 0, 28, 0, 32, 0, 38, 0, 20, 0, 28, 0, 20, 0, 38, 0, 8, 0, 8, 0, 38, 0, 2, 0, 2, 0, 38, 0, 22, 0, 2, 0, 22, 0, 6, 0, 8, 0, 2, 0, 4, 0, 4, 0, 2, 0, 0, 0, 48, 0, 51, 0, 50, 0, 48, 0, 49, 0, 51, 0, 45, 0, 51, 0, 49, 0, 45, 0, 19, 0, 51, 0, 33, 0, 19, 0, 45, 0, 51, 0, 35, 0, 43, 0, 51, 0, 19, 0, 35, 0, 35, 0, 19, 0, 27, 0, 19, 0, 33, 0, 13, 0, 19, 0, 13, 0, 3, 0, 3, 0, 13, 0, 1, 0, 19, 0, 3, 0, 11, 0), 3.03953, PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 3, 0, 6, 0, 19, 0, 3, 0, 2, 0, 6, 0, 19, 0, 22, 0, 50, 0, 0, 0, 33, 0, 8, 0, 0, 0, 1, 0, 33, 0, 8, 0, 33, 0, 40, 0, 40, 0, 33, 0, 49, 0, 40, 0, 49, 0, 48, 0, 19, 0, 6, 0, 22, 0, 19, 0, 50, 0, 51, 0, 50, 0, 40, 0, 48, 0, 22, 0, 40, 0, 50, 0, 22, 0, 8, 0, 40, 0, 8, 0, 22, 0, 2, 0, 2, 0, 22, 0, 6, 0, 8, 0, 2, 0, 0, 0, 48, 0, 51, 0, 50, 0, 48, 0, 49, 0, 51, 0, 33, 0, 51, 0, 49, 0, 33, 0, 19, 0, 51, 0, 19, 0, 33, 0, 3, 0, 3, 0, 33, 0, 1, 0)],
+"primitive": 3,
+"vertex_count": 52,
+"vertex_data": PackedByteArray(243, 201, 29, 193, 255, 255, 255, 190, 192, 131, 13, 190, 243, 201, 29, 193, 0, 0, 0, 63, 192, 131, 13, 190, 243, 201, 29, 193, 255, 255, 255, 190, 15, 54, 34, 193, 243, 201, 29, 193, 0, 0, 0, 63, 15, 54, 34, 193, 152, 231, 8, 193, 255, 255, 255, 190, 128, 164, 87, 189, 152, 231, 8, 193, 0, 0, 0, 63, 128, 164, 87, 189, 125, 10, 232, 192, 255, 255, 255, 190, 58, 121, 31, 193, 125, 10, 232, 192, 0, 0, 0, 63, 58, 121, 31, 193, 113, 193, 232, 192, 255, 255, 255, 190, 64, 103, 79, 62, 113, 193, 232, 192, 0, 0, 0, 63, 64, 103, 79, 62, 252, 238, 149, 192, 255, 255, 255, 190, 182, 78, 23, 193, 252, 238, 149, 192, 0, 0, 0, 63, 182, 78, 23, 193, 120, 30, 193, 192, 255, 255, 255, 190, 64, 125, 31, 63, 120, 30, 193, 192, 0, 0, 0, 63, 64, 125, 31, 63, 22, 82, 13, 192, 255, 255, 255, 190, 72, 218, 9, 193, 22, 82, 13, 192, 0, 0, 0, 63, 72, 218, 9, 193, 228, 147, 155, 192, 255, 255, 255, 190, 64, 204, 153, 63, 228, 147, 155, 192, 0, 0, 0, 63, 64, 204, 153, 63, 128, 131, 13, 62, 255, 255, 255, 190, 192, 173, 238, 192, 128, 131, 13, 62, 0, 0, 0, 63, 192, 173, 238, 192, 78, 140, 113, 192, 255, 255, 255, 190, 104, 209, 246, 63, 78, 140, 113, 192, 0, 0, 0, 63, 104, 209, 246, 63, 44, 15, 20, 64, 255, 255, 255, 190, 42, 43, 192, 192, 44, 15, 20, 64, 0, 0, 0, 63, 42, 43, 192, 192, 100, 155, 50, 192, 255, 255, 255, 190, 86, 155, 50, 64, 100, 155, 50, 192, 0, 0, 0, 63, 86, 155, 50, 64, 126, 248, 136, 64, 255, 255, 255, 190, 136, 248, 136, 192, 126, 248, 136, 64, 0, 0, 0, 63, 136, 248, 136, 192, 126, 209, 246, 191, 255, 255, 255, 190, 60, 140, 113, 64, 126, 209, 246, 191, 0, 0, 0, 63, 60, 140, 113, 64, 36, 43, 192, 64, 255, 255, 255, 190, 69, 15, 20, 192, 36, 43, 192, 64, 0, 0, 0, 63, 69, 15, 20, 192, 72, 204, 153, 191, 255, 255, 255, 190, 218, 147, 155, 64, 72, 204, 153, 191, 0, 0, 0, 63, 218, 147, 155, 64, 190, 173, 238, 64, 255, 255, 255, 190, 64, 133, 13, 190, 190, 173, 238, 64, 0, 0, 0, 63, 64, 133, 13, 190, 64, 125, 31, 191, 255, 255, 255, 190, 108, 30, 193, 64, 64, 125, 31, 191, 0, 0, 0, 63, 108, 30, 193, 64, 74, 218, 9, 65, 255, 255, 255, 190, 246, 81, 13, 64, 74, 218, 9, 65, 0, 0, 0, 63, 246, 81, 13, 64, 0, 103, 79, 190, 255, 255, 255, 190, 100, 193, 232, 64, 0, 103, 79, 190, 0, 0, 0, 63, 100, 193, 232, 64, 186, 78, 23, 65, 255, 255, 255, 190, 236, 238, 149, 64, 186, 78, 23, 65, 0, 0, 0, 63, 236, 238, 149, 64, 0, 167, 87, 61, 255, 255, 255, 190, 147, 231, 8, 65, 0, 167, 87, 61, 0, 0, 0, 63, 147, 231, 8, 65, 64, 121, 31, 65, 255, 255, 255, 190, 108, 10, 232, 64, 64, 121, 31, 65, 0, 0, 0, 63, 108, 10, 232, 64, 192, 132, 13, 62, 255, 255, 255, 190, 238, 201, 29, 65, 192, 132, 13, 62, 0, 0, 0, 63, 238, 201, 29, 65, 24, 54, 34, 65, 255, 255, 255, 190, 235, 201, 29, 65, 24, 54, 34, 65, 0, 0, 0, 63, 235, 201, 29, 65)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "wide_turn_small-6e237ca1d0f874ac4bdf9eea3a770eab_Cube_004"
+_surfaces = [{
+"aabb": AABB(-9.8618, -0.5, -10.1382, 20, 1, 20),
+"attribute_data": PackedByteArray(0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63),
+"format": 4119,
+"index_count": 300,
+"index_data": PackedByteArray(0, 0, 9, 0, 3, 0, 0, 0, 6, 0, 9, 0, 19, 0, 25, 0, 27, 0, 19, 0, 17, 0, 25, 0, 11, 0, 17, 0, 19, 0, 11, 0, 8, 0, 17, 0, 1, 0, 14, 0, 12, 0, 1, 0, 4, 0, 14, 0, 20, 0, 30, 0, 28, 0, 20, 0, 22, 0, 30, 0, 12, 0, 22, 0, 20, 0, 12, 0, 14, 0, 22, 0, 27, 0, 33, 0, 35, 0, 27, 0, 25, 0, 33, 0, 43, 0, 49, 0, 51, 0, 43, 0, 41, 0, 49, 0, 35, 0, 41, 0, 43, 0, 35, 0, 33, 0, 41, 0, 28, 0, 38, 0, 36, 0, 28, 0, 30, 0, 38, 0, 36, 0, 46, 0, 44, 0, 36, 0, 38, 0, 46, 0, 51, 0, 57, 0, 59, 0, 51, 0, 49, 0, 57, 0, 44, 0, 54, 0, 52, 0, 44, 0, 46, 0, 54, 0, 67, 0, 73, 0, 75, 0, 67, 0, 65, 0, 73, 0, 59, 0, 65, 0, 67, 0, 59, 0, 57, 0, 65, 0, 52, 0, 62, 0, 60, 0, 52, 0, 54, 0, 62, 0, 60, 0, 70, 0, 68, 0, 60, 0, 62, 0, 70, 0, 75, 0, 81, 0, 83, 0, 75, 0, 73, 0, 81, 0, 68, 0, 78, 0, 76, 0, 68, 0, 70, 0, 78, 0, 91, 0, 97, 0, 99, 0, 91, 0, 89, 0, 97, 0, 83, 0, 89, 0, 91, 0, 83, 0, 81, 0, 89, 0, 76, 0, 86, 0, 84, 0, 76, 0, 78, 0, 86, 0, 84, 0, 94, 0, 92, 0, 84, 0, 86, 0, 94, 0, 7, 0, 24, 0, 16, 0, 24, 0, 40, 0, 32, 0, 40, 0, 56, 0, 48, 0, 56, 0, 72, 0, 64, 0, 72, 0, 88, 0, 80, 0, 88, 0, 106, 0, 96, 0, 106, 0, 93, 0, 101, 0, 106, 0, 85, 0, 93, 0, 72, 0, 106, 0, 88, 0, 40, 0, 72, 0, 56, 0, 7, 0, 40, 0, 24, 0, 13, 0, 7, 0, 2, 0, 21, 0, 7, 0, 13, 0, 7, 0, 72, 0, 40, 0, 72, 0, 85, 0, 106, 0, 72, 0, 77, 0, 85, 0, 21, 0, 72, 0, 7, 0, 29, 0, 72, 0, 21, 0, 72, 0, 69, 0, 77, 0, 72, 0, 61, 0, 69, 0, 37, 0, 72, 0, 29, 0, 45, 0, 72, 0, 37, 0, 72, 0, 53, 0, 61, 0, 72, 0, 45, 0, 53, 0, 102, 0, 109, 0, 107, 0, 102, 0, 104, 0, 109, 0, 95, 0, 110, 0, 105, 0, 110, 0, 90, 0, 98, 0, 90, 0, 74, 0, 82, 0, 74, 0, 58, 0, 66, 0, 58, 0, 42, 0, 50, 0, 42, 0, 26, 0, 34, 0, 26, 0, 10, 0, 18, 0, 10, 0, 15, 0, 5, 0, 10, 0, 23, 0, 15, 0, 42, 0, 10, 0, 26, 0, 74, 0, 42, 0, 58, 0, 110, 0, 74, 0, 90, 0, 87, 0, 110, 0, 95, 0, 79, 0, 110, 0, 87, 0, 110, 0, 42, 0, 74, 0, 42, 0, 23, 0, 10, 0, 42, 0, 31, 0, 23, 0, 79, 0, 42, 0, 110, 0, 71, 0, 42, 0, 79, 0, 42, 0, 39, 0, 31, 0, 42, 0, 47, 0, 39, 0, 63, 0, 42, 0, 71, 0, 42, 0, 55, 0, 47, 0, 55, 0, 42, 0, 63, 0, 99, 0, 108, 0, 111, 0, 99, 0, 97, 0, 108, 0, 92, 0, 103, 0, 100, 0, 92, 0, 94, 0, 103, 0),
+"lods": [0.450927, PackedByteArray(0, 0, 9, 0, 3, 0, 0, 0, 6, 0, 9, 0, 11, 0, 17, 0, 27, 0, 11, 0, 8, 0, 17, 0, 27, 0, 17, 0, 119, 0, 27, 0, 120, 0, 43, 0, 43, 0, 120, 0, 59, 0, 59, 0, 120, 0, 121, 0, 59, 0, 81, 0, 75, 0, 75, 0, 81, 0, 91, 0, 91, 0, 81, 0, 97, 0, 91, 0, 97, 0, 108, 0, 91, 0, 108, 0, 111, 0, 1, 0, 30, 0, 12, 0, 1, 0, 4, 0, 30, 0, 12, 0, 30, 0, 20, 0, 20, 0, 30, 0, 44, 0, 44, 0, 30, 0, 70, 0, 44, 0, 70, 0, 60, 0, 60, 0, 70, 0, 68, 0, 68, 0, 70, 0, 94, 0, 68, 0, 94, 0, 84, 0, 84, 0, 94, 0, 103, 0, 84, 0, 103, 0, 100, 0, 80, 0, 106, 0, 96, 0, 106, 0, 85, 0, 101, 0, 80, 0, 85, 0, 106, 0, 80, 0, 69, 0, 85, 0, 80, 0, 61, 0, 69, 0, 80, 0, 45, 0, 61, 0, 45, 0, 80, 0, 21, 0, 21, 0, 80, 0, 7, 0, 7, 0, 80, 0, 48, 0, 7, 0, 48, 0, 16, 0, 21, 0, 7, 0, 13, 0, 13, 0, 7, 0, 2, 0, 102, 0, 109, 0, 107, 0, 102, 0, 104, 0, 109, 0, 95, 0, 110, 0, 105, 0, 95, 0, 42, 0, 110, 0, 71, 0, 42, 0, 95, 0, 110, 0, 74, 0, 90, 0, 110, 0, 42, 0, 74, 0, 74, 0, 42, 0, 58, 0, 42, 0, 71, 0, 31, 0, 42, 0, 31, 0, 10, 0, 10, 0, 31, 0, 5, 0, 42, 0, 10, 0, 26, 0), 3.03953, PackedByteArray(0, 0, 9, 0, 3, 0, 0, 0, 6, 0, 9, 0, 112, 0, 17, 0, 114, 0, 11, 0, 8, 0, 17, 0, 114, 0, 117, 0, 118, 0, 1, 0, 70, 0, 20, 0, 1, 0, 4, 0, 70, 0, 20, 0, 70, 0, 84, 0, 84, 0, 70, 0, 103, 0, 84, 0, 103, 0, 100, 0, 115, 0, 113, 0, 116, 0, 115, 0, 108, 0, 111, 0, 106, 0, 85, 0, 101, 0, 48, 0, 85, 0, 106, 0, 48, 0, 21, 0, 85, 0, 21, 0, 48, 0, 7, 0, 7, 0, 48, 0, 16, 0, 21, 0, 7, 0, 2, 0, 102, 0, 109, 0, 107, 0, 102, 0, 104, 0, 109, 0, 71, 0, 110, 0, 105, 0, 71, 0, 42, 0, 110, 0, 42, 0, 71, 0, 10, 0, 10, 0, 71, 0, 5, 0)],
+"material": ExtResource("1_vbf77"),
+"primitive": 3,
+"vertex_count": 122,
+"vertex_data": PackedByteArray(243, 201, 29, 193, 255, 255, 255, 190, 192, 131, 13, 190, 0, 0, 255, 127, 255, 127, 255, 255, 243, 201, 29, 193, 255, 255, 255, 190, 192, 131, 13, 190, 32, 120, 255, 127, 255, 255, 255, 63, 243, 201, 29, 193, 255, 255, 255, 190, 192, 131, 13, 190, 255, 127, 0, 0, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 0, 63, 192, 131, 13, 190, 0, 0, 255, 127, 255, 127, 255, 255, 243, 201, 29, 193, 0, 0, 0, 63, 192, 131, 13, 190, 32, 120, 255, 127, 255, 255, 255, 63, 243, 201, 29, 193, 0, 0, 0, 63, 192, 131, 13, 190, 255, 127, 255, 255, 255, 255, 255, 191, 243, 201, 29, 193, 255, 255, 255, 190, 15, 54, 34, 193, 0, 0, 255, 127, 255, 127, 255, 255, 243, 201, 29, 193, 255, 255, 255, 190, 15, 54, 34, 193, 255, 127, 0, 0, 255, 255, 255, 191, 243, 201, 29, 193, 255, 255, 255, 190, 15, 54, 34, 193, 255, 255, 31, 248, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 0, 63, 15, 54, 34, 193, 0, 0, 255, 127, 255, 127, 255, 255, 243, 201, 29, 193, 0, 0, 0, 63, 15, 54, 34, 193, 255, 127, 255, 255, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 0, 63, 15, 54, 34, 193, 255, 255, 31, 248, 255, 255, 255, 191, 152, 231, 8, 193, 255, 255, 255, 190, 128, 164, 87, 189, 27, 113, 255, 127, 255, 255, 255, 63, 152, 231, 8, 193, 255, 255, 255, 190, 128, 164, 87, 189, 255, 127, 0, 0, 255, 255, 255, 191, 152, 231, 8, 193, 0, 0, 0, 63, 128, 164, 87, 189, 27, 113, 255, 127, 255, 255, 255, 63, 152, 231, 8, 193, 0, 0, 0, 63, 128, 164, 87, 189, 255, 127, 255, 255, 255, 255, 255, 191, 125, 10, 232, 192, 255, 255, 255, 190, 58, 121, 31, 193, 255, 127, 0, 0, 255, 255, 255, 191, 125, 10, 232, 192, 255, 255, 255, 190, 58, 121, 31, 193, 255, 255, 27, 241, 255, 255, 255, 191, 125, 10, 232, 192, 0, 0, 0, 63, 58, 121, 31, 193, 255, 127, 255, 255, 255, 255, 255, 191, 125, 10, 232, 192, 0, 0, 0, 63, 58, 121, 31, 193, 255, 255, 27, 241, 255, 255, 255, 191, 113, 193, 232, 192, 255, 255, 255, 190, 64, 103, 79, 62, 243, 100, 255, 127, 255, 255, 255, 63, 113, 193, 232, 192, 255, 255, 255, 190, 64, 103, 79, 62, 255, 127, 0, 0, 255, 255, 255, 191, 113, 193, 232, 192, 0, 0, 0, 63, 64, 103, 79, 62, 243, 100, 255, 127, 255, 255, 255, 63, 113, 193, 232, 192, 0, 0, 0, 63, 64, 103, 79, 62, 255, 127, 255, 255, 255, 255, 255, 191, 252, 238, 149, 192, 255, 255, 255, 190, 182, 78, 23, 193, 255, 127, 0, 0, 255, 255, 255, 191, 252, 238, 149, 192, 255, 255, 255, 190, 182, 78, 23, 193, 255, 255, 242, 228, 255, 255, 255, 191, 252, 238, 149, 192, 0, 0, 0, 63, 182, 78, 23, 193, 255, 127, 255, 255, 255, 255, 255, 191, 252, 238, 149, 192, 0, 0, 0, 63, 182, 78, 23, 193, 255, 255, 242, 228, 255, 255, 255, 191, 120, 30, 193, 192, 255, 255, 255, 190, 64, 125, 31, 63, 129, 90, 255, 127, 255, 255, 255, 63, 120, 30, 193, 192, 255, 255, 255, 190, 64, 125, 31, 63, 255, 127, 0, 0, 255, 255, 255, 191, 120, 30, 193, 192, 0, 0, 0, 63, 64, 125, 31, 63, 129, 90, 255, 127, 255, 255, 255, 63, 120, 30, 193, 192, 0, 0, 0, 63, 64, 125, 31, 63, 255, 127, 255, 255, 255, 255, 255, 191, 22, 82, 13, 192, 255, 255, 255, 190, 72, 218, 9, 193, 255, 127, 0, 0, 255, 255, 255, 191, 22, 82, 13, 192, 255, 255, 255, 190, 72, 218, 9, 193, 255, 255, 129, 218, 255, 255, 255, 191, 22, 82, 13, 192, 0, 0, 0, 63, 72, 218, 9, 193, 255, 127, 255, 255, 255, 255, 255, 191, 22, 82, 13, 192, 0, 0, 0, 63, 72, 218, 9, 193, 255, 255, 129, 218, 255, 255, 255, 191, 228, 147, 155, 192, 255, 255, 255, 190, 64, 204, 153, 63, 37, 81, 255, 127, 255, 255, 255, 63, 228, 147, 155, 192, 255, 255, 255, 190, 64, 204, 153, 63, 255, 127, 0, 0, 255, 255, 255, 191, 228, 147, 155, 192, 0, 0, 0, 63, 64, 204, 153, 63, 37, 81, 255, 127, 255, 255, 255, 63, 228, 147, 155, 192, 0, 0, 0, 63, 64, 204, 153, 63, 255, 127, 255, 255, 255, 255, 255, 191, 128, 131, 13, 62, 255, 255, 255, 190, 192, 173, 238, 192, 255, 127, 0, 0, 255, 255, 255, 191, 128, 131, 13, 62, 255, 255, 255, 190, 192, 173, 238, 192, 255, 255, 37, 209, 255, 255, 255, 191, 128, 131, 13, 62, 0, 0, 0, 63, 192, 173, 238, 192, 255, 127, 255, 255, 255, 255, 255, 191, 128, 131, 13, 62, 0, 0, 0, 63, 192, 173, 238, 192, 255, 255, 37, 209, 255, 255, 255, 191, 78, 140, 113, 192, 255, 255, 255, 190, 104, 209, 246, 63, 108, 72, 255, 127, 255, 255, 255, 63, 78, 140, 113, 192, 255, 255, 255, 190, 104, 209, 246, 63, 255, 127, 0, 0, 255, 255, 255, 191, 78, 140, 113, 192, 0, 0, 0, 63, 104, 209, 246, 63, 108, 72, 255, 127, 255, 255, 255, 63, 78, 140, 113, 192, 0, 0, 0, 63, 104, 209, 246, 63, 255, 127, 255, 255, 255, 255, 255, 191, 44, 15, 20, 64, 255, 255, 255, 190, 42, 43, 192, 192, 255, 127, 0, 0, 255, 255, 255, 191, 44, 15, 20, 64, 255, 255, 255, 190, 42, 43, 192, 192, 255, 255, 108, 200, 255, 255, 255, 191, 44, 15, 20, 64, 0, 0, 0, 63, 42, 43, 192, 192, 255, 127, 255, 255, 255, 255, 255, 191, 44, 15, 20, 64, 0, 0, 0, 63, 42, 43, 192, 192, 255, 255, 108, 200, 255, 255, 255, 191, 100, 155, 50, 192, 255, 255, 255, 190, 86, 155, 50, 64, 255, 63, 255, 127, 255, 255, 255, 63, 100, 155, 50, 192, 255, 255, 255, 190, 86, 155, 50, 64, 255, 127, 0, 0, 255, 255, 255, 191, 100, 155, 50, 192, 0, 0, 0, 63, 86, 155, 50, 64, 255, 63, 255, 127, 255, 255, 255, 63, 100, 155, 50, 192, 0, 0, 0, 63, 86, 155, 50, 64, 255, 127, 255, 255, 255, 255, 255, 191, 126, 248, 136, 64, 255, 255, 255, 190, 136, 248, 136, 192, 255, 127, 0, 0, 255, 255, 255, 191, 126, 248, 136, 64, 255, 255, 255, 190, 136, 248, 136, 192, 255, 255, 255, 191, 255, 255, 255, 191, 126, 248, 136, 64, 0, 0, 0, 63, 136, 248, 136, 192, 255, 127, 255, 255, 255, 255, 255, 191, 126, 248, 136, 64, 0, 0, 0, 63, 136, 248, 136, 192, 255, 255, 255, 191, 255, 255, 255, 191, 126, 209, 246, 191, 255, 255, 255, 190, 60, 140, 113, 64, 146, 55, 255, 127, 255, 255, 255, 63, 126, 209, 246, 191, 255, 255, 255, 190, 60, 140, 113, 64, 255, 127, 0, 0, 255, 255, 255, 191, 126, 209, 246, 191, 0, 0, 0, 63, 60, 140, 113, 64, 146, 55, 255, 127, 255, 255, 255, 63, 126, 209, 246, 191, 0, 0, 0, 63, 60, 140, 113, 64, 255, 127, 255, 255, 255, 255, 255, 191, 36, 43, 192, 64, 255, 255, 255, 190, 69, 15, 20, 192, 255, 127, 0, 0, 255, 255, 255, 191, 36, 43, 192, 64, 255, 255, 255, 190, 69, 15, 20, 192, 255, 255, 146, 183, 255, 255, 255, 191, 36, 43, 192, 64, 0, 0, 0, 63, 69, 15, 20, 192, 255, 127, 255, 255, 255, 255, 255, 191, 36, 43, 192, 64, 0, 0, 0, 63, 69, 15, 20, 192, 255, 255, 146, 183, 255, 255, 255, 191, 72, 204, 153, 191, 255, 255, 255, 190, 218, 147, 155, 64, 217, 46, 255, 127, 255, 255, 255, 63, 72, 204, 153, 191, 255, 255, 255, 190, 218, 147, 155, 64, 255, 127, 0, 0, 255, 255, 255, 191, 72, 204, 153, 191, 0, 0, 0, 63, 218, 147, 155, 64, 217, 46, 255, 127, 255, 255, 255, 63, 72, 204, 153, 191, 0, 0, 0, 63, 218, 147, 155, 64, 255, 127, 255, 255, 255, 255, 255, 191, 190, 173, 238, 64, 255, 255, 255, 190, 64, 133, 13, 190, 255, 127, 0, 0, 255, 255, 255, 191, 190, 173, 238, 64, 255, 255, 255, 190, 64, 133, 13, 190, 255, 255, 217, 174, 255, 255, 255, 191, 190, 173, 238, 64, 0, 0, 0, 63, 64, 133, 13, 190, 255, 127, 255, 255, 255, 255, 255, 191, 190, 173, 238, 64, 0, 0, 0, 63, 64, 133, 13, 190, 255, 255, 217, 174, 255, 255, 255, 191, 64, 125, 31, 191, 255, 255, 255, 190, 108, 30, 193, 64, 125, 37, 255, 127, 255, 255, 255, 63, 64, 125, 31, 191, 255, 255, 255, 190, 108, 30, 193, 64, 255, 127, 0, 0, 255, 255, 255, 191, 64, 125, 31, 191, 0, 0, 0, 63, 108, 30, 193, 64, 125, 37, 255, 127, 255, 255, 255, 63, 64, 125, 31, 191, 0, 0, 0, 63, 108, 30, 193, 64, 255, 127, 255, 255, 255, 255, 255, 191, 74, 218, 9, 65, 255, 255, 255, 190, 246, 81, 13, 64, 255, 127, 0, 0, 255, 255, 255, 191, 74, 218, 9, 65, 255, 255, 255, 190, 246, 81, 13, 64, 255, 255, 125, 165, 255, 255, 255, 191, 74, 218, 9, 65, 0, 0, 0, 63, 246, 81, 13, 64, 255, 127, 255, 255, 255, 255, 255, 191, 74, 218, 9, 65, 0, 0, 0, 63, 246, 81, 13, 64, 255, 255, 125, 165, 255, 255, 255, 191, 0, 103, 79, 190, 255, 255, 255, 190, 100, 193, 232, 64, 12, 27, 255, 127, 255, 255, 255, 63, 0, 103, 79, 190, 255, 255, 255, 190, 100, 193, 232, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 103, 79, 190, 0, 0, 0, 63, 100, 193, 232, 64, 12, 27, 255, 127, 255, 255, 255, 63, 0, 103, 79, 190, 0, 0, 0, 63, 100, 193, 232, 64, 255, 127, 255, 255, 255, 255, 255, 191, 186, 78, 23, 65, 255, 255, 255, 190, 236, 238, 149, 64, 255, 127, 0, 0, 255, 255, 255, 191, 186, 78, 23, 65, 255, 255, 255, 190, 236, 238, 149, 64, 255, 255, 11, 155, 255, 255, 255, 191, 186, 78, 23, 65, 0, 0, 0, 63, 236, 238, 149, 64, 255, 127, 255, 255, 255, 255, 255, 191, 186, 78, 23, 65, 0, 0, 0, 63, 236, 238, 149, 64, 255, 255, 11, 155, 255, 255, 255, 191, 0, 167, 87, 61, 255, 255, 255, 190, 147, 231, 8, 65, 227, 14, 255, 127, 255, 255, 255, 63, 0, 167, 87, 61, 255, 255, 255, 190, 147, 231, 8, 65, 255, 127, 0, 0, 255, 255, 255, 191, 0, 167, 87, 61, 0, 0, 0, 63, 147, 231, 8, 65, 227, 14, 255, 127, 255, 255, 255, 63, 0, 167, 87, 61, 0, 0, 0, 63, 147, 231, 8, 65, 255, 127, 255, 255, 255, 255, 255, 191, 64, 121, 31, 65, 255, 255, 255, 190, 108, 10, 232, 64, 255, 127, 0, 0, 255, 255, 255, 191, 64, 121, 31, 65, 255, 255, 255, 190, 108, 10, 232, 64, 255, 255, 227, 142, 255, 255, 255, 191, 64, 121, 31, 65, 0, 0, 0, 63, 108, 10, 232, 64, 255, 127, 255, 255, 255, 255, 255, 191, 64, 121, 31, 65, 0, 0, 0, 63, 108, 10, 232, 64, 255, 255, 227, 142, 255, 255, 255, 191, 192, 132, 13, 62, 255, 255, 255, 190, 238, 201, 29, 65, 223, 7, 255, 127, 255, 255, 255, 63, 192, 132, 13, 62, 255, 255, 255, 190, 238, 201, 29, 65, 255, 127, 0, 0, 255, 255, 255, 191, 192, 132, 13, 62, 255, 255, 255, 190, 238, 201, 29, 65, 255, 127, 255, 127, 255, 127, 0, 0, 192, 132, 13, 62, 0, 0, 0, 63, 238, 201, 29, 65, 223, 7, 255, 127, 255, 255, 255, 63, 192, 132, 13, 62, 0, 0, 0, 63, 238, 201, 29, 65, 255, 127, 255, 127, 255, 127, 0, 0, 192, 132, 13, 62, 0, 0, 0, 63, 238, 201, 29, 65, 255, 127, 255, 255, 255, 255, 255, 191, 24, 54, 34, 65, 255, 255, 255, 190, 235, 201, 29, 65, 255, 127, 0, 0, 255, 255, 255, 191, 24, 54, 34, 65, 255, 255, 255, 190, 235, 201, 29, 65, 255, 127, 255, 127, 255, 127, 0, 0, 24, 54, 34, 65, 255, 255, 255, 190, 235, 201, 29, 65, 255, 255, 222, 135, 255, 255, 255, 191, 24, 54, 34, 65, 0, 0, 0, 63, 235, 201, 29, 65, 255, 127, 255, 127, 255, 127, 0, 0, 24, 54, 34, 65, 0, 0, 0, 63, 235, 201, 29, 65, 255, 127, 255, 255, 255, 255, 255, 191, 24, 54, 34, 65, 0, 0, 0, 63, 235, 201, 29, 65, 255, 255, 222, 135, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 0, 63, 15, 54, 34, 193, 5, 208, 1, 247, 255, 255, 255, 191, 125, 10, 232, 192, 255, 255, 255, 190, 58, 121, 31, 193, 175, 217, 238, 24, 255, 255, 255, 191, 128, 131, 13, 62, 0, 0, 0, 63, 192, 173, 238, 192, 176, 151, 208, 250, 255, 255, 255, 191, 128, 131, 13, 62, 0, 0, 0, 63, 192, 173, 238, 192, 219, 251, 254, 62, 255, 255, 255, 191, 44, 15, 20, 64, 255, 255, 255, 190, 42, 43, 192, 192, 89, 237, 252, 38, 255, 255, 255, 191, 44, 15, 20, 64, 255, 255, 255, 190, 42, 43, 192, 192, 26, 157, 215, 242, 255, 255, 255, 191, 24, 54, 34, 65, 255, 255, 255, 190, 235, 201, 29, 65, 184, 130, 195, 254, 255, 255, 255, 191, 44, 15, 20, 64, 255, 255, 255, 190, 42, 43, 192, 192, 163, 202, 154, 21, 255, 255, 255, 191, 44, 15, 20, 64, 255, 255, 255, 190, 42, 43, 192, 192, 232, 245, 171, 49, 255, 255, 255, 191, 74, 218, 9, 65, 255, 255, 255, 190, 246, 81, 13, 64, 73, 195, 71, 36, 255, 255, 255, 191)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_qwqmo")
diff --git a/assets/meshes/platforms/turn.tres b/assets/meshes/platforms/turn.tres
new file mode 100644
index 0000000..e56d5ac
--- /dev/null
+++ b/assets/meshes/platforms/turn.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://dgxce0yrvqmg5"]
+
+[ext_resource type="Material" uid="uid://cwyjtikumcq3k" path="res://assets/mats/platform.material" id="1_nyynq"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_5b2tc"]
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -5, 10, 1, 10),
+"format": 4097,
+"index_count": 180,
+"index_data": PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 7, 0, 5, 0, 19, 0, 7, 0, 4, 0, 5, 0, 5, 0, 21, 0, 19, 0, 21, 0, 23, 0, 22, 0, 23, 0, 25, 0, 24, 0, 25, 0, 27, 0, 26, 0, 27, 0, 29, 0, 28, 0, 29, 0, 31, 0, 30, 0, 31, 0, 3, 0, 20, 0, 3, 0, 5, 0, 1, 0, 5, 0, 23, 0, 21, 0, 23, 0, 27, 0, 25, 0, 27, 0, 31, 0, 29, 0, 31, 0, 5, 0, 3, 0, 5, 0, 27, 0, 23, 0, 27, 0, 5, 0, 31, 0, 4, 0, 1, 0, 5, 0, 4, 0, 0, 0, 1, 0, 2, 0, 20, 0, 3, 0, 2, 0, 6, 0, 20, 0, 19, 0, 18, 0, 7, 0, 19, 0, 21, 0, 18, 0, 21, 0, 17, 0, 18, 0, 21, 0, 22, 0, 17, 0, 22, 0, 16, 0, 17, 0, 22, 0, 23, 0, 16, 0, 23, 0, 15, 0, 16, 0, 23, 0, 24, 0, 15, 0, 24, 0, 14, 0, 15, 0, 24, 0, 25, 0, 14, 0, 25, 0, 13, 0, 14, 0, 25, 0, 26, 0, 13, 0, 26, 0, 12, 0, 13, 0, 26, 0, 27, 0, 12, 0, 27, 0, 11, 0, 12, 0, 27, 0, 28, 0, 11, 0, 28, 0, 10, 0, 11, 0, 28, 0, 29, 0, 10, 0, 29, 0, 9, 0, 10, 0, 29, 0, 30, 0, 9, 0, 30, 0, 8, 0, 9, 0, 30, 0, 31, 0, 8, 0, 31, 0, 6, 0, 8, 0, 31, 0, 20, 0, 6, 0, 0, 0, 6, 0, 2, 0, 6, 0, 9, 0, 8, 0, 9, 0, 11, 0, 10, 0, 11, 0, 13, 0, 12, 0, 13, 0, 15, 0, 14, 0, 15, 0, 17, 0, 16, 0, 17, 0, 7, 0, 18, 0, 7, 0, 0, 0, 4, 0, 0, 0, 9, 0, 6, 0, 9, 0, 13, 0, 11, 0, 13, 0, 17, 0, 15, 0, 17, 0, 0, 0, 7, 0, 0, 0, 13, 0, 9, 0, 13, 0, 0, 0, 17, 0),
+"lods": [0.396738, PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 7, 0, 5, 0, 19, 0, 7, 0, 4, 0, 5, 0, 19, 0, 14, 0, 7, 0, 19, 0, 22, 0, 14, 0, 22, 0, 24, 0, 14, 0, 24, 0, 25, 0, 14, 0, 25, 0, 10, 0, 14, 0, 25, 0, 28, 0, 10, 0, 28, 0, 8, 0, 10, 0, 28, 0, 30, 0, 8, 0, 2, 0, 8, 0, 30, 0, 2, 0, 30, 0, 3, 0, 19, 0, 24, 0, 22, 0, 5, 0, 24, 0, 19, 0, 5, 0, 25, 0, 24, 0, 25, 0, 5, 0, 30, 0, 25, 0, 30, 0, 28, 0, 30, 0, 5, 0, 3, 0, 3, 0, 5, 0, 1, 0, 4, 0, 1, 0, 5, 0, 4, 0, 0, 0, 1, 0, 0, 0, 8, 0, 2, 0, 0, 0, 10, 0, 8, 0, 10, 0, 0, 0, 14, 0, 14, 0, 0, 0, 7, 0, 7, 0, 0, 0, 4, 0), 1.82825, PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 7, 0, 5, 0, 28, 0, 28, 0, 14, 0, 7, 0, 7, 0, 4, 0, 5, 0, 3, 0, 5, 0, 1, 0, 28, 0, 5, 0, 3, 0, 4, 0, 1, 0, 5, 0, 4, 0, 0, 0, 1, 0, 2, 0, 28, 0, 3, 0, 2, 0, 14, 0, 28, 0, 0, 0, 14, 0, 2, 0, 14, 0, 0, 0, 7, 0, 7, 0, 0, 0, 4, 0)],
+"primitive": 3,
+"vertex_count": 32,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 128, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 128, 64, 34, 209, 52, 192, 0, 0, 0, 191, 64, 137, 157, 192, 40, 215, 213, 191, 0, 0, 0, 191, 200, 47, 150, 192, 32, 76, 14, 191, 0, 0, 0, 191, 202, 19, 138, 192, 0, 0, 0, 63, 0, 0, 0, 191, 164, 212, 114, 192, 12, 75, 189, 63, 0, 0, 0, 191, 180, 248, 72, 192, 34, 75, 23, 64, 0, 0, 0, 191, 34, 75, 23, 192, 180, 248, 72, 64, 0, 0, 0, 191, 12, 75, 189, 191, 164, 212, 114, 64, 0, 0, 0, 191, 0, 0, 0, 191, 202, 19, 138, 64, 0, 0, 0, 191, 32, 76, 14, 63, 200, 47, 150, 64, 0, 0, 0, 191, 40, 215, 213, 63, 64, 137, 157, 64, 0, 0, 0, 191, 34, 209, 52, 64, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 128, 64, 0, 0, 128, 192, 0, 0, 0, 63, 0, 0, 160, 192, 64, 137, 157, 64, 0, 0, 0, 63, 34, 209, 52, 64, 200, 47, 150, 64, 0, 0, 0, 63, 40, 215, 213, 63, 202, 19, 138, 64, 0, 0, 0, 63, 32, 76, 14, 63, 164, 212, 114, 64, 0, 0, 0, 63, 0, 0, 0, 191, 180, 248, 72, 64, 0, 0, 0, 63, 12, 75, 189, 191, 34, 75, 23, 64, 0, 0, 0, 63, 34, 75, 23, 192, 12, 75, 189, 63, 0, 0, 0, 63, 180, 248, 72, 192, 0, 0, 0, 63, 0, 0, 0, 63, 164, 212, 114, 192, 32, 76, 14, 191, 0, 0, 0, 63, 202, 19, 138, 192, 40, 215, 213, 191, 0, 0, 0, 63, 200, 47, 150, 192, 34, 209, 52, 192, 0, 0, 0, 63, 64, 137, 157, 192)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "turn_Cube001"
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -5, 10, 1, 10),
+"attribute_data": PackedByteArray(0, 0, 0, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 96, 63, 0, 0, 128, 62, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 154, 153, 25, 62, 0, 0, 0, 63, 0, 0, 192, 62, 154, 153, 57, 63, 255, 255, 191, 62, 206, 204, 140, 62, 0, 0, 192, 62, 206, 204, 140, 62, 89, 172, 55, 62, 180, 3, 255, 62, 0, 0, 192, 62, 234, 20, 50, 63, 94, 59, 85, 62, 28, 19, 252, 62, 0, 0, 192, 62, 40, 177, 42, 63, 50, 197, 113, 62, 28, 59, 247, 62, 0, 0, 192, 62, 180, 142, 35, 63, 103, 102, 134, 62, 236, 144, 240, 62, 0, 0, 192, 62, 205, 204, 28, 63, 232, 237, 146, 62, 188, 49, 232, 62, 0, 0, 192, 62, 12, 137, 22, 63, 57, 66, 158, 62, 60, 66, 222, 62, 0, 0, 192, 62, 0, 0, 0, 63, 188, 49, 168, 62, 232, 237, 210, 62, 0, 0, 192, 62, 232, 237, 210, 62, 238, 144, 176, 62, 102, 102, 198, 62, 0, 0, 192, 62, 104, 102, 198, 62, 30, 59, 183, 62, 152, 226, 184, 62, 0, 0, 192, 62, 152, 226, 184, 62, 28, 19, 188, 62, 176, 157, 170, 62, 1, 0, 192, 62, 174, 157, 170, 62, 179, 3, 191, 62, 46, 214, 155, 62, 0, 0, 192, 62, 44, 214, 155, 62, 0, 0, 32, 63, 206, 204, 140, 62, 0, 0, 32, 63, 206, 204, 140, 62, 0, 0, 32, 63, 154, 153, 57, 63, 153, 153, 89, 63, 0, 0, 0, 63, 0, 0, 32, 63, 44, 214, 155, 62, 38, 126, 32, 63, 46, 214, 155, 62, 0, 0, 32, 63, 176, 157, 170, 62, 114, 246, 33, 63, 176, 157, 170, 62, 0, 0, 32, 63, 152, 226, 184, 62, 112, 98, 36, 63, 152, 226, 184, 62, 0, 0, 32, 63, 104, 102, 198, 62, 138, 183, 39, 63, 102, 102, 198, 62, 0, 0, 32, 63, 232, 237, 210, 62, 33, 231, 43, 63, 232, 237, 210, 62, 0, 0, 32, 63, 0, 0, 0, 63, 228, 222, 48, 63, 58, 66, 222, 62, 0, 0, 32, 63, 12, 137, 22, 63, 11, 137, 54, 63, 190, 49, 232, 62, 0, 0, 32, 63, 205, 204, 28, 63, 204, 204, 60, 63, 240, 144, 240, 62, 0, 0, 32, 63, 180, 142, 35, 63, 180, 142, 67, 63, 30, 59, 247, 62, 0, 0, 32, 63, 40, 177, 42, 63, 40, 177, 74, 63, 28, 19, 252, 62, 0, 0, 32, 63, 234, 20, 50, 63, 233, 20, 82, 63, 180, 3, 255, 62, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 128, 62, 255, 255, 191, 62, 206, 204, 140, 62, 255, 255, 191, 62, 206, 204, 140, 62, 0, 0, 192, 62, 232, 237, 210, 62, 0, 0, 192, 62, 232, 237, 210, 62, 0, 0, 32, 63, 205, 204, 28, 63, 0, 0, 32, 63, 205, 204, 28, 63, 0, 0, 192, 62, 232, 237, 210, 62),
+"format": 4119,
+"index_count": 180,
+"index_data": PackedByteArray(2, 0, 9, 0, 4, 0, 2, 0, 7, 0, 9, 0, 20, 0, 17, 0, 45, 0, 20, 0, 14, 0, 17, 0, 16, 0, 49, 0, 44, 0, 49, 0, 53, 0, 51, 0, 53, 0, 57, 0, 55, 0, 57, 0, 61, 0, 59, 0, 61, 0, 65, 0, 63, 0, 65, 0, 69, 0, 67, 0, 69, 0, 11, 0, 47, 0, 11, 0, 16, 0, 5, 0, 16, 0, 53, 0, 49, 0, 53, 0, 61, 0, 57, 0, 61, 0, 69, 0, 65, 0, 69, 0, 16, 0, 11, 0, 16, 0, 61, 0, 53, 0, 61, 0, 16, 0, 69, 0, 13, 0, 3, 0, 15, 0, 13, 0, 1, 0, 3, 0, 8, 0, 46, 0, 10, 0, 8, 0, 19, 0, 46, 0, 45, 0, 43, 0, 20, 0, 45, 0, 48, 0, 43, 0, 48, 0, 41, 0, 43, 0, 48, 0, 50, 0, 41, 0, 50, 0, 39, 0, 41, 0, 50, 0, 52, 0, 39, 0, 52, 0, 37, 0, 39, 0, 52, 0, 54, 0, 37, 0, 54, 0, 35, 0, 37, 0, 54, 0, 56, 0, 35, 0, 56, 0, 33, 0, 35, 0, 56, 0, 58, 0, 33, 0, 58, 0, 31, 0, 33, 0, 58, 0, 60, 0, 31, 0, 60, 0, 29, 0, 31, 0, 60, 0, 62, 0, 29, 0, 62, 0, 27, 0, 29, 0, 62, 0, 64, 0, 27, 0, 64, 0, 25, 0, 27, 0, 64, 0, 66, 0, 25, 0, 66, 0, 23, 0, 25, 0, 66, 0, 68, 0, 23, 0, 68, 0, 19, 0, 23, 0, 68, 0, 46, 0, 19, 0, 0, 0, 18, 0, 6, 0, 18, 0, 24, 0, 22, 0, 24, 0, 28, 0, 26, 0, 28, 0, 32, 0, 30, 0, 32, 0, 36, 0, 34, 0, 36, 0, 40, 0, 38, 0, 40, 0, 21, 0, 42, 0, 21, 0, 0, 0, 12, 0, 0, 0, 24, 0, 18, 0, 24, 0, 32, 0, 28, 0, 32, 0, 40, 0, 36, 0, 40, 0, 0, 0, 21, 0, 0, 0, 32, 0, 24, 0, 32, 0, 0, 0, 40, 0),
+"lods": [0.396738, PackedByteArray(2, 0, 9, 0, 4, 0, 2, 0, 7, 0, 9, 0, 20, 0, 17, 0, 45, 0, 20, 0, 14, 0, 17, 0, 45, 0, 35, 0, 20, 0, 45, 0, 50, 0, 78, 0, 50, 0, 54, 0, 35, 0, 54, 0, 56, 0, 35, 0, 56, 0, 27, 0, 35, 0, 56, 0, 62, 0, 27, 0, 62, 0, 23, 0, 27, 0, 62, 0, 66, 0, 23, 0, 8, 0, 23, 0, 66, 0, 8, 0, 66, 0, 10, 0, 44, 0, 55, 0, 51, 0, 16, 0, 55, 0, 44, 0, 16, 0, 57, 0, 55, 0, 57, 0, 16, 0, 67, 0, 57, 0, 67, 0, 63, 0, 67, 0, 16, 0, 11, 0, 11, 0, 16, 0, 5, 0, 13, 0, 3, 0, 15, 0, 13, 0, 1, 0, 3, 0, 0, 0, 22, 0, 6, 0, 0, 0, 26, 0, 22, 0, 26, 0, 0, 0, 34, 0, 34, 0, 0, 0, 21, 0, 21, 0, 0, 0, 12, 0), 1.82825, PackedByteArray(2, 0, 9, 0, 4, 0, 2, 0, 7, 0, 9, 0, 72, 0, 71, 0, 76, 0, 76, 0, 75, 0, 73, 0, 20, 0, 14, 0, 17, 0, 11, 0, 16, 0, 5, 0, 63, 0, 16, 0, 11, 0, 13, 0, 3, 0, 15, 0, 13, 0, 1, 0, 3, 0, 8, 0, 62, 0, 10, 0, 70, 0, 74, 0, 77, 0, 0, 0, 34, 0, 6, 0, 34, 0, 0, 0, 21, 0, 21, 0, 0, 0, 12, 0)],
+"material": ExtResource("1_nyynq"),
+"primitive": 3,
+"vertex_count": 79,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 254, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 255, 0, 0, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 255, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 127, 255, 255, 0, 0, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 64, 255, 127, 255, 255, 0, 0, 255, 191, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 128, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 128, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 240, 251, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 128, 64, 255, 255, 13, 132, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 128, 64, 255, 127, 0, 0, 254, 255, 255, 191, 34, 209, 52, 192, 0, 0, 0, 191, 64, 137, 157, 192, 255, 127, 0, 0, 254, 255, 255, 191, 34, 209, 52, 192, 0, 0, 0, 191, 64, 137, 157, 192, 255, 255, 27, 241, 255, 127, 255, 255, 40, 215, 213, 191, 0, 0, 0, 191, 200, 47, 150, 192, 255, 127, 0, 0, 255, 255, 255, 191, 40, 215, 213, 191, 0, 0, 0, 191, 200, 47, 150, 192, 255, 255, 242, 228, 255, 127, 255, 255, 32, 76, 14, 191, 0, 0, 0, 191, 202, 19, 138, 192, 255, 127, 0, 0, 255, 255, 255, 191, 32, 76, 14, 191, 0, 0, 0, 191, 202, 19, 138, 192, 255, 255, 129, 218, 255, 127, 255, 255, 0, 0, 0, 63, 0, 0, 0, 191, 164, 212, 114, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 0, 63, 0, 0, 0, 191, 164, 212, 114, 192, 255, 255, 37, 209, 255, 127, 255, 255, 12, 75, 189, 63, 0, 0, 0, 191, 180, 248, 72, 192, 255, 127, 0, 0, 255, 255, 255, 191, 12, 75, 189, 63, 0, 0, 0, 191, 180, 248, 72, 192, 255, 255, 108, 200, 255, 127, 255, 255, 34, 75, 23, 64, 0, 0, 0, 191, 34, 75, 23, 192, 255, 127, 0, 0, 255, 255, 255, 191, 34, 75, 23, 64, 0, 0, 0, 191, 34, 75, 23, 192, 255, 255, 255, 191, 255, 127, 255, 255, 180, 248, 72, 64, 0, 0, 0, 191, 12, 75, 189, 191, 255, 127, 0, 0, 255, 255, 255, 191, 180, 248, 72, 64, 0, 0, 0, 191, 12, 75, 189, 191, 255, 255, 146, 183, 255, 127, 255, 255, 164, 212, 114, 64, 0, 0, 0, 191, 0, 0, 0, 191, 255, 127, 0, 0, 255, 255, 255, 191, 164, 212, 114, 64, 0, 0, 0, 191, 0, 0, 0, 191, 255, 255, 217, 174, 255, 127, 255, 255, 202, 19, 138, 64, 0, 0, 0, 191, 32, 76, 14, 63, 255, 127, 0, 0, 255, 255, 255, 191, 202, 19, 138, 64, 0, 0, 0, 191, 32, 76, 14, 63, 255, 255, 125, 165, 255, 127, 254, 255, 200, 47, 150, 64, 0, 0, 0, 191, 40, 215, 213, 63, 255, 127, 0, 0, 255, 255, 255, 191, 200, 47, 150, 64, 0, 0, 0, 191, 40, 215, 213, 63, 255, 255, 11, 155, 255, 127, 254, 255, 64, 137, 157, 64, 0, 0, 0, 191, 34, 209, 52, 64, 255, 127, 0, 0, 254, 255, 255, 191, 64, 137, 157, 64, 0, 0, 0, 191, 34, 209, 52, 64, 255, 255, 227, 142, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 128, 64, 255, 127, 255, 255, 0, 0, 255, 191, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 128, 64, 255, 255, 13, 132, 255, 127, 255, 255, 0, 0, 128, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 255, 240, 251, 255, 127, 255, 255, 0, 0, 128, 192, 0, 0, 0, 63, 0, 0, 160, 192, 255, 127, 255, 255, 0, 0, 255, 191, 64, 137, 157, 64, 0, 0, 0, 63, 34, 209, 52, 64, 255, 255, 227, 142, 255, 127, 254, 255, 64, 137, 157, 64, 0, 0, 0, 63, 34, 209, 52, 64, 255, 127, 255, 255, 0, 0, 255, 191, 200, 47, 150, 64, 0, 0, 0, 63, 40, 215, 213, 63, 255, 255, 11, 155, 255, 127, 254, 255, 200, 47, 150, 64, 0, 0, 0, 63, 40, 215, 213, 63, 255, 127, 255, 255, 0, 0, 255, 191, 202, 19, 138, 64, 0, 0, 0, 63, 32, 76, 14, 63, 255, 255, 125, 165, 255, 127, 255, 255, 202, 19, 138, 64, 0, 0, 0, 63, 32, 76, 14, 63, 255, 127, 255, 255, 0, 0, 255, 191, 164, 212, 114, 64, 0, 0, 0, 63, 0, 0, 0, 191, 255, 255, 217, 174, 255, 127, 255, 255, 164, 212, 114, 64, 0, 0, 0, 63, 0, 0, 0, 191, 255, 127, 255, 255, 0, 0, 255, 191, 180, 248, 72, 64, 0, 0, 0, 63, 12, 75, 189, 191, 255, 255, 146, 183, 255, 127, 255, 255, 180, 248, 72, 64, 0, 0, 0, 63, 12, 75, 189, 191, 255, 127, 255, 255, 0, 0, 255, 191, 34, 75, 23, 64, 0, 0, 0, 63, 34, 75, 23, 192, 255, 255, 255, 191, 255, 127, 255, 255, 34, 75, 23, 64, 0, 0, 0, 63, 34, 75, 23, 192, 255, 127, 255, 255, 0, 0, 255, 191, 12, 75, 189, 63, 0, 0, 0, 63, 180, 248, 72, 192, 255, 255, 108, 200, 255, 127, 255, 255, 12, 75, 189, 63, 0, 0, 0, 63, 180, 248, 72, 192, 255, 127, 255, 255, 0, 0, 255, 191, 0, 0, 0, 63, 0, 0, 0, 63, 164, 212, 114, 192, 255, 255, 37, 209, 255, 127, 255, 255, 0, 0, 0, 63, 0, 0, 0, 63, 164, 212, 114, 192, 255, 127, 255, 255, 0, 0, 255, 191, 32, 76, 14, 191, 0, 0, 0, 63, 202, 19, 138, 192, 255, 255, 129, 218, 255, 127, 255, 255, 32, 76, 14, 191, 0, 0, 0, 63, 202, 19, 138, 192, 255, 127, 255, 255, 0, 0, 255, 191, 40, 215, 213, 191, 0, 0, 0, 63, 200, 47, 150, 192, 255, 255, 242, 228, 255, 127, 255, 255, 40, 215, 213, 191, 0, 0, 0, 63, 200, 47, 150, 192, 255, 127, 255, 255, 0, 0, 255, 191, 34, 209, 52, 192, 0, 0, 0, 63, 64, 137, 157, 192, 255, 255, 27, 241, 255, 127, 255, 255, 34, 209, 52, 192, 0, 0, 0, 63, 64, 137, 157, 192, 255, 127, 255, 255, 0, 0, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 31, 143, 76, 4, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 63, 0, 0, 160, 64, 166, 176, 138, 210, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 128, 64, 145, 210, 11, 181, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 128, 64, 145, 141, 240, 247, 255, 127, 255, 255, 180, 248, 72, 64, 0, 0, 0, 191, 12, 75, 189, 191, 14, 140, 106, 4, 255, 127, 255, 255, 180, 248, 72, 64, 0, 0, 0, 191, 12, 75, 189, 191, 118, 189, 245, 220, 255, 127, 255, 255, 0, 0, 0, 63, 0, 0, 0, 63, 164, 212, 114, 192, 9, 144, 48, 244, 255, 127, 255, 255, 0, 0, 0, 63, 0, 0, 0, 63, 164, 212, 114, 192, 64, 179, 11, 17, 255, 127, 255, 255, 180, 248, 72, 64, 0, 0, 0, 191, 12, 75, 189, 191, 27, 213, 155, 61, 255, 127, 255, 255)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_5b2tc")
diff --git a/assets/meshes/platforms/wide_turn.tres b/assets/meshes/platforms/wide_turn.tres
new file mode 100644
index 0000000..b079a53
--- /dev/null
+++ b/assets/meshes/platforms/wide_turn.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://1uh80csnupve"]
+
+[ext_resource type="Material" uid="uid://cwyjtikumcq3k" path="res://assets/mats/platform.material" id="1_cn4c6"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_jt4yp"]
+_surfaces = [{
+"aabb": AABB(-25, -5, -25, 30, 1, 30),
+"format": 4097,
+"index_count": 300,
+"index_data": PackedByteArray(0, 0, 3, 0, 2, 0, 0, 0, 1, 0, 3, 0, 2, 0, 5, 0, 4, 0, 2, 0, 3, 0, 5, 0, 4, 0, 7, 0, 6, 0, 4, 0, 5, 0, 7, 0, 6, 0, 9, 0, 8, 0, 6, 0, 7, 0, 9, 0, 8, 0, 11, 0, 10, 0, 8, 0, 9, 0, 11, 0, 10, 0, 13, 0, 12, 0, 10, 0, 11, 0, 13, 0, 12, 0, 15, 0, 14, 0, 12, 0, 13, 0, 15, 0, 14, 0, 17, 0, 16, 0, 14, 0, 15, 0, 17, 0, 16, 0, 19, 0, 18, 0, 16, 0, 17, 0, 19, 0, 18, 0, 21, 0, 20, 0, 18, 0, 19, 0, 21, 0, 20, 0, 23, 0, 22, 0, 20, 0, 21, 0, 23, 0, 22, 0, 25, 0, 24, 0, 22, 0, 23, 0, 25, 0, 26, 0, 29, 0, 27, 0, 26, 0, 28, 0, 29, 0, 28, 0, 31, 0, 29, 0, 28, 0, 30, 0, 31, 0, 30, 0, 33, 0, 31, 0, 30, 0, 32, 0, 33, 0, 32, 0, 35, 0, 33, 0, 32, 0, 34, 0, 35, 0, 34, 0, 37, 0, 35, 0, 34, 0, 36, 0, 37, 0, 36, 0, 39, 0, 37, 0, 36, 0, 38, 0, 39, 0, 38, 0, 41, 0, 39, 0, 38, 0, 40, 0, 41, 0, 40, 0, 43, 0, 41, 0, 40, 0, 42, 0, 43, 0, 42, 0, 45, 0, 43, 0, 42, 0, 44, 0, 45, 0, 44, 0, 47, 0, 45, 0, 44, 0, 46, 0, 47, 0, 46, 0, 49, 0, 47, 0, 46, 0, 48, 0, 49, 0, 48, 0, 51, 0, 49, 0, 48, 0, 50, 0, 51, 0, 22, 0, 46, 0, 20, 0, 22, 0, 48, 0, 46, 0, 7, 0, 35, 0, 9, 0, 7, 0, 33, 0, 35, 0, 17, 0, 45, 0, 19, 0, 17, 0, 43, 0, 45, 0, 25, 0, 50, 0, 24, 0, 25, 0, 51, 0, 50, 0, 8, 0, 32, 0, 6, 0, 8, 0, 34, 0, 32, 0, 18, 0, 42, 0, 16, 0, 18, 0, 44, 0, 42, 0, 3, 0, 31, 0, 5, 0, 3, 0, 29, 0, 31, 0, 13, 0, 41, 0, 15, 0, 13, 0, 39, 0, 41, 0, 23, 0, 51, 0, 25, 0, 23, 0, 49, 0, 51, 0, 4, 0, 28, 0, 2, 0, 4, 0, 30, 0, 28, 0, 14, 0, 38, 0, 12, 0, 14, 0, 40, 0, 38, 0, 24, 0, 48, 0, 22, 0, 24, 0, 50, 0, 48, 0, 9, 0, 37, 0, 11, 0, 9, 0, 35, 0, 37, 0, 19, 0, 47, 0, 21, 0, 19, 0, 45, 0, 47, 0, 0, 0, 27, 0, 1, 0, 0, 0, 26, 0, 27, 0, 10, 0, 34, 0, 8, 0, 10, 0, 36, 0, 34, 0, 20, 0, 44, 0, 18, 0, 20, 0, 46, 0, 44, 0, 5, 0, 33, 0, 7, 0, 5, 0, 31, 0, 33, 0, 15, 0, 43, 0, 17, 0, 15, 0, 41, 0, 43, 0, 6, 0, 30, 0, 4, 0, 6, 0, 32, 0, 30, 0, 16, 0, 40, 0, 14, 0, 16, 0, 42, 0, 40, 0, 1, 0, 29, 0, 3, 0, 1, 0, 27, 0, 29, 0, 11, 0, 39, 0, 13, 0, 11, 0, 37, 0, 39, 0, 21, 0, 49, 0, 23, 0, 21, 0, 47, 0, 49, 0, 2, 0, 26, 0, 0, 0, 2, 0, 28, 0, 26, 0, 12, 0, 36, 0, 10, 0, 12, 0, 38, 0, 36, 0),
+"lods": [0.256613, PackedByteArray(0, 0, 3, 0, 4, 0, 0, 0, 1, 0, 3, 0, 4, 0, 3, 0, 9, 0, 4, 0, 9, 0, 6, 0, 6, 0, 9, 0, 11, 0, 6, 0, 11, 0, 10, 0, 10, 0, 11, 0, 13, 0, 10, 0, 13, 0, 14, 0, 14, 0, 13, 0, 17, 0, 14, 0, 17, 0, 18, 0, 18, 0, 17, 0, 23, 0, 18, 0, 23, 0, 22, 0, 22, 0, 23, 0, 25, 0, 22, 0, 25, 0, 24, 0, 26, 0, 31, 0, 27, 0, 26, 0, 28, 0, 31, 0, 28, 0, 33, 0, 31, 0, 28, 0, 34, 0, 33, 0, 34, 0, 37, 0, 33, 0, 34, 0, 36, 0, 37, 0, 36, 0, 38, 0, 37, 0, 38, 0, 41, 0, 37, 0, 38, 0, 42, 0, 41, 0, 42, 0, 45, 0, 41, 0, 42, 0, 48, 0, 45, 0, 48, 0, 49, 0, 45, 0, 48, 0, 51, 0, 49, 0, 48, 0, 50, 0, 51, 0, 22, 0, 48, 0, 18, 0, 24, 0, 48, 0, 22, 0, 24, 0, 50, 0, 48, 0, 18, 0, 48, 0, 42, 0, 18, 0, 42, 0, 14, 0, 14, 0, 42, 0, 38, 0, 14, 0, 38, 0, 10, 0, 10, 0, 38, 0, 36, 0, 10, 0, 36, 0, 34, 0, 10, 0, 34, 0, 6, 0, 6, 0, 34, 0, 28, 0, 6, 0, 28, 0, 4, 0, 4, 0, 28, 0, 26, 0, 4, 0, 26, 0, 0, 0, 17, 0, 41, 0, 45, 0, 13, 0, 41, 0, 17, 0, 17, 0, 45, 0, 23, 0, 13, 0, 37, 0, 41, 0, 11, 0, 37, 0, 13, 0, 9, 0, 37, 0, 11, 0, 9, 0, 33, 0, 37, 0, 3, 0, 33, 0, 9, 0, 23, 0, 45, 0, 49, 0, 23, 0, 49, 0, 51, 0, 23, 0, 51, 0, 25, 0, 3, 0, 31, 0, 33, 0, 1, 0, 31, 0, 3, 0, 1, 0, 27, 0, 31, 0, 25, 0, 50, 0, 24, 0, 25, 0, 51, 0, 50, 0, 0, 0, 27, 0, 1, 0, 0, 0, 26, 0, 27, 0), 1.80771, PackedByteArray(0, 0, 3, 0, 6, 0, 0, 0, 1, 0, 3, 0, 6, 0, 3, 0, 13, 0, 6, 0, 13, 0, 14, 0, 14, 0, 13, 0, 23, 0, 14, 0, 23, 0, 25, 0, 14, 0, 25, 0, 24, 0, 26, 0, 33, 0, 27, 0, 26, 0, 34, 0, 33, 0, 34, 0, 41, 0, 33, 0, 34, 0, 48, 0, 41, 0, 48, 0, 51, 0, 41, 0, 48, 0, 50, 0, 51, 0, 25, 0, 50, 0, 24, 0, 25, 0, 51, 0, 50, 0, 23, 0, 51, 0, 25, 0, 23, 0, 41, 0, 51, 0, 24, 0, 48, 0, 14, 0, 24, 0, 50, 0, 48, 0, 14, 0, 48, 0, 34, 0, 14, 0, 34, 0, 6, 0, 6, 0, 34, 0, 26, 0, 6, 0, 26, 0, 0, 0, 13, 0, 33, 0, 41, 0, 0, 0, 27, 0, 1, 0, 0, 0, 26, 0, 27, 0, 3, 0, 33, 0, 13, 0, 13, 0, 41, 0, 23, 0, 1, 0, 33, 0, 3, 0, 1, 0, 27, 0, 33, 0)],
+"primitive": 3,
+"vertex_count": 52,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 160, 64, 173, 121, 165, 192, 0, 0, 160, 192, 42, 237, 24, 64, 125, 201, 151, 64, 0, 0, 160, 192, 132, 199, 138, 63, 183, 206, 181, 192, 0, 0, 160, 192, 144, 157, 52, 190, 220, 147, 126, 64, 0, 0, 160, 192, 194, 238, 48, 192, 149, 183, 208, 192, 0, 0, 160, 192, 190, 213, 41, 192, 68, 217, 45, 64, 0, 0, 160, 192, 76, 96, 207, 192, 104, 190, 245, 192, 0, 0, 160, 192, 6, 0, 160, 192, 52, 19, 123, 63, 0, 0, 160, 192, 3, 0, 32, 193, 128, 32, 18, 193, 0, 0, 160, 192, 128, 155, 229, 192, 245, 133, 153, 191, 0, 0, 160, 192, 159, 52, 84, 193, 210, 185, 45, 193, 0, 0, 160, 192, 52, 70, 18, 193, 230, 90, 114, 192, 0, 0, 160, 192, 166, 180, 129, 193, 70, 50, 77, 193, 0, 0, 160, 192, 134, 223, 45, 193, 207, 150, 215, 192, 0, 0, 160, 192, 164, 103, 150, 193, 3, 0, 112, 193, 0, 0, 160, 192, 210, 32, 69, 193, 3, 0, 32, 193, 0, 0, 160, 192, 158, 216, 167, 193, 76, 197, 138, 193, 0, 0, 160, 192, 60, 164, 87, 193, 225, 79, 88, 193, 0, 0, 160, 192, 46, 187, 181, 193, 202, 150, 158, 193, 0, 0, 160, 192, 171, 24, 101, 193, 44, 226, 137, 193, 0, 0, 160, 192, 130, 210, 191, 193, 170, 29, 179, 193, 0, 0, 160, 192, 48, 67, 109, 193, 126, 172, 168, 193, 0, 0, 160, 192, 102, 242, 197, 193, 4, 0, 200, 193, 0, 0, 160, 192, 7, 0, 112, 193, 6, 0, 200, 193, 0, 0, 160, 192, 6, 0, 200, 193, 0, 0, 160, 192, 0, 0, 128, 192, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 128, 192, 0, 0, 160, 64, 173, 121, 165, 192, 0, 0, 128, 192, 42, 237, 24, 64, 125, 201, 151, 64, 0, 0, 128, 192, 132, 199, 138, 63, 183, 206, 181, 192, 0, 0, 128, 192, 144, 157, 52, 190, 220, 147, 126, 64, 0, 0, 128, 192, 194, 238, 48, 192, 149, 183, 208, 192, 0, 0, 128, 192, 190, 213, 41, 192, 68, 217, 45, 64, 0, 0, 128, 192, 76, 96, 207, 192, 104, 190, 245, 192, 0, 0, 128, 192, 6, 0, 160, 192, 52, 19, 123, 63, 0, 0, 128, 192, 3, 0, 32, 193, 128, 32, 18, 193, 0, 0, 128, 192, 128, 155, 229, 192, 245, 133, 153, 191, 0, 0, 128, 192, 159, 52, 84, 193, 210, 185, 45, 193, 0, 0, 128, 192, 52, 70, 18, 193, 230, 90, 114, 192, 0, 0, 128, 192, 166, 180, 129, 193, 70, 50, 77, 193, 0, 0, 128, 192, 134, 223, 45, 193, 207, 150, 215, 192, 0, 0, 128, 192, 164, 103, 150, 193, 3, 0, 112, 193, 0, 0, 128, 192, 210, 32, 69, 193, 3, 0, 32, 193, 0, 0, 128, 192, 158, 216, 167, 193, 76, 197, 138, 193, 0, 0, 128, 192, 60, 164, 87, 193, 225, 79, 88, 193, 0, 0, 128, 192, 46, 187, 181, 193, 202, 150, 158, 193, 0, 0, 128, 192, 171, 24, 101, 193, 44, 226, 137, 193, 0, 0, 128, 192, 130, 210, 191, 193, 170, 29, 179, 193, 0, 0, 128, 192, 48, 67, 109, 193, 126, 172, 168, 193, 0, 0, 128, 192, 102, 242, 197, 193, 4, 0, 200, 193, 0, 0, 128, 192, 7, 0, 112, 193, 6, 0, 200, 193, 0, 0, 128, 192, 6, 0, 200, 193)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "wide_turn-2-c480f470ca883b94516a2580e8704fd7_Cube_005"
+_surfaces = [{
+"aabb": AABB(-25, -5, -25, 30, 1, 30),
+"attribute_data": PackedByteArray(0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63),
+"format": 4119,
+"index_count": 300,
+"index_data": PackedByteArray(1, 0, 8, 0, 7, 0, 1, 0, 3, 0, 8, 0, 7, 0, 12, 0, 11, 0, 7, 0, 8, 0, 12, 0, 11, 0, 16, 0, 15, 0, 11, 0, 12, 0, 16, 0, 15, 0, 20, 0, 19, 0, 15, 0, 16, 0, 20, 0, 19, 0, 24, 0, 23, 0, 19, 0, 20, 0, 24, 0, 23, 0, 28, 0, 27, 0, 23, 0, 24, 0, 28, 0, 27, 0, 32, 0, 31, 0, 27, 0, 28, 0, 32, 0, 31, 0, 36, 0, 35, 0, 31, 0, 32, 0, 36, 0, 35, 0, 40, 0, 39, 0, 35, 0, 36, 0, 40, 0, 39, 0, 44, 0, 43, 0, 39, 0, 40, 0, 44, 0, 43, 0, 48, 0, 47, 0, 43, 0, 44, 0, 48, 0, 47, 0, 54, 0, 52, 0, 47, 0, 48, 0, 54, 0, 58, 0, 64, 0, 60, 0, 58, 0, 63, 0, 64, 0, 63, 0, 68, 0, 64, 0, 63, 0, 67, 0, 68, 0, 67, 0, 72, 0, 68, 0, 67, 0, 71, 0, 72, 0, 71, 0, 76, 0, 72, 0, 71, 0, 75, 0, 76, 0, 75, 0, 80, 0, 76, 0, 75, 0, 79, 0, 80, 0, 79, 0, 84, 0, 80, 0, 79, 0, 83, 0, 84, 0, 83, 0, 88, 0, 84, 0, 83, 0, 87, 0, 88, 0, 87, 0, 92, 0, 88, 0, 87, 0, 91, 0, 92, 0, 91, 0, 96, 0, 92, 0, 91, 0, 95, 0, 96, 0, 95, 0, 100, 0, 96, 0, 95, 0, 99, 0, 100, 0, 99, 0, 104, 0, 100, 0, 99, 0, 103, 0, 104, 0, 103, 0, 110, 0, 104, 0, 103, 0, 108, 0, 110, 0, 46, 0, 98, 0, 42, 0, 46, 0, 102, 0, 98, 0, 17, 0, 77, 0, 21, 0, 17, 0, 73, 0, 77, 0, 37, 0, 97, 0, 41, 0, 37, 0, 93, 0, 97, 0, 53, 0, 106, 0, 50, 0, 53, 0, 109, 0, 106, 0, 18, 0, 70, 0, 14, 0, 18, 0, 74, 0, 70, 0, 38, 0, 90, 0, 34, 0, 38, 0, 94, 0, 90, 0, 9, 0, 69, 0, 13, 0, 9, 0, 65, 0, 69, 0, 29, 0, 89, 0, 33, 0, 29, 0, 85, 0, 89, 0, 49, 0, 111, 0, 55, 0, 49, 0, 105, 0, 111, 0, 10, 0, 62, 0, 6, 0, 10, 0, 66, 0, 62, 0, 30, 0, 82, 0, 26, 0, 30, 0, 86, 0, 82, 0, 51, 0, 102, 0, 46, 0, 51, 0, 107, 0, 102, 0, 21, 0, 81, 0, 25, 0, 21, 0, 77, 0, 81, 0, 41, 0, 101, 0, 45, 0, 41, 0, 97, 0, 101, 0, 2, 0, 59, 0, 4, 0, 2, 0, 57, 0, 59, 0, 22, 0, 74, 0, 18, 0, 22, 0, 78, 0, 74, 0, 42, 0, 94, 0, 38, 0, 42, 0, 98, 0, 94, 0, 13, 0, 73, 0, 17, 0, 13, 0, 69, 0, 73, 0, 33, 0, 93, 0, 37, 0, 33, 0, 89, 0, 93, 0, 14, 0, 66, 0, 10, 0, 14, 0, 70, 0, 66, 0, 34, 0, 86, 0, 30, 0, 34, 0, 90, 0, 86, 0, 5, 0, 65, 0, 9, 0, 5, 0, 61, 0, 65, 0, 25, 0, 85, 0, 29, 0, 25, 0, 81, 0, 85, 0, 45, 0, 105, 0, 49, 0, 45, 0, 101, 0, 105, 0, 6, 0, 56, 0, 0, 0, 6, 0, 62, 0, 56, 0, 26, 0, 78, 0, 22, 0, 26, 0, 82, 0, 78, 0),
+"lods": [0.256613, PackedByteArray(1, 0, 8, 0, 11, 0, 1, 0, 3, 0, 8, 0, 11, 0, 8, 0, 20, 0, 11, 0, 20, 0, 15, 0, 15, 0, 20, 0, 24, 0, 15, 0, 24, 0, 23, 0, 23, 0, 24, 0, 28, 0, 23, 0, 28, 0, 31, 0, 31, 0, 28, 0, 36, 0, 31, 0, 36, 0, 39, 0, 39, 0, 36, 0, 48, 0, 39, 0, 48, 0, 47, 0, 47, 0, 48, 0, 54, 0, 47, 0, 54, 0, 52, 0, 58, 0, 68, 0, 60, 0, 58, 0, 63, 0, 68, 0, 63, 0, 72, 0, 68, 0, 63, 0, 75, 0, 72, 0, 75, 0, 80, 0, 72, 0, 75, 0, 79, 0, 80, 0, 79, 0, 83, 0, 80, 0, 83, 0, 88, 0, 80, 0, 83, 0, 91, 0, 88, 0, 91, 0, 96, 0, 88, 0, 91, 0, 103, 0, 96, 0, 103, 0, 104, 0, 96, 0, 103, 0, 110, 0, 104, 0, 103, 0, 108, 0, 110, 0, 46, 0, 102, 0, 38, 0, 51, 0, 102, 0, 46, 0, 51, 0, 107, 0, 102, 0, 38, 0, 102, 0, 90, 0, 38, 0, 90, 0, 30, 0, 30, 0, 90, 0, 82, 0, 30, 0, 82, 0, 22, 0, 22, 0, 82, 0, 78, 0, 22, 0, 78, 0, 74, 0, 22, 0, 74, 0, 14, 0, 14, 0, 74, 0, 62, 0, 14, 0, 62, 0, 10, 0, 10, 0, 62, 0, 56, 0, 10, 0, 56, 0, 0, 0, 37, 0, 89, 0, 97, 0, 29, 0, 89, 0, 37, 0, 128, 0, 97, 0, 129, 0, 29, 0, 81, 0, 89, 0, 25, 0, 81, 0, 29, 0, 21, 0, 81, 0, 25, 0, 21, 0, 73, 0, 81, 0, 126, 0, 73, 0, 127, 0, 49, 0, 97, 0, 105, 0, 49, 0, 105, 0, 111, 0, 49, 0, 111, 0, 55, 0, 9, 0, 69, 0, 73, 0, 5, 0, 69, 0, 9, 0, 5, 0, 61, 0, 69, 0, 53, 0, 106, 0, 50, 0, 53, 0, 109, 0, 106, 0, 2, 0, 59, 0, 4, 0, 2, 0, 57, 0, 59, 0), 1.80771, PackedByteArray(1, 0, 8, 0, 15, 0, 1, 0, 3, 0, 8, 0, 15, 0, 8, 0, 28, 0, 15, 0, 28, 0, 31, 0, 31, 0, 28, 0, 48, 0, 31, 0, 48, 0, 54, 0, 31, 0, 54, 0, 52, 0, 58, 0, 72, 0, 60, 0, 58, 0, 75, 0, 72, 0, 75, 0, 88, 0, 72, 0, 75, 0, 103, 0, 88, 0, 103, 0, 110, 0, 88, 0, 103, 0, 108, 0, 110, 0, 53, 0, 106, 0, 50, 0, 53, 0, 109, 0, 106, 0, 49, 0, 111, 0, 55, 0, 117, 0, 122, 0, 125, 0, 51, 0, 102, 0, 30, 0, 51, 0, 107, 0, 102, 0, 30, 0, 102, 0, 74, 0, 30, 0, 74, 0, 14, 0, 14, 0, 74, 0, 56, 0, 14, 0, 56, 0, 0, 0, 115, 0, 119, 0, 123, 0, 2, 0, 59, 0, 4, 0, 2, 0, 57, 0, 59, 0, 113, 0, 120, 0, 116, 0, 116, 0, 124, 0, 118, 0, 112, 0, 121, 0, 114, 0, 5, 0, 61, 0, 73, 0)],
+"material": ExtResource("1_cn4c6"),
+"primitive": 3,
+"vertex_count": 130,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 160, 64, 223, 7, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 160, 64, 255, 255, 222, 135, 255, 255, 255, 191, 173, 121, 165, 192, 0, 0, 160, 192, 42, 237, 24, 64, 227, 14, 255, 127, 255, 255, 255, 191, 173, 121, 165, 192, 0, 0, 160, 192, 42, 237, 24, 64, 255, 127, 0, 0, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 160, 192, 132, 199, 138, 63, 255, 127, 0, 0, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 160, 192, 132, 199, 138, 63, 255, 255, 227, 142, 255, 255, 255, 191, 183, 206, 181, 192, 0, 0, 160, 192, 144, 157, 52, 190, 12, 27, 255, 127, 255, 255, 255, 191, 183, 206, 181, 192, 0, 0, 160, 192, 144, 157, 52, 190, 255, 127, 0, 0, 255, 255, 255, 191, 220, 147, 126, 64, 0, 0, 160, 192, 194, 238, 48, 192, 255, 127, 0, 0, 255, 255, 255, 191, 220, 147, 126, 64, 0, 0, 160, 192, 194, 238, 48, 192, 255, 255, 11, 155, 255, 255, 255, 191, 149, 183, 208, 192, 0, 0, 160, 192, 190, 213, 41, 192, 125, 37, 255, 127, 255, 255, 255, 191, 149, 183, 208, 192, 0, 0, 160, 192, 190, 213, 41, 192, 255, 127, 0, 0, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 160, 192, 76, 96, 207, 192, 255, 127, 0, 0, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 160, 192, 76, 96, 207, 192, 255, 255, 125, 165, 255, 255, 255, 191, 104, 190, 245, 192, 0, 0, 160, 192, 6, 0, 160, 192, 217, 46, 255, 127, 255, 255, 255, 191, 104, 190, 245, 192, 0, 0, 160, 192, 6, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 52, 19, 123, 63, 0, 0, 160, 192, 3, 0, 32, 193, 255, 127, 0, 0, 255, 255, 255, 191, 52, 19, 123, 63, 0, 0, 160, 192, 3, 0, 32, 193, 255, 255, 217, 174, 255, 255, 255, 191, 128, 32, 18, 193, 0, 0, 160, 192, 128, 155, 229, 192, 146, 55, 255, 127, 255, 255, 255, 191, 128, 32, 18, 193, 0, 0, 160, 192, 128, 155, 229, 192, 255, 127, 0, 0, 255, 255, 255, 191, 245, 133, 153, 191, 0, 0, 160, 192, 159, 52, 84, 193, 255, 127, 0, 0, 255, 255, 255, 191, 245, 133, 153, 191, 0, 0, 160, 192, 159, 52, 84, 193, 255, 255, 146, 183, 255, 255, 255, 191, 210, 185, 45, 193, 0, 0, 160, 192, 52, 70, 18, 193, 255, 63, 255, 127, 255, 255, 255, 191, 210, 185, 45, 193, 0, 0, 160, 192, 52, 70, 18, 193, 255, 127, 0, 0, 255, 255, 255, 191, 230, 90, 114, 192, 0, 0, 160, 192, 166, 180, 129, 193, 255, 127, 0, 0, 255, 255, 255, 191, 230, 90, 114, 192, 0, 0, 160, 192, 166, 180, 129, 193, 255, 255, 255, 191, 255, 255, 255, 191, 70, 50, 77, 193, 0, 0, 160, 192, 134, 223, 45, 193, 108, 72, 255, 127, 255, 255, 255, 191, 70, 50, 77, 193, 0, 0, 160, 192, 134, 223, 45, 193, 255, 127, 0, 0, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 160, 192, 164, 103, 150, 193, 255, 127, 0, 0, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 160, 192, 164, 103, 150, 193, 255, 255, 108, 200, 255, 255, 255, 191, 3, 0, 112, 193, 0, 0, 160, 192, 210, 32, 69, 193, 37, 81, 255, 127, 255, 255, 255, 191, 3, 0, 112, 193, 0, 0, 160, 192, 210, 32, 69, 193, 255, 127, 0, 0, 255, 255, 255, 191, 3, 0, 32, 193, 0, 0, 160, 192, 158, 216, 167, 193, 255, 127, 0, 0, 255, 255, 255, 191, 3, 0, 32, 193, 0, 0, 160, 192, 158, 216, 167, 193, 255, 255, 37, 209, 255, 255, 255, 191, 76, 197, 138, 193, 0, 0, 160, 192, 60, 164, 87, 193, 129, 90, 255, 127, 255, 255, 255, 191, 76, 197, 138, 193, 0, 0, 160, 192, 60, 164, 87, 193, 255, 127, 0, 0, 255, 255, 255, 191, 225, 79, 88, 193, 0, 0, 160, 192, 46, 187, 181, 193, 255, 127, 0, 0, 255, 255, 255, 191, 225, 79, 88, 193, 0, 0, 160, 192, 46, 187, 181, 193, 255, 255, 129, 218, 255, 255, 255, 191, 202, 150, 158, 193, 0, 0, 160, 192, 171, 24, 101, 193, 243, 100, 255, 127, 255, 255, 255, 191, 202, 150, 158, 193, 0, 0, 160, 192, 171, 24, 101, 193, 255, 127, 0, 0, 255, 255, 255, 191, 44, 226, 137, 193, 0, 0, 160, 192, 130, 210, 191, 193, 255, 127, 0, 0, 255, 255, 255, 191, 44, 226, 137, 193, 0, 0, 160, 192, 130, 210, 191, 193, 255, 255, 242, 228, 255, 255, 255, 191, 170, 29, 179, 193, 0, 0, 160, 192, 48, 67, 109, 193, 27, 113, 255, 127, 255, 255, 255, 191, 170, 29, 179, 193, 0, 0, 160, 192, 48, 67, 109, 193, 255, 127, 0, 0, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 160, 192, 102, 242, 197, 193, 255, 127, 0, 0, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 160, 192, 102, 242, 197, 193, 255, 255, 27, 241, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 160, 192, 7, 0, 112, 193, 0, 0, 255, 127, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 160, 192, 7, 0, 112, 193, 32, 120, 255, 127, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 160, 192, 7, 0, 112, 193, 255, 127, 0, 0, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 160, 192, 6, 0, 200, 193, 0, 0, 255, 127, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 160, 192, 6, 0, 200, 193, 255, 127, 0, 0, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 160, 192, 6, 0, 200, 193, 255, 255, 31, 248, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 128, 192, 0, 0, 160, 64, 223, 7, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 128, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 128, 192, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 128, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 128, 192, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 128, 192, 0, 0, 160, 64, 255, 255, 222, 135, 255, 255, 255, 191, 173, 121, 165, 192, 0, 0, 128, 192, 42, 237, 24, 64, 227, 14, 255, 127, 255, 255, 255, 191, 173, 121, 165, 192, 0, 0, 128, 192, 42, 237, 24, 64, 255, 127, 255, 255, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 128, 192, 132, 199, 138, 63, 255, 127, 255, 255, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 128, 192, 132, 199, 138, 63, 255, 255, 227, 142, 255, 255, 255, 191, 183, 206, 181, 192, 0, 0, 128, 192, 144, 157, 52, 190, 12, 27, 255, 127, 255, 255, 255, 191, 183, 206, 181, 192, 0, 0, 128, 192, 144, 157, 52, 190, 255, 127, 255, 255, 255, 255, 255, 191, 220, 147, 126, 64, 0, 0, 128, 192, 194, 238, 48, 192, 255, 127, 255, 255, 255, 255, 255, 191, 220, 147, 126, 64, 0, 0, 128, 192, 194, 238, 48, 192, 255, 255, 11, 155, 255, 255, 255, 191, 149, 183, 208, 192, 0, 0, 128, 192, 190, 213, 41, 192, 125, 37, 255, 127, 255, 255, 255, 191, 149, 183, 208, 192, 0, 0, 128, 192, 190, 213, 41, 192, 255, 127, 255, 255, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 128, 192, 76, 96, 207, 192, 255, 127, 255, 255, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 128, 192, 76, 96, 207, 192, 255, 255, 125, 165, 255, 255, 255, 191, 104, 190, 245, 192, 0, 0, 128, 192, 6, 0, 160, 192, 217, 46, 255, 127, 255, 255, 255, 191, 104, 190, 245, 192, 0, 0, 128, 192, 6, 0, 160, 192, 255, 127, 255, 255, 255, 255, 255, 191, 52, 19, 123, 63, 0, 0, 128, 192, 3, 0, 32, 193, 255, 127, 255, 255, 255, 255, 255, 191, 52, 19, 123, 63, 0, 0, 128, 192, 3, 0, 32, 193, 255, 255, 217, 174, 255, 255, 255, 191, 128, 32, 18, 193, 0, 0, 128, 192, 128, 155, 229, 192, 146, 55, 255, 127, 255, 255, 255, 191, 128, 32, 18, 193, 0, 0, 128, 192, 128, 155, 229, 192, 255, 127, 255, 255, 255, 255, 255, 191, 245, 133, 153, 191, 0, 0, 128, 192, 159, 52, 84, 193, 255, 127, 255, 255, 255, 255, 255, 191, 245, 133, 153, 191, 0, 0, 128, 192, 159, 52, 84, 193, 255, 255, 146, 183, 255, 255, 255, 191, 210, 185, 45, 193, 0, 0, 128, 192, 52, 70, 18, 193, 255, 63, 255, 127, 255, 255, 255, 191, 210, 185, 45, 193, 0, 0, 128, 192, 52, 70, 18, 193, 255, 127, 255, 255, 255, 255, 255, 191, 230, 90, 114, 192, 0, 0, 128, 192, 166, 180, 129, 193, 255, 127, 255, 255, 255, 255, 255, 191, 230, 90, 114, 192, 0, 0, 128, 192, 166, 180, 129, 193, 255, 255, 255, 191, 255, 255, 255, 191, 70, 50, 77, 193, 0, 0, 128, 192, 134, 223, 45, 193, 108, 72, 255, 127, 255, 255, 255, 191, 70, 50, 77, 193, 0, 0, 128, 192, 134, 223, 45, 193, 255, 127, 255, 255, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 128, 192, 164, 103, 150, 193, 255, 127, 255, 255, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 128, 192, 164, 103, 150, 193, 255, 255, 108, 200, 255, 255, 255, 191, 3, 0, 112, 193, 0, 0, 128, 192, 210, 32, 69, 193, 37, 81, 255, 127, 255, 255, 255, 191, 3, 0, 112, 193, 0, 0, 128, 192, 210, 32, 69, 193, 255, 127, 255, 255, 255, 255, 255, 191, 3, 0, 32, 193, 0, 0, 128, 192, 158, 216, 167, 193, 255, 127, 255, 255, 255, 255, 255, 191, 3, 0, 32, 193, 0, 0, 128, 192, 158, 216, 167, 193, 255, 255, 37, 209, 255, 255, 255, 191, 76, 197, 138, 193, 0, 0, 128, 192, 60, 164, 87, 193, 129, 90, 255, 127, 255, 255, 255, 191, 76, 197, 138, 193, 0, 0, 128, 192, 60, 164, 87, 193, 255, 127, 255, 255, 255, 255, 255, 191, 225, 79, 88, 193, 0, 0, 128, 192, 46, 187, 181, 193, 255, 127, 255, 255, 255, 255, 255, 191, 225, 79, 88, 193, 0, 0, 128, 192, 46, 187, 181, 193, 255, 255, 129, 218, 255, 255, 255, 191, 202, 150, 158, 193, 0, 0, 128, 192, 171, 24, 101, 193, 243, 100, 255, 127, 255, 255, 255, 191, 202, 150, 158, 193, 0, 0, 128, 192, 171, 24, 101, 193, 255, 127, 255, 255, 255, 255, 255, 191, 44, 226, 137, 193, 0, 0, 128, 192, 130, 210, 191, 193, 255, 127, 255, 255, 255, 255, 255, 191, 44, 226, 137, 193, 0, 0, 128, 192, 130, 210, 191, 193, 255, 255, 242, 228, 255, 255, 255, 191, 170, 29, 179, 193, 0, 0, 128, 192, 48, 67, 109, 193, 27, 113, 255, 127, 255, 255, 255, 191, 170, 29, 179, 193, 0, 0, 128, 192, 48, 67, 109, 193, 255, 127, 255, 255, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 128, 192, 102, 242, 197, 193, 255, 127, 255, 255, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 128, 192, 102, 242, 197, 193, 255, 255, 27, 241, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 128, 192, 7, 0, 112, 193, 0, 0, 255, 127, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 128, 192, 7, 0, 112, 193, 32, 120, 255, 127, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 128, 192, 7, 0, 112, 193, 255, 127, 255, 255, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 128, 192, 6, 0, 200, 193, 0, 0, 255, 127, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 128, 192, 6, 0, 200, 193, 255, 127, 255, 255, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 128, 192, 6, 0, 200, 193, 255, 255, 31, 248, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 160, 64, 220, 201, 73, 190, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 160, 192, 132, 199, 138, 63, 219, 132, 160, 3, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 160, 192, 132, 199, 138, 63, 89, 226, 144, 170, 255, 255, 255, 191, 230, 90, 114, 192, 0, 0, 160, 192, 166, 180, 129, 193, 66, 214, 128, 210, 255, 255, 255, 191, 230, 90, 114, 192, 0, 0, 160, 192, 166, 180, 129, 193, 144, 144, 230, 7, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 160, 192, 102, 242, 197, 193, 88, 162, 182, 251, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 160, 192, 102, 242, 197, 193, 116, 131, 130, 1, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 128, 192, 76, 96, 207, 192, 16, 170, 122, 232, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 128, 192, 76, 96, 207, 192, 203, 145, 223, 12, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 128, 192, 76, 96, 207, 192, 203, 164, 203, 223, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 128, 192, 164, 103, 150, 193, 17, 133, 74, 255, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 128, 192, 164, 103, 150, 193, 218, 191, 8, 225, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 128, 192, 164, 103, 150, 193, 160, 180, 15, 23, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 128, 192, 6, 0, 200, 193, 42, 158, 249, 252, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 160, 192, 132, 199, 138, 63, 183, 182, 143, 39, 255, 255, 255, 191, 52, 19, 123, 63, 0, 0, 160, 192, 3, 0, 32, 193, 177, 188, 212, 42, 255, 255, 255, 191, 3, 0, 32, 193, 0, 0, 160, 192, 158, 216, 167, 193, 90, 207, 175, 24, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 160, 192, 102, 242, 197, 193, 248, 186, 2, 15, 255, 255, 255, 191)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_jt4yp")
diff --git a/assets/meshes/platforms/x.mesh b/assets/meshes/platforms/x.mesh
new file mode 100644
index 0000000..e5d8b61
--- /dev/null
+++ b/assets/meshes/platforms/x.mesh
Binary files differ
diff --git a/assets/meshes/ring_finish.tres b/assets/meshes/ring_finish.tres
index 5901c9a..b9d82ce 100644
--- a/assets/meshes/ring_finish.tres
+++ b/assets/meshes/ring_finish.tres
@@ -4,7 +4,7 @@
[resource]
material = ExtResource("1_wa3lo")
-inner_radius = 25.0
-outer_radius = 40.0
+inner_radius = 12.0
+outer_radius = 17.0
rings = 32
ring_segments = 16
diff --git a/assets/meshes/ring_start.tres b/assets/meshes/ring_start.tres
index e3621e9..15e4fae 100644
--- a/assets/meshes/ring_start.tres
+++ b/assets/meshes/ring_start.tres
@@ -4,7 +4,7 @@
[resource]
material = ExtResource("1_hr1sx")
-inner_radius = 25.0
-outer_radius = 40.0
+inner_radius = 12.0
+outer_radius = 17.0
rings = 32
ring_segments = 16
diff --git a/assets/meshes/tree_bottom.tres b/assets/meshes/tree_bottom.tres
new file mode 100644
index 0000000..90f3454
--- /dev/null
+++ b/assets/meshes/tree_bottom.tres
@@ -0,0 +1,28 @@
+[gd_resource type="ArrayMesh" load_steps=2 format=3 uid="uid://wpn040a4trym"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_grsbj"]
+_surfaces = [{
+"aabb": AABB(-1, -1.5, -1, 2, 3, 2),
+"format": 4097,
+"index_count": 72,
+"index_data": PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 2, 0, 5, 0, 3, 0, 2, 0, 4, 0, 5, 0, 4, 0, 7, 0, 5, 0, 4, 0, 6, 0, 7, 0, 6, 0, 9, 0, 7, 0, 6, 0, 8, 0, 9, 0, 8, 0, 11, 0, 9, 0, 8, 0, 10, 0, 11, 0, 10, 0, 13, 0, 11, 0, 10, 0, 12, 0, 13, 0, 12, 0, 15, 0, 13, 0, 12, 0, 14, 0, 15, 0, 14, 0, 17, 0, 15, 0, 14, 0, 16, 0, 17, 0, 16, 0, 19, 0, 17, 0, 16, 0, 18, 0, 19, 0, 18, 0, 21, 0, 19, 0, 18, 0, 20, 0, 21, 0, 20, 0, 23, 0, 21, 0, 20, 0, 22, 0, 23, 0, 22, 0, 1, 0, 23, 0, 22, 0, 0, 0, 1, 0),
+"primitive": 3,
+"vertex_count": 24,
+"vertex_data": PackedByteArray(0, 0, 0, 0, 0, 0, 192, 191, 0, 0, 128, 191, 0, 0, 0, 0, 0, 0, 192, 63, 0, 0, 128, 191, 0, 0, 0, 63, 0, 0, 192, 191, 215, 179, 93, 191, 0, 0, 0, 63, 0, 0, 192, 63, 215, 179, 93, 191, 215, 179, 93, 63, 0, 0, 192, 191, 0, 0, 0, 191, 215, 179, 93, 63, 0, 0, 192, 63, 0, 0, 0, 191, 0, 0, 128, 63, 0, 0, 192, 191, 0, 0, 0, 128, 0, 0, 128, 63, 0, 0, 192, 63, 0, 0, 0, 128, 215, 179, 93, 63, 0, 0, 192, 191, 0, 0, 0, 63, 215, 179, 93, 63, 0, 0, 192, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 192, 191, 215, 179, 93, 63, 0, 0, 0, 63, 0, 0, 192, 63, 215, 179, 93, 63, 0, 0, 0, 0, 0, 0, 192, 191, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 192, 63, 0, 0, 128, 63, 0, 0, 0, 191, 0, 0, 192, 191, 215, 179, 93, 63, 0, 0, 0, 191, 0, 0, 192, 63, 215, 179, 93, 63, 215, 179, 93, 191, 0, 0, 192, 191, 0, 0, 0, 63, 215, 179, 93, 191, 0, 0, 192, 63, 0, 0, 0, 63, 0, 0, 128, 191, 0, 0, 192, 191, 0, 0, 0, 128, 0, 0, 128, 191, 0, 0, 192, 63, 0, 0, 0, 128, 215, 179, 93, 191, 0, 0, 192, 191, 0, 0, 0, 191, 215, 179, 93, 191, 0, 0, 192, 63, 0, 0, 0, 191, 0, 0, 0, 191, 0, 0, 192, 191, 215, 179, 93, 191, 0, 0, 0, 191, 0, 0, 192, 63, 215, 179, 93, 191)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "tree_Cylinder002"
+_surfaces = [{
+"aabb": AABB(-1, -1.5, -1, 2, 3, 2),
+"attribute_data": PackedByteArray(0, 0, 160, 51, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 160, 51, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 171, 170, 106, 63, 0, 0, 128, 63, 171, 170, 106, 63, 0, 0, 0, 0, 86, 85, 85, 63, 0, 0, 128, 63, 86, 85, 85, 63, 0, 0, 0, 0, 1, 0, 64, 63, 0, 0, 128, 63, 1, 0, 64, 63, 0, 0, 0, 0, 172, 170, 42, 63, 0, 0, 128, 63, 172, 170, 42, 63, 0, 0, 0, 0, 87, 85, 21, 63, 0, 0, 128, 63, 87, 85, 21, 63, 0, 0, 0, 0, 2, 0, 0, 63, 0, 0, 128, 63, 2, 0, 0, 63, 0, 0, 0, 0, 89, 85, 213, 62, 0, 0, 128, 63, 89, 85, 213, 62, 0, 0, 0, 0, 174, 170, 170, 62, 0, 0, 128, 63, 174, 170, 170, 62, 0, 0, 0, 0, 3, 0, 128, 62, 0, 0, 128, 63, 3, 0, 128, 62, 0, 0, 0, 0, 176, 170, 42, 62, 0, 0, 128, 63, 176, 170, 42, 62, 0, 0, 0, 0, 181, 170, 170, 61, 0, 0, 128, 63, 181, 170, 170, 61, 0, 0, 0, 0),
+"format": 4119,
+"index_count": 72,
+"index_data": PackedByteArray(1, 0, 5, 0, 3, 0, 1, 0, 4, 0, 5, 0, 4, 0, 7, 0, 5, 0, 4, 0, 6, 0, 7, 0, 6, 0, 9, 0, 7, 0, 6, 0, 8, 0, 9, 0, 8, 0, 11, 0, 9, 0, 8, 0, 10, 0, 11, 0, 10, 0, 13, 0, 11, 0, 10, 0, 12, 0, 13, 0, 12, 0, 15, 0, 13, 0, 12, 0, 14, 0, 15, 0, 14, 0, 17, 0, 15, 0, 14, 0, 16, 0, 17, 0, 16, 0, 19, 0, 17, 0, 16, 0, 18, 0, 19, 0, 18, 0, 21, 0, 19, 0, 18, 0, 20, 0, 21, 0, 20, 0, 23, 0, 21, 0, 20, 0, 22, 0, 23, 0, 22, 0, 25, 0, 23, 0, 22, 0, 24, 0, 25, 0, 24, 0, 2, 0, 25, 0, 24, 0, 0, 0, 2, 0),
+"primitive": 3,
+"vertex_count": 26,
+"vertex_data": PackedByteArray(0, 0, 0, 0, 0, 0, 192, 191, 0, 0, 128, 191, 255, 255, 255, 255, 0, 0, 255, 191, 0, 0, 0, 0, 0, 0, 192, 191, 0, 0, 128, 191, 255, 255, 255, 255, 0, 0, 255, 191, 0, 0, 0, 0, 0, 0, 192, 63, 0, 0, 128, 191, 255, 255, 255, 255, 0, 0, 255, 191, 0, 0, 0, 0, 0, 0, 192, 63, 0, 0, 128, 191, 255, 255, 255, 255, 0, 0, 255, 191, 0, 0, 0, 63, 0, 0, 192, 191, 215, 179, 93, 191, 255, 255, 37, 209, 0, 0, 108, 215, 0, 0, 0, 63, 0, 0, 192, 63, 215, 179, 93, 191, 255, 255, 37, 209, 0, 0, 108, 215, 215, 179, 93, 63, 0, 0, 192, 191, 0, 0, 0, 191, 255, 255, 217, 174, 0, 0, 146, 232, 215, 179, 93, 63, 0, 0, 192, 63, 0, 0, 0, 191, 255, 255, 217, 174, 0, 0, 146, 232, 0, 0, 128, 63, 0, 0, 192, 191, 0, 0, 0, 128, 255, 255, 255, 127, 255, 255, 255, 255, 0, 0, 128, 63, 0, 0, 192, 63, 0, 0, 0, 128, 255, 255, 255, 127, 255, 255, 255, 255, 215, 179, 93, 63, 0, 0, 192, 191, 0, 0, 0, 63, 37, 209, 255, 127, 255, 255, 146, 232, 215, 179, 93, 63, 0, 0, 192, 63, 0, 0, 0, 63, 37, 209, 255, 127, 255, 255, 146, 232, 0, 0, 0, 63, 0, 0, 192, 191, 215, 179, 93, 63, 217, 174, 255, 127, 255, 255, 108, 215, 0, 0, 0, 63, 0, 0, 192, 63, 215, 179, 93, 63, 217, 174, 255, 127, 255, 255, 108, 215, 0, 0, 0, 0, 0, 0, 192, 191, 0, 0, 128, 63, 255, 127, 255, 127, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 192, 63, 0, 0, 128, 63, 255, 127, 255, 127, 255, 255, 255, 191, 0, 0, 0, 191, 0, 0, 192, 191, 215, 179, 93, 63, 37, 81, 255, 127, 37, 209, 255, 191, 0, 0, 0, 191, 0, 0, 192, 63, 215, 179, 93, 63, 37, 81, 255, 127, 37, 209, 255, 191, 215, 179, 93, 191, 0, 0, 192, 191, 0, 0, 0, 63, 217, 46, 255, 127, 217, 174, 255, 191, 215, 179, 93, 191, 0, 0, 192, 63, 0, 0, 0, 63, 217, 46, 255, 127, 217, 174, 255, 191, 0, 0, 128, 191, 0, 0, 192, 191, 0, 0, 0, 128, 0, 0, 255, 127, 255, 127, 255, 191, 0, 0, 128, 191, 0, 0, 192, 63, 0, 0, 0, 128, 0, 0, 255, 127, 255, 127, 255, 191, 215, 179, 93, 191, 0, 0, 192, 191, 0, 0, 0, 191, 0, 0, 217, 174, 37, 81, 255, 191, 215, 179, 93, 191, 0, 0, 192, 63, 0, 0, 0, 191, 0, 0, 217, 174, 37, 81, 255, 191, 0, 0, 0, 191, 0, 0, 192, 191, 215, 179, 93, 191, 0, 0, 37, 209, 217, 46, 255, 191, 0, 0, 0, 191, 0, 0, 192, 63, 215, 179, 93, 191, 0, 0, 37, 209, 217, 46, 255, 191)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_grsbj")
diff --git a/assets/meshes/tree_top.mesh b/assets/meshes/tree_top.mesh
new file mode 100644
index 0000000..999106c
--- /dev/null
+++ b/assets/meshes/tree_top.mesh
Binary files differ
diff --git a/assets/meshes/walls/corner_wall.tres b/assets/meshes/walls/corner_wall.tres
new file mode 100644
index 0000000..1c1abd9
--- /dev/null
+++ b/assets/meshes/walls/corner_wall.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://tdpui03o1a0i"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_600u4"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_yvypb"]
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -6.00711, 11.0071, 3.00001, 11.0071),
+"format": 4097,
+"index_count": 36,
+"index_data": PackedByteArray(2, 0, 0, 0, 3, 0, 2, 0, 1, 0, 0, 0, 3, 0, 7, 0, 5, 0, 3, 0, 0, 0, 7, 0, 7, 0, 1, 0, 6, 0, 7, 0, 0, 0, 1, 0, 5, 0, 6, 0, 4, 0, 5, 0, 7, 0, 6, 0, 5, 0, 2, 0, 3, 0, 5, 0, 4, 0, 2, 0, 4, 0, 1, 0, 2, 0, 4, 0, 6, 0, 1, 0),
+"lods": [3.18117, PackedByteArray(4, 0, 0, 0, 5, 0, 4, 0, 1, 0, 0, 0, 5, 0, 6, 0, 4, 0, 5, 0, 7, 0, 6, 0, 5, 0, 0, 0, 7, 0, 7, 0, 1, 0, 6, 0, 7, 0, 0, 0, 1, 0, 4, 0, 6, 0, 1, 0)],
+"primitive": 3,
+"vertex_count": 8,
+"vertex_data": PackedByteArray(200, 197, 159, 192, 0, 0, 32, 64, 55, 58, 192, 192, 200, 197, 159, 192, 0, 0, 0, 191, 55, 58, 192, 192, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 55, 58, 192, 64, 0, 0, 0, 191, 200, 197, 159, 64, 55, 58, 192, 64, 0, 0, 32, 64, 200, 197, 159, 64)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "corner_wall_Cube001"
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -6.00711, 11.0071, 3.00001, 11.0071),
+"attribute_data": PackedByteArray(0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62),
+"format": 4119,
+"index_count": 36,
+"index_data": PackedByteArray(6, 0, 0, 0, 9, 0, 6, 0, 3, 0, 0, 0, 11, 0, 21, 0, 16, 0, 11, 0, 1, 0, 21, 0, 23, 0, 5, 0, 20, 0, 23, 0, 2, 0, 5, 0, 17, 0, 19, 0, 14, 0, 17, 0, 22, 0, 19, 0, 15, 0, 7, 0, 10, 0, 15, 0, 12, 0, 7, 0, 13, 0, 4, 0, 8, 0, 13, 0, 18, 0, 4, 0),
+"lods": [3.18117, PackedByteArray(26, 0, 24, 0, 27, 0, 26, 0, 25, 0, 24, 0, 27, 0, 19, 0, 26, 0, 27, 0, 22, 0, 19, 0, 16, 0, 1, 0, 21, 0, 23, 0, 5, 0, 20, 0, 23, 0, 2, 0, 5, 0, 13, 0, 18, 0, 4, 0)],
+"material": ExtResource("1_600u4"),
+"primitive": 3,
+"vertex_count": 28,
+"vertex_data": PackedByteArray(200, 197, 159, 192, 0, 0, 32, 64, 55, 58, 192, 192, 0, 0, 230, 128, 255, 255, 255, 191, 200, 197, 159, 192, 0, 0, 32, 64, 55, 58, 192, 192, 255, 127, 255, 255, 255, 255, 255, 191, 200, 197, 159, 192, 0, 0, 32, 64, 55, 58, 192, 192, 255, 255, 255, 191, 92, 15, 214, 227, 200, 197, 159, 192, 0, 0, 0, 191, 55, 58, 192, 192, 0, 0, 230, 128, 255, 255, 255, 191, 200, 197, 159, 192, 0, 0, 0, 191, 55, 58, 192, 192, 255, 127, 0, 0, 255, 255, 255, 191, 200, 197, 159, 192, 0, 0, 0, 191, 55, 58, 192, 192, 255, 255, 255, 191, 107, 24, 25, 230, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 230, 128, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 63, 255, 127, 125, 26, 96, 25, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 230, 128, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 255, 63, 255, 127, 178, 16, 211, 27, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 63, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 230, 128, 255, 127, 255, 255, 255, 63, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 255, 63, 255, 127, 38, 106, 118, 5, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 230, 128, 255, 127, 255, 255, 255, 63, 55, 58, 192, 64, 0, 0, 0, 191, 200, 197, 159, 64, 255, 127, 0, 0, 255, 255, 255, 191, 55, 58, 192, 64, 0, 0, 0, 191, 200, 197, 159, 64, 230, 128, 255, 127, 255, 255, 255, 63, 55, 58, 192, 64, 0, 0, 0, 191, 200, 197, 159, 64, 255, 255, 255, 191, 255, 127, 255, 255, 55, 58, 192, 64, 0, 0, 32, 64, 200, 197, 159, 64, 255, 127, 255, 255, 255, 255, 255, 191, 55, 58, 192, 64, 0, 0, 32, 64, 200, 197, 159, 64, 230, 128, 255, 127, 255, 255, 255, 63, 55, 58, 192, 64, 0, 0, 32, 64, 200, 197, 159, 64, 255, 255, 255, 191, 218, 107, 245, 250, 200, 197, 159, 192, 0, 0, 32, 64, 55, 58, 192, 192, 255, 63, 255, 127, 255, 255, 255, 191, 200, 197, 159, 192, 0, 0, 0, 191, 55, 58, 192, 192, 255, 63, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 221, 80, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 233, 101, 255, 127, 38, 106, 118, 5)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_yvypb")
diff --git a/assets/meshes/walls/diagonal_wall.tres b/assets/meshes/walls/diagonal_wall.tres
new file mode 100644
index 0000000..4fd63e0
--- /dev/null
+++ b/assets/meshes/walls/diagonal_wall.tres
@@ -0,0 +1,31 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://8dvooynpliqm"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_yjiff"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_ts74p"]
+_surfaces = [{
+"aabb": AABB(-5, -3, 5, 10, 5.5, 1),
+"format": 4097,
+"index_count": 36,
+"index_data": PackedByteArray(2, 0, 1, 0, 0, 0, 2, 0, 3, 0, 1, 0, 6, 0, 5, 0, 7, 0, 6, 0, 4, 0, 5, 0, 2, 0, 7, 0, 3, 0, 2, 0, 6, 0, 7, 0, 0, 0, 6, 0, 2, 0, 0, 0, 4, 0, 6, 0, 1, 0, 4, 0, 0, 0, 1, 0, 5, 0, 4, 0, 3, 0, 5, 0, 1, 0, 3, 0, 7, 0, 5, 0),
+"primitive": 3,
+"vertex_count": 8,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 64, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 192, 64)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "wall_diagonal_Cube_002"
+_surfaces = [{
+"aabb": AABB(-5, -3, 5, 10, 5.5, 1),
+"attribute_data": PackedByteArray(0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62),
+"format": 4119,
+"index_count": 36,
+"index_data": PackedByteArray(7, 0, 4, 0, 2, 0, 7, 0, 9, 0, 4, 0, 19, 0, 16, 0, 21, 0, 19, 0, 14, 0, 16, 0, 8, 0, 23, 0, 11, 0, 8, 0, 20, 0, 23, 0, 1, 0, 18, 0, 6, 0, 1, 0, 13, 0, 18, 0, 3, 0, 12, 0, 0, 0, 3, 0, 15, 0, 12, 0, 10, 0, 17, 0, 5, 0, 10, 0, 22, 0, 17, 0),
+"material": ExtResource("1_yjiff"),
+"primitive": 3,
+"vertex_count": 24,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 102, 102, 152, 25, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 64, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 64, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 64, 152, 153, 102, 230, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 102, 102, 152, 25, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 160, 64, 255, 255, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 160, 64, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 160, 64, 152, 153, 102, 230, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 160, 64, 255, 255, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 64, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 64, 102, 102, 152, 25, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 64, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 64, 152, 153, 102, 230, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 192, 64, 102, 102, 152, 25, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 192, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 64, 192, 0, 0, 192, 64, 255, 255, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 192, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 192, 64, 152, 153, 102, 230, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 0, 0, 0, 192, 64, 255, 255, 255, 127, 255, 255, 255, 191)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_ts74p")
diff --git a/assets/meshes/walls/flat_wall.mesh b/assets/meshes/walls/flat_wall.mesh
new file mode 100644
index 0000000..35dd03a
--- /dev/null
+++ b/assets/meshes/walls/flat_wall.mesh
Binary files differ
diff --git a/assets/meshes/walls/large_curved_wall.tres b/assets/meshes/walls/large_curved_wall.tres
new file mode 100644
index 0000000..ed562ea
--- /dev/null
+++ b/assets/meshes/walls/large_curved_wall.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://dtexmiikiu1om"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_2l2lr"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_k5wpl"]
+_surfaces = [{
+"aabb": AABB(-25, -5, -25.9979, 30.9979, 3, 30.9979),
+"format": 4097,
+"index_count": 300,
+"index_data": PackedByteArray(3, 0, 17, 0, 16, 0, 3, 0, 4, 0, 17, 0, 8, 0, 22, 0, 21, 0, 8, 0, 9, 0, 22, 0, 1, 0, 15, 0, 14, 0, 1, 0, 2, 0, 15, 0, 6, 0, 20, 0, 19, 0, 6, 0, 7, 0, 20, 0, 11, 0, 25, 0, 24, 0, 11, 0, 12, 0, 25, 0, 4, 0, 18, 0, 17, 0, 4, 0, 5, 0, 18, 0, 9, 0, 23, 0, 22, 0, 9, 0, 10, 0, 23, 0, 2, 0, 16, 0, 15, 0, 2, 0, 3, 0, 16, 0, 7, 0, 21, 0, 20, 0, 7, 0, 8, 0, 21, 0, 0, 0, 14, 0, 13, 0, 0, 0, 1, 0, 14, 0, 5, 0, 19, 0, 18, 0, 5, 0, 6, 0, 19, 0, 10, 0, 24, 0, 23, 0, 10, 0, 11, 0, 24, 0, 29, 0, 43, 0, 30, 0, 29, 0, 42, 0, 43, 0, 34, 0, 48, 0, 35, 0, 34, 0, 47, 0, 48, 0, 27, 0, 41, 0, 28, 0, 27, 0, 40, 0, 41, 0, 32, 0, 46, 0, 33, 0, 32, 0, 45, 0, 46, 0, 37, 0, 51, 0, 38, 0, 37, 0, 50, 0, 51, 0, 30, 0, 44, 0, 31, 0, 30, 0, 43, 0, 44, 0, 35, 0, 49, 0, 36, 0, 35, 0, 48, 0, 49, 0, 28, 0, 42, 0, 29, 0, 28, 0, 41, 0, 42, 0, 33, 0, 47, 0, 34, 0, 33, 0, 46, 0, 47, 0, 26, 0, 40, 0, 27, 0, 26, 0, 39, 0, 40, 0, 31, 0, 45, 0, 32, 0, 31, 0, 44, 0, 45, 0, 36, 0, 50, 0, 37, 0, 36, 0, 49, 0, 50, 0, 13, 0, 26, 0, 0, 0, 13, 0, 39, 0, 26, 0, 16, 0, 41, 0, 15, 0, 16, 0, 42, 0, 41, 0, 7, 0, 34, 0, 8, 0, 7, 0, 33, 0, 34, 0, 24, 0, 49, 0, 23, 0, 24, 0, 50, 0, 49, 0, 0, 0, 27, 0, 1, 0, 0, 0, 26, 0, 27, 0, 17, 0, 42, 0, 16, 0, 17, 0, 43, 0, 42, 0, 8, 0, 35, 0, 9, 0, 8, 0, 34, 0, 35, 0, 25, 0, 50, 0, 24, 0, 25, 0, 51, 0, 50, 0, 1, 0, 28, 0, 2, 0, 1, 0, 27, 0, 28, 0, 18, 0, 43, 0, 17, 0, 18, 0, 44, 0, 43, 0, 9, 0, 36, 0, 10, 0, 9, 0, 35, 0, 36, 0, 2, 0, 29, 0, 3, 0, 2, 0, 28, 0, 29, 0, 19, 0, 44, 0, 18, 0, 19, 0, 45, 0, 44, 0, 10, 0, 37, 0, 11, 0, 10, 0, 36, 0, 37, 0, 3, 0, 30, 0, 4, 0, 3, 0, 29, 0, 30, 0, 20, 0, 45, 0, 19, 0, 20, 0, 46, 0, 45, 0, 11, 0, 38, 0, 12, 0, 11, 0, 37, 0, 38, 0, 4, 0, 31, 0, 5, 0, 4, 0, 30, 0, 31, 0, 21, 0, 46, 0, 20, 0, 21, 0, 47, 0, 46, 0, 14, 0, 39, 0, 13, 0, 14, 0, 40, 0, 39, 0, 5, 0, 32, 0, 6, 0, 5, 0, 31, 0, 32, 0, 22, 0, 47, 0, 21, 0, 22, 0, 48, 0, 47, 0, 15, 0, 40, 0, 14, 0, 15, 0, 41, 0, 40, 0, 12, 0, 51, 0, 25, 0, 12, 0, 38, 0, 51, 0, 6, 0, 33, 0, 7, 0, 6, 0, 32, 0, 33, 0, 23, 0, 48, 0, 22, 0, 23, 0, 49, 0, 48, 0),
+"lods": [1.35022, PackedByteArray(6, 0, 8, 0, 19, 0, 8, 0, 24, 0, 19, 0, 6, 0, 19, 0, 17, 0, 8, 0, 11, 0, 24, 0, 11, 0, 25, 0, 24, 0, 11, 0, 12, 0, 25, 0, 2, 0, 6, 0, 17, 0, 2, 0, 17, 0, 14, 0, 0, 0, 2, 0, 14, 0, 0, 0, 14, 0, 13, 0, 27, 0, 40, 0, 43, 0, 26, 0, 40, 0, 27, 0, 26, 0, 39, 0, 40, 0, 27, 0, 43, 0, 30, 0, 30, 0, 43, 0, 45, 0, 30, 0, 45, 0, 32, 0, 32, 0, 45, 0, 47, 0, 32, 0, 47, 0, 34, 0, 34, 0, 47, 0, 49, 0, 34, 0, 49, 0, 37, 0, 37, 0, 49, 0, 51, 0, 37, 0, 51, 0, 38, 0, 13, 0, 26, 0, 0, 0, 13, 0, 39, 0, 26, 0, 17, 0, 43, 0, 14, 0, 19, 0, 43, 0, 17, 0, 14, 0, 43, 0, 40, 0, 14, 0, 40, 0, 39, 0, 14, 0, 39, 0, 13, 0, 19, 0, 45, 0, 43, 0, 24, 0, 45, 0, 19, 0, 24, 0, 47, 0, 45, 0, 24, 0, 49, 0, 47, 0, 25, 0, 49, 0, 24, 0, 25, 0, 51, 0, 49, 0, 8, 0, 32, 0, 34, 0, 8, 0, 34, 0, 37, 0, 6, 0, 32, 0, 8, 0, 8, 0, 37, 0, 11, 0, 11, 0, 37, 0, 38, 0, 11, 0, 38, 0, 12, 0, 6, 0, 30, 0, 32, 0, 2, 0, 30, 0, 6, 0, 2, 0, 27, 0, 30, 0, 0, 0, 27, 0, 2, 0, 0, 0, 26, 0, 27, 0, 12, 0, 51, 0, 25, 0, 12, 0, 38, 0, 51, 0), 3.44322, PackedByteArray(6, 0, 25, 0, 19, 0, 6, 0, 12, 0, 25, 0, 0, 0, 6, 0, 19, 0, 0, 0, 19, 0, 13, 0, 37, 0, 51, 0, 38, 0, 37, 0, 45, 0, 51, 0, 32, 0, 45, 0, 37, 0, 30, 0, 45, 0, 32, 0, 26, 0, 45, 0, 30, 0, 26, 0, 39, 0, 45, 0, 13, 0, 26, 0, 0, 0, 13, 0, 39, 0, 26, 0, 6, 0, 32, 0, 37, 0, 6, 0, 37, 0, 38, 0, 6, 0, 38, 0, 12, 0, 6, 0, 30, 0, 32, 0, 0, 0, 30, 0, 6, 0, 0, 0, 26, 0, 30, 0, 25, 0, 45, 0, 19, 0, 25, 0, 51, 0, 45, 0, 19, 0, 45, 0, 39, 0, 19, 0, 39, 0, 13, 0, 12, 0, 51, 0, 25, 0, 12, 0, 38, 0, 51, 0)],
+"primitive": 3,
+"vertex_count": 52,
+"vertex_data": PackedByteArray(0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 160, 64, 125, 201, 151, 64, 0, 0, 160, 192, 132, 199, 138, 63, 220, 147, 126, 64, 0, 0, 160, 192, 194, 238, 48, 192, 68, 217, 45, 64, 0, 0, 160, 192, 76, 96, 207, 192, 52, 19, 123, 63, 0, 0, 160, 192, 3, 0, 32, 193, 245, 133, 153, 191, 0, 0, 160, 192, 159, 52, 84, 193, 230, 90, 114, 192, 0, 0, 160, 192, 166, 180, 129, 193, 207, 150, 215, 192, 0, 0, 160, 192, 164, 103, 150, 193, 3, 0, 32, 193, 0, 0, 160, 192, 158, 216, 167, 193, 225, 79, 88, 193, 0, 0, 160, 192, 46, 187, 181, 193, 44, 226, 137, 193, 0, 0, 160, 192, 130, 210, 191, 193, 126, 172, 168, 193, 0, 0, 160, 192, 102, 242, 197, 193, 6, 0, 200, 193, 0, 0, 160, 192, 6, 0, 200, 193, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 125, 201, 151, 64, 0, 0, 0, 192, 132, 199, 138, 63, 220, 147, 126, 64, 0, 0, 0, 192, 194, 238, 48, 192, 68, 217, 45, 64, 0, 0, 0, 192, 76, 96, 207, 192, 52, 19, 123, 63, 0, 0, 0, 192, 3, 0, 32, 193, 245, 133, 153, 191, 0, 0, 0, 192, 159, 52, 84, 193, 230, 90, 114, 192, 0, 0, 0, 192, 166, 180, 129, 193, 207, 150, 215, 192, 0, 0, 0, 192, 164, 103, 150, 193, 3, 0, 32, 193, 0, 0, 0, 192, 158, 216, 167, 193, 225, 79, 88, 193, 0, 0, 0, 192, 46, 187, 181, 193, 44, 226, 137, 193, 0, 0, 0, 192, 130, 210, 191, 193, 126, 172, 168, 193, 0, 0, 0, 192, 102, 242, 197, 193, 6, 0, 200, 193, 0, 0, 0, 192, 6, 0, 200, 193, 118, 238, 191, 64, 0, 0, 160, 192, 0, 0, 160, 64, 104, 131, 183, 64, 0, 0, 160, 192, 222, 36, 116, 63, 203, 50, 158, 64, 0, 0, 160, 192, 64, 127, 65, 192, 28, 250, 104, 64, 0, 0, 160, 192, 61, 159, 219, 192, 134, 99, 236, 63, 0, 0, 160, 192, 3, 0, 40, 193, 108, 229, 207, 190, 0, 0, 160, 192, 28, 242, 93, 193, 169, 25, 69, 192, 0, 0, 160, 192, 206, 92, 135, 193, 213, 27, 196, 192, 0, 0, 160, 192, 110, 192, 156, 193, 3, 0, 24, 193, 0, 0, 160, 192, 61, 198, 174, 193, 104, 48, 82, 193, 0, 0, 160, 192, 73, 31, 189, 193, 28, 208, 135, 193, 0, 0, 160, 192, 185, 140, 199, 193, 45, 161, 167, 193, 0, 0, 160, 192, 225, 224, 205, 193, 0, 0, 200, 193, 0, 0, 160, 192, 163, 251, 207, 193, 118, 238, 191, 64, 0, 0, 0, 192, 0, 0, 160, 64, 104, 131, 183, 64, 0, 0, 0, 192, 222, 36, 116, 63, 203, 50, 158, 64, 0, 0, 0, 192, 64, 127, 65, 192, 28, 250, 104, 64, 0, 0, 0, 192, 61, 159, 219, 192, 134, 99, 236, 63, 0, 0, 0, 192, 3, 0, 40, 193, 108, 229, 207, 190, 0, 0, 0, 192, 28, 242, 93, 193, 169, 25, 69, 192, 0, 0, 0, 192, 206, 92, 135, 193, 213, 27, 196, 192, 0, 0, 0, 192, 110, 192, 156, 193, 3, 0, 24, 193, 0, 0, 0, 192, 61, 198, 174, 193, 104, 48, 82, 193, 0, 0, 0, 192, 73, 31, 189, 193, 28, 208, 135, 193, 0, 0, 0, 192, 185, 140, 199, 193, 45, 161, 167, 193, 0, 0, 0, 192, 225, 224, 205, 193, 0, 0, 200, 193, 0, 0, 0, 192, 163, 251, 207, 193)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "wide_turn-2-c480f470ca883b94516a2580e8704fd7_Cube_008"
+_surfaces = [{
+"aabb": AABB(-25, -5, -25.9979, 30.9979, 3, 30.9979),
+"attribute_data": PackedByteArray(0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63),
+"format": 4119,
+"index_count": 300,
+"index_data": PackedByteArray(7, 0, 37, 0, 35, 0, 7, 0, 9, 0, 37, 0, 17, 0, 47, 0, 45, 0, 17, 0, 19, 0, 47, 0, 3, 0, 33, 0, 31, 0, 3, 0, 5, 0, 33, 0, 13, 0, 43, 0, 41, 0, 13, 0, 15, 0, 43, 0, 23, 0, 54, 0, 51, 0, 23, 0, 26, 0, 54, 0, 9, 0, 39, 0, 37, 0, 9, 0, 11, 0, 39, 0, 19, 0, 49, 0, 47, 0, 19, 0, 21, 0, 49, 0, 5, 0, 35, 0, 33, 0, 5, 0, 7, 0, 35, 0, 15, 0, 45, 0, 43, 0, 15, 0, 17, 0, 45, 0, 0, 0, 31, 0, 28, 0, 0, 0, 3, 0, 31, 0, 11, 0, 41, 0, 39, 0, 11, 0, 13, 0, 41, 0, 21, 0, 51, 0, 49, 0, 21, 0, 23, 0, 51, 0, 64, 0, 94, 0, 66, 0, 64, 0, 92, 0, 94, 0, 74, 0, 104, 0, 76, 0, 74, 0, 102, 0, 104, 0, 60, 0, 90, 0, 62, 0, 60, 0, 88, 0, 90, 0, 70, 0, 100, 0, 72, 0, 70, 0, 98, 0, 100, 0, 80, 0, 111, 0, 83, 0, 80, 0, 108, 0, 111, 0, 66, 0, 96, 0, 68, 0, 66, 0, 94, 0, 96, 0, 76, 0, 106, 0, 78, 0, 76, 0, 104, 0, 106, 0, 62, 0, 92, 0, 64, 0, 62, 0, 90, 0, 92, 0, 72, 0, 102, 0, 74, 0, 72, 0, 100, 0, 102, 0, 58, 0, 88, 0, 60, 0, 58, 0, 86, 0, 88, 0, 68, 0, 98, 0, 70, 0, 68, 0, 96, 0, 98, 0, 78, 0, 108, 0, 80, 0, 78, 0, 106, 0, 108, 0, 29, 0, 57, 0, 2, 0, 29, 0, 84, 0, 57, 0, 36, 0, 89, 0, 34, 0, 36, 0, 91, 0, 89, 0, 16, 0, 73, 0, 18, 0, 16, 0, 71, 0, 73, 0, 52, 0, 105, 0, 50, 0, 52, 0, 107, 0, 105, 0, 1, 0, 59, 0, 4, 0, 1, 0, 56, 0, 59, 0, 38, 0, 91, 0, 36, 0, 38, 0, 93, 0, 91, 0, 18, 0, 75, 0, 20, 0, 18, 0, 73, 0, 75, 0, 55, 0, 107, 0, 52, 0, 55, 0, 110, 0, 107, 0, 4, 0, 61, 0, 6, 0, 4, 0, 59, 0, 61, 0, 40, 0, 93, 0, 38, 0, 40, 0, 95, 0, 93, 0, 20, 0, 77, 0, 22, 0, 20, 0, 75, 0, 77, 0, 6, 0, 63, 0, 8, 0, 6, 0, 61, 0, 63, 0, 42, 0, 95, 0, 40, 0, 42, 0, 97, 0, 95, 0, 22, 0, 79, 0, 24, 0, 22, 0, 77, 0, 79, 0, 8, 0, 65, 0, 10, 0, 8, 0, 63, 0, 65, 0, 44, 0, 97, 0, 42, 0, 44, 0, 99, 0, 97, 0, 24, 0, 82, 0, 27, 0, 24, 0, 79, 0, 82, 0, 10, 0, 67, 0, 12, 0, 10, 0, 65, 0, 67, 0, 46, 0, 99, 0, 44, 0, 46, 0, 101, 0, 99, 0, 32, 0, 85, 0, 30, 0, 32, 0, 87, 0, 85, 0, 12, 0, 69, 0, 14, 0, 12, 0, 67, 0, 69, 0, 48, 0, 101, 0, 46, 0, 48, 0, 103, 0, 101, 0, 34, 0, 87, 0, 32, 0, 34, 0, 89, 0, 87, 0, 25, 0, 109, 0, 53, 0, 25, 0, 81, 0, 109, 0, 14, 0, 71, 0, 16, 0, 14, 0, 69, 0, 71, 0, 50, 0, 103, 0, 48, 0, 50, 0, 105, 0, 103, 0),
+"lods": [1.35022, PackedByteArray(13, 0, 17, 0, 41, 0, 17, 0, 51, 0, 41, 0, 13, 0, 41, 0, 37, 0, 17, 0, 23, 0, 51, 0, 23, 0, 54, 0, 51, 0, 23, 0, 26, 0, 54, 0, 5, 0, 13, 0, 37, 0, 5, 0, 37, 0, 31, 0, 0, 0, 5, 0, 31, 0, 0, 0, 31, 0, 28, 0, 60, 0, 88, 0, 94, 0, 58, 0, 88, 0, 60, 0, 58, 0, 86, 0, 88, 0, 60, 0, 94, 0, 66, 0, 66, 0, 94, 0, 98, 0, 66, 0, 98, 0, 70, 0, 70, 0, 98, 0, 102, 0, 70, 0, 102, 0, 74, 0, 74, 0, 102, 0, 106, 0, 74, 0, 106, 0, 80, 0, 80, 0, 106, 0, 111, 0, 80, 0, 111, 0, 83, 0, 29, 0, 57, 0, 2, 0, 29, 0, 84, 0, 57, 0, 38, 0, 93, 0, 32, 0, 42, 0, 93, 0, 38, 0, 32, 0, 93, 0, 87, 0, 32, 0, 87, 0, 85, 0, 32, 0, 85, 0, 30, 0, 42, 0, 97, 0, 93, 0, 52, 0, 97, 0, 42, 0, 52, 0, 101, 0, 97, 0, 52, 0, 105, 0, 101, 0, 55, 0, 105, 0, 52, 0, 55, 0, 110, 0, 105, 0, 18, 0, 69, 0, 73, 0, 18, 0, 73, 0, 79, 0, 14, 0, 69, 0, 18, 0, 18, 0, 79, 0, 24, 0, 24, 0, 79, 0, 82, 0, 24, 0, 82, 0, 27, 0, 14, 0, 65, 0, 69, 0, 6, 0, 65, 0, 14, 0, 6, 0, 59, 0, 65, 0, 1, 0, 59, 0, 6, 0, 1, 0, 56, 0, 59, 0, 25, 0, 109, 0, 53, 0, 25, 0, 81, 0, 109, 0), 3.44322, PackedByteArray(13, 0, 54, 0, 41, 0, 13, 0, 26, 0, 54, 0, 0, 0, 13, 0, 41, 0, 0, 0, 41, 0, 28, 0, 80, 0, 111, 0, 83, 0, 80, 0, 98, 0, 111, 0, 70, 0, 98, 0, 80, 0, 66, 0, 98, 0, 70, 0, 58, 0, 112, 0, 66, 0, 58, 0, 86, 0, 113, 0, 29, 0, 57, 0, 2, 0, 29, 0, 84, 0, 57, 0, 14, 0, 69, 0, 79, 0, 14, 0, 79, 0, 82, 0, 14, 0, 82, 0, 27, 0, 14, 0, 65, 0, 69, 0, 1, 0, 65, 0, 14, 0, 1, 0, 56, 0, 65, 0, 55, 0, 97, 0, 42, 0, 55, 0, 110, 0, 97, 0, 42, 0, 97, 0, 85, 0, 42, 0, 85, 0, 30, 0, 25, 0, 109, 0, 53, 0, 25, 0, 81, 0, 109, 0)],
+"material": ExtResource("1_2l2lr"),
+"primitive": 3,
+"vertex_count": 114,
+"vertex_data": PackedByteArray(0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 160, 64, 223, 7, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 160, 192, 132, 199, 138, 63, 227, 14, 255, 127, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 160, 192, 132, 199, 138, 63, 255, 127, 0, 0, 255, 255, 255, 191, 220, 147, 126, 64, 0, 0, 160, 192, 194, 238, 48, 192, 12, 27, 255, 127, 255, 255, 255, 191, 220, 147, 126, 64, 0, 0, 160, 192, 194, 238, 48, 192, 255, 127, 0, 0, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 160, 192, 76, 96, 207, 192, 125, 37, 255, 127, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 160, 192, 76, 96, 207, 192, 255, 127, 0, 0, 255, 255, 255, 191, 52, 19, 123, 63, 0, 0, 160, 192, 3, 0, 32, 193, 217, 46, 255, 127, 255, 255, 255, 191, 52, 19, 123, 63, 0, 0, 160, 192, 3, 0, 32, 193, 255, 127, 0, 0, 255, 255, 255, 191, 245, 133, 153, 191, 0, 0, 160, 192, 159, 52, 84, 193, 146, 55, 255, 127, 255, 255, 255, 191, 245, 133, 153, 191, 0, 0, 160, 192, 159, 52, 84, 193, 255, 127, 0, 0, 255, 255, 255, 191, 230, 90, 114, 192, 0, 0, 160, 192, 166, 180, 129, 193, 255, 63, 255, 127, 255, 255, 255, 191, 230, 90, 114, 192, 0, 0, 160, 192, 166, 180, 129, 193, 255, 127, 0, 0, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 160, 192, 164, 103, 150, 193, 108, 72, 255, 127, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 160, 192, 164, 103, 150, 193, 255, 127, 0, 0, 255, 255, 255, 191, 3, 0, 32, 193, 0, 0, 160, 192, 158, 216, 167, 193, 37, 81, 255, 127, 255, 255, 255, 191, 3, 0, 32, 193, 0, 0, 160, 192, 158, 216, 167, 193, 255, 127, 0, 0, 255, 255, 255, 191, 225, 79, 88, 193, 0, 0, 160, 192, 46, 187, 181, 193, 129, 90, 255, 127, 255, 255, 255, 191, 225, 79, 88, 193, 0, 0, 160, 192, 46, 187, 181, 193, 255, 127, 0, 0, 255, 255, 255, 191, 44, 226, 137, 193, 0, 0, 160, 192, 130, 210, 191, 193, 243, 100, 255, 127, 255, 255, 255, 191, 44, 226, 137, 193, 0, 0, 160, 192, 130, 210, 191, 193, 255, 127, 0, 0, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 160, 192, 102, 242, 197, 193, 27, 113, 255, 127, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 160, 192, 102, 242, 197, 193, 255, 127, 0, 0, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 160, 192, 6, 0, 200, 193, 0, 0, 255, 127, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 160, 192, 6, 0, 200, 193, 32, 120, 255, 127, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 160, 192, 6, 0, 200, 193, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 223, 7, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 192, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 0, 192, 132, 199, 138, 63, 227, 14, 255, 127, 255, 255, 255, 191, 125, 201, 151, 64, 0, 0, 0, 192, 132, 199, 138, 63, 255, 127, 255, 255, 255, 255, 255, 191, 220, 147, 126, 64, 0, 0, 0, 192, 194, 238, 48, 192, 12, 27, 255, 127, 255, 255, 255, 191, 220, 147, 126, 64, 0, 0, 0, 192, 194, 238, 48, 192, 255, 127, 255, 255, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 0, 192, 76, 96, 207, 192, 125, 37, 255, 127, 255, 255, 255, 191, 68, 217, 45, 64, 0, 0, 0, 192, 76, 96, 207, 192, 255, 127, 255, 255, 255, 255, 255, 191, 52, 19, 123, 63, 0, 0, 0, 192, 3, 0, 32, 193, 217, 46, 255, 127, 255, 255, 255, 191, 52, 19, 123, 63, 0, 0, 0, 192, 3, 0, 32, 193, 255, 127, 255, 255, 255, 255, 255, 191, 245, 133, 153, 191, 0, 0, 0, 192, 159, 52, 84, 193, 146, 55, 255, 127, 255, 255, 255, 191, 245, 133, 153, 191, 0, 0, 0, 192, 159, 52, 84, 193, 255, 127, 255, 255, 255, 255, 255, 191, 230, 90, 114, 192, 0, 0, 0, 192, 166, 180, 129, 193, 255, 63, 255, 127, 255, 255, 255, 191, 230, 90, 114, 192, 0, 0, 0, 192, 166, 180, 129, 193, 255, 127, 255, 255, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 0, 192, 164, 103, 150, 193, 108, 72, 255, 127, 255, 255, 255, 191, 207, 150, 215, 192, 0, 0, 0, 192, 164, 103, 150, 193, 255, 127, 255, 255, 255, 255, 255, 191, 3, 0, 32, 193, 0, 0, 0, 192, 158, 216, 167, 193, 37, 81, 255, 127, 255, 255, 255, 191, 3, 0, 32, 193, 0, 0, 0, 192, 158, 216, 167, 193, 255, 127, 255, 255, 255, 255, 255, 191, 225, 79, 88, 193, 0, 0, 0, 192, 46, 187, 181, 193, 129, 90, 255, 127, 255, 255, 255, 191, 225, 79, 88, 193, 0, 0, 0, 192, 46, 187, 181, 193, 255, 127, 255, 255, 255, 255, 255, 191, 44, 226, 137, 193, 0, 0, 0, 192, 130, 210, 191, 193, 243, 100, 255, 127, 255, 255, 255, 191, 44, 226, 137, 193, 0, 0, 0, 192, 130, 210, 191, 193, 255, 127, 255, 255, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 0, 192, 102, 242, 197, 193, 27, 113, 255, 127, 255, 255, 255, 191, 126, 172, 168, 193, 0, 0, 0, 192, 102, 242, 197, 193, 255, 127, 255, 255, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 0, 192, 6, 0, 200, 193, 0, 0, 255, 127, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 0, 192, 6, 0, 200, 193, 32, 120, 255, 127, 255, 255, 255, 191, 6, 0, 200, 193, 0, 0, 0, 192, 6, 0, 200, 193, 255, 127, 255, 255, 255, 255, 255, 191, 118, 238, 191, 64, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 118, 238, 191, 64, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 118, 238, 191, 64, 0, 0, 160, 192, 0, 0, 160, 64, 255, 255, 208, 135, 255, 255, 255, 191, 104, 131, 183, 64, 0, 0, 160, 192, 222, 36, 116, 63, 255, 127, 0, 0, 255, 255, 255, 191, 104, 131, 183, 64, 0, 0, 160, 192, 222, 36, 116, 63, 255, 255, 221, 142, 255, 255, 255, 191, 203, 50, 158, 64, 0, 0, 160, 192, 64, 127, 65, 192, 255, 127, 0, 0, 255, 255, 255, 191, 203, 50, 158, 64, 0, 0, 160, 192, 64, 127, 65, 192, 255, 255, 11, 155, 255, 255, 255, 191, 28, 250, 104, 64, 0, 0, 160, 192, 61, 159, 219, 192, 255, 127, 0, 0, 255, 255, 255, 191, 28, 250, 104, 64, 0, 0, 160, 192, 61, 159, 219, 192, 255, 255, 125, 165, 255, 255, 255, 191, 134, 99, 236, 63, 0, 0, 160, 192, 3, 0, 40, 193, 255, 127, 0, 0, 255, 255, 255, 191, 134, 99, 236, 63, 0, 0, 160, 192, 3, 0, 40, 193, 255, 255, 217, 174, 255, 255, 255, 191, 108, 229, 207, 190, 0, 0, 160, 192, 28, 242, 93, 193, 255, 127, 0, 0, 255, 255, 255, 191, 108, 229, 207, 190, 0, 0, 160, 192, 28, 242, 93, 193, 255, 255, 146, 183, 255, 255, 255, 191, 169, 25, 69, 192, 0, 0, 160, 192, 206, 92, 135, 193, 255, 127, 0, 0, 255, 255, 255, 191, 169, 25, 69, 192, 0, 0, 160, 192, 206, 92, 135, 193, 255, 255, 255, 191, 255, 255, 255, 191, 213, 27, 196, 192, 0, 0, 160, 192, 110, 192, 156, 193, 255, 127, 0, 0, 255, 255, 255, 191, 213, 27, 196, 192, 0, 0, 160, 192, 110, 192, 156, 193, 255, 255, 108, 200, 255, 255, 255, 191, 3, 0, 24, 193, 0, 0, 160, 192, 61, 198, 174, 193, 255, 127, 0, 0, 255, 255, 255, 191, 3, 0, 24, 193, 0, 0, 160, 192, 61, 198, 174, 193, 255, 255, 37, 209, 255, 255, 255, 191, 104, 48, 82, 193, 0, 0, 160, 192, 73, 31, 189, 193, 255, 127, 0, 0, 255, 255, 255, 191, 104, 48, 82, 193, 0, 0, 160, 192, 73, 31, 189, 193, 255, 255, 129, 218, 255, 255, 255, 191, 28, 208, 135, 193, 0, 0, 160, 192, 185, 140, 199, 193, 255, 127, 0, 0, 255, 255, 255, 191, 28, 208, 135, 193, 0, 0, 160, 192, 185, 140, 199, 193, 255, 255, 242, 228, 255, 255, 255, 191, 45, 161, 167, 193, 0, 0, 160, 192, 225, 224, 205, 193, 255, 127, 0, 0, 255, 255, 255, 191, 45, 161, 167, 193, 0, 0, 160, 192, 225, 224, 205, 193, 255, 255, 32, 241, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 160, 192, 163, 251, 207, 193, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 160, 192, 163, 251, 207, 193, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 160, 192, 163, 251, 207, 193, 255, 255, 46, 248, 255, 255, 255, 191, 118, 238, 191, 64, 0, 0, 0, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 118, 238, 191, 64, 0, 0, 0, 192, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 118, 238, 191, 64, 0, 0, 0, 192, 0, 0, 160, 64, 255, 255, 208, 135, 255, 255, 255, 191, 104, 131, 183, 64, 0, 0, 0, 192, 222, 36, 116, 63, 255, 127, 255, 255, 255, 255, 255, 191, 104, 131, 183, 64, 0, 0, 0, 192, 222, 36, 116, 63, 255, 255, 221, 142, 255, 255, 255, 191, 203, 50, 158, 64, 0, 0, 0, 192, 64, 127, 65, 192, 255, 127, 255, 255, 255, 255, 255, 191, 203, 50, 158, 64, 0, 0, 0, 192, 64, 127, 65, 192, 255, 255, 11, 155, 255, 255, 255, 191, 28, 250, 104, 64, 0, 0, 0, 192, 61, 159, 219, 192, 255, 127, 255, 255, 255, 255, 255, 191, 28, 250, 104, 64, 0, 0, 0, 192, 61, 159, 219, 192, 255, 255, 125, 165, 255, 255, 255, 191, 134, 99, 236, 63, 0, 0, 0, 192, 3, 0, 40, 193, 255, 127, 255, 255, 255, 255, 255, 191, 134, 99, 236, 63, 0, 0, 0, 192, 3, 0, 40, 193, 255, 255, 217, 174, 255, 255, 255, 191, 108, 229, 207, 190, 0, 0, 0, 192, 28, 242, 93, 193, 255, 127, 255, 255, 255, 255, 255, 191, 108, 229, 207, 190, 0, 0, 0, 192, 28, 242, 93, 193, 255, 255, 146, 183, 255, 255, 255, 191, 169, 25, 69, 192, 0, 0, 0, 192, 206, 92, 135, 193, 255, 127, 255, 255, 255, 255, 255, 191, 169, 25, 69, 192, 0, 0, 0, 192, 206, 92, 135, 193, 255, 255, 255, 191, 255, 255, 255, 191, 213, 27, 196, 192, 0, 0, 0, 192, 110, 192, 156, 193, 255, 127, 255, 255, 255, 255, 255, 191, 213, 27, 196, 192, 0, 0, 0, 192, 110, 192, 156, 193, 255, 255, 108, 200, 255, 255, 255, 191, 3, 0, 24, 193, 0, 0, 0, 192, 61, 198, 174, 193, 255, 127, 255, 255, 255, 255, 255, 191, 3, 0, 24, 193, 0, 0, 0, 192, 61, 198, 174, 193, 255, 255, 37, 209, 255, 255, 255, 191, 104, 48, 82, 193, 0, 0, 0, 192, 73, 31, 189, 193, 255, 127, 255, 255, 255, 255, 255, 191, 104, 48, 82, 193, 0, 0, 0, 192, 73, 31, 189, 193, 255, 255, 129, 218, 255, 255, 255, 191, 28, 208, 135, 193, 0, 0, 0, 192, 185, 140, 199, 193, 255, 127, 255, 255, 255, 255, 255, 191, 28, 208, 135, 193, 0, 0, 0, 192, 185, 140, 199, 193, 255, 255, 242, 228, 255, 255, 255, 191, 45, 161, 167, 193, 0, 0, 0, 192, 225, 224, 205, 193, 255, 127, 255, 255, 255, 255, 255, 191, 45, 161, 167, 193, 0, 0, 0, 192, 225, 224, 205, 193, 255, 255, 32, 241, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 0, 192, 163, 251, 207, 193, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 0, 192, 163, 251, 207, 193, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 0, 192, 163, 251, 207, 193, 255, 255, 46, 248, 255, 255, 255, 191, 169, 25, 69, 192, 0, 0, 0, 192, 206, 92, 135, 193, 255, 226, 116, 195, 255, 255, 255, 191, 169, 25, 69, 192, 0, 0, 0, 192, 206, 92, 135, 193, 255, 255, 193, 139, 255, 255, 255, 191)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_k5wpl")
diff --git a/assets/meshes/walls/small_curved_wall.tres b/assets/meshes/walls/small_curved_wall.tres
new file mode 100644
index 0000000..f20aafd
--- /dev/null
+++ b/assets/meshes/walls/small_curved_wall.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://cpisquk518aee"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_cxqsh"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_4fq5t"]
+_surfaces = [{
+"aabb": AABB(-25, -5, -15, 20, 3, 20),
+"format": 4097,
+"index_count": 300,
+"index_data": PackedByteArray(11, 0, 23, 0, 24, 0, 11, 0, 10, 0, 23, 0, 4, 0, 16, 0, 17, 0, 4, 0, 3, 0, 16, 0, 9, 0, 21, 0, 22, 0, 9, 0, 8, 0, 21, 0, 2, 0, 14, 0, 15, 0, 2, 0, 1, 0, 14, 0, 7, 0, 19, 0, 20, 0, 7, 0, 6, 0, 19, 0, 12, 0, 24, 0, 25, 0, 12, 0, 11, 0, 24, 0, 5, 0, 17, 0, 18, 0, 5, 0, 4, 0, 17, 0, 10, 0, 22, 0, 23, 0, 10, 0, 9, 0, 22, 0, 3, 0, 15, 0, 16, 0, 3, 0, 2, 0, 15, 0, 8, 0, 20, 0, 21, 0, 8, 0, 7, 0, 20, 0, 1, 0, 13, 0, 14, 0, 1, 0, 0, 0, 13, 0, 6, 0, 18, 0, 19, 0, 6, 0, 5, 0, 18, 0, 37, 0, 49, 0, 36, 0, 37, 0, 50, 0, 49, 0, 30, 0, 42, 0, 29, 0, 30, 0, 43, 0, 42, 0, 35, 0, 47, 0, 34, 0, 35, 0, 48, 0, 47, 0, 28, 0, 40, 0, 27, 0, 28, 0, 41, 0, 40, 0, 33, 0, 45, 0, 32, 0, 33, 0, 46, 0, 45, 0, 38, 0, 50, 0, 37, 0, 38, 0, 51, 0, 50, 0, 31, 0, 43, 0, 30, 0, 31, 0, 44, 0, 43, 0, 36, 0, 48, 0, 35, 0, 36, 0, 49, 0, 48, 0, 29, 0, 41, 0, 28, 0, 29, 0, 42, 0, 41, 0, 34, 0, 46, 0, 33, 0, 34, 0, 47, 0, 46, 0, 27, 0, 39, 0, 26, 0, 27, 0, 40, 0, 39, 0, 32, 0, 44, 0, 31, 0, 32, 0, 45, 0, 44, 0, 11, 0, 36, 0, 10, 0, 11, 0, 37, 0, 36, 0, 4, 0, 29, 0, 3, 0, 4, 0, 30, 0, 29, 0, 19, 0, 46, 0, 20, 0, 19, 0, 45, 0, 46, 0, 12, 0, 37, 0, 11, 0, 12, 0, 38, 0, 37, 0, 25, 0, 38, 0, 12, 0, 25, 0, 51, 0, 38, 0, 5, 0, 30, 0, 4, 0, 5, 0, 31, 0, 30, 0, 20, 0, 47, 0, 21, 0, 20, 0, 46, 0, 47, 0, 13, 0, 40, 0, 14, 0, 13, 0, 39, 0, 40, 0, 6, 0, 31, 0, 5, 0, 6, 0, 32, 0, 31, 0, 21, 0, 48, 0, 22, 0, 21, 0, 47, 0, 48, 0, 0, 0, 39, 0, 13, 0, 0, 0, 26, 0, 39, 0, 14, 0, 41, 0, 15, 0, 14, 0, 40, 0, 41, 0, 7, 0, 32, 0, 6, 0, 7, 0, 33, 0, 32, 0, 22, 0, 49, 0, 23, 0, 22, 0, 48, 0, 49, 0, 15, 0, 42, 0, 16, 0, 15, 0, 41, 0, 42, 0, 8, 0, 33, 0, 7, 0, 8, 0, 34, 0, 33, 0, 23, 0, 50, 0, 24, 0, 23, 0, 49, 0, 50, 0, 1, 0, 26, 0, 0, 0, 1, 0, 27, 0, 26, 0, 16, 0, 43, 0, 17, 0, 16, 0, 42, 0, 43, 0, 9, 0, 34, 0, 8, 0, 9, 0, 35, 0, 34, 0, 24, 0, 51, 0, 25, 0, 24, 0, 50, 0, 51, 0, 2, 0, 27, 0, 1, 0, 2, 0, 28, 0, 27, 0, 17, 0, 44, 0, 18, 0, 17, 0, 43, 0, 44, 0, 10, 0, 35, 0, 9, 0, 10, 0, 36, 0, 35, 0, 3, 0, 28, 0, 2, 0, 3, 0, 29, 0, 28, 0, 18, 0, 45, 0, 19, 0, 18, 0, 44, 0, 45, 0),
+"lods": [0.714366, PackedByteArray(12, 0, 23, 0, 25, 0, 12, 0, 11, 0, 23, 0, 11, 0, 22, 0, 23, 0, 11, 0, 8, 0, 22, 0, 8, 0, 20, 0, 22, 0, 8, 0, 6, 0, 20, 0, 6, 0, 18, 0, 20, 0, 6, 0, 3, 0, 18, 0, 3, 0, 17, 0, 18, 0, 3, 0, 15, 0, 17, 0, 3, 0, 13, 0, 15, 0, 3, 0, 0, 0, 13, 0, 35, 0, 50, 0, 33, 0, 36, 0, 50, 0, 35, 0, 38, 0, 50, 0, 36, 0, 38, 0, 51, 0, 50, 0, 33, 0, 50, 0, 45, 0, 33, 0, 45, 0, 31, 0, 31, 0, 45, 0, 40, 0, 31, 0, 40, 0, 28, 0, 28, 0, 40, 0, 39, 0, 28, 0, 39, 0, 26, 0, 12, 0, 36, 0, 11, 0, 12, 0, 38, 0, 36, 0, 11, 0, 36, 0, 35, 0, 11, 0, 35, 0, 8, 0, 8, 0, 35, 0, 33, 0, 8, 0, 33, 0, 6, 0, 6, 0, 33, 0, 31, 0, 6, 0, 31, 0, 3, 0, 3, 0, 31, 0, 28, 0, 3, 0, 28, 0, 26, 0, 3, 0, 26, 0, 0, 0, 25, 0, 38, 0, 12, 0, 25, 0, 51, 0, 38, 0, 20, 0, 50, 0, 22, 0, 22, 0, 50, 0, 23, 0, 23, 0, 50, 0, 51, 0, 23, 0, 51, 0, 25, 0, 20, 0, 45, 0, 50, 0, 18, 0, 45, 0, 20, 0, 17, 0, 45, 0, 18, 0, 15, 0, 45, 0, 17, 0, 15, 0, 40, 0, 45, 0, 13, 0, 40, 0, 15, 0, 13, 0, 39, 0, 40, 0, 0, 0, 39, 0, 13, 0, 0, 0, 26, 0, 39, 0), 5.12897, PackedByteArray(12, 0, 23, 0, 25, 0, 12, 0, 8, 0, 23, 0, 8, 0, 18, 0, 23, 0, 8, 0, 13, 0, 18, 0, 8, 0, 0, 0, 13, 0, 38, 0, 50, 0, 35, 0, 38, 0, 51, 0, 50, 0, 35, 0, 50, 0, 40, 0, 35, 0, 40, 0, 39, 0, 35, 0, 39, 0, 26, 0, 12, 0, 35, 0, 8, 0, 12, 0, 38, 0, 35, 0, 8, 0, 35, 0, 26, 0, 8, 0, 26, 0, 0, 0, 25, 0, 38, 0, 12, 0, 25, 0, 51, 0, 38, 0, 23, 0, 40, 0, 50, 0, 23, 0, 50, 0, 51, 0, 23, 0, 51, 0, 25, 0, 18, 0, 40, 0, 23, 0, 13, 0, 40, 0, 18, 0, 13, 0, 39, 0, 40, 0, 0, 0, 39, 0, 13, 0, 0, 0, 26, 0, 39, 0)],
+"primitive": 3,
+"vertex_count": 52,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 160, 64, 173, 121, 165, 192, 0, 0, 160, 192, 42, 237, 24, 64, 183, 206, 181, 192, 0, 0, 160, 192, 144, 157, 52, 190, 149, 183, 208, 192, 0, 0, 160, 192, 190, 213, 41, 192, 104, 190, 245, 192, 0, 0, 160, 192, 6, 0, 160, 192, 128, 32, 18, 193, 0, 0, 160, 192, 128, 155, 229, 192, 210, 185, 45, 193, 0, 0, 160, 192, 52, 70, 18, 193, 70, 50, 77, 193, 0, 0, 160, 192, 134, 223, 45, 193, 3, 0, 112, 193, 0, 0, 160, 192, 210, 32, 69, 193, 76, 197, 138, 193, 0, 0, 160, 192, 60, 164, 87, 193, 202, 150, 158, 193, 0, 0, 160, 192, 171, 24, 101, 193, 170, 29, 179, 193, 0, 0, 160, 192, 48, 67, 109, 193, 4, 0, 200, 193, 0, 0, 160, 192, 7, 0, 112, 193, 0, 0, 160, 192, 0, 0, 0, 192, 0, 0, 160, 64, 173, 121, 165, 192, 0, 0, 0, 192, 42, 237, 24, 64, 183, 206, 181, 192, 0, 0, 0, 192, 144, 157, 52, 190, 149, 183, 208, 192, 0, 0, 0, 192, 190, 213, 41, 192, 104, 190, 245, 192, 0, 0, 0, 192, 6, 0, 160, 192, 128, 32, 18, 193, 0, 0, 0, 192, 128, 155, 229, 192, 210, 185, 45, 193, 0, 0, 0, 192, 52, 70, 18, 193, 70, 50, 77, 193, 0, 0, 0, 192, 134, 223, 45, 193, 3, 0, 112, 193, 0, 0, 0, 192, 210, 32, 69, 193, 76, 197, 138, 193, 0, 0, 0, 192, 60, 164, 87, 193, 202, 150, 158, 193, 0, 0, 0, 192, 171, 24, 101, 193, 170, 29, 179, 193, 0, 0, 0, 192, 48, 67, 109, 193, 4, 0, 200, 193, 0, 0, 0, 192, 7, 0, 112, 193, 118, 238, 191, 192, 0, 0, 160, 192, 0, 0, 160, 64, 152, 51, 197, 192, 0, 0, 160, 192, 181, 71, 33, 64, 148, 183, 212, 192, 0, 0, 160, 192, 152, 212, 168, 61, 1, 72, 238, 192, 0, 0, 160, 192, 219, 87, 17, 192, 113, 186, 8, 193, 0, 0, 160, 192, 6, 0, 144, 192, 19, 210, 30, 193, 0, 0, 160, 192, 135, 32, 210, 192, 33, 10, 57, 193, 0, 0, 160, 192, 229, 245, 6, 193, 195, 239, 86, 193, 0, 0, 160, 192, 243, 45, 33, 193, 3, 0, 120, 193, 0, 0, 160, 192, 149, 69, 55, 193, 8, 213, 141, 193, 0, 0, 160, 192, 6, 220, 72, 193, 218, 168, 160, 193, 0, 0, 160, 192, 60, 164, 85, 193, 251, 40, 180, 193, 0, 0, 160, 192, 59, 102, 93, 193, 0, 0, 200, 193, 0, 0, 160, 192, 204, 8, 96, 193, 118, 238, 191, 192, 0, 0, 0, 192, 0, 0, 160, 64, 152, 51, 197, 192, 0, 0, 0, 192, 181, 71, 33, 64, 148, 183, 212, 192, 0, 0, 0, 192, 152, 212, 168, 61, 1, 72, 238, 192, 0, 0, 0, 192, 219, 87, 17, 192, 113, 186, 8, 193, 0, 0, 0, 192, 6, 0, 144, 192, 19, 210, 30, 193, 0, 0, 0, 192, 135, 32, 210, 192, 33, 10, 57, 193, 0, 0, 0, 192, 229, 245, 6, 193, 195, 239, 86, 193, 0, 0, 0, 192, 243, 45, 33, 193, 3, 0, 120, 193, 0, 0, 0, 192, 149, 69, 55, 193, 8, 213, 141, 193, 0, 0, 0, 192, 6, 220, 72, 193, 218, 168, 160, 193, 0, 0, 0, 192, 60, 164, 85, 193, 251, 40, 180, 193, 0, 0, 0, 192, 59, 102, 93, 193, 0, 0, 200, 193, 0, 0, 0, 192, 204, 8, 96, 193)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "wide_turn-2-c480f470ca883b94516a2580e8704fd7_Cube_006"
+_surfaces = [{
+"aabb": AABB(-25, -5, -15, 20, 3, 20),
+"attribute_data": PackedByteArray(0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63),
+"format": 4119,
+"index_count": 300,
+"index_data": PackedByteArray(24, 0, 50, 0, 52, 0, 24, 0, 22, 0, 50, 0, 10, 0, 36, 0, 38, 0, 10, 0, 8, 0, 36, 0, 20, 0, 46, 0, 48, 0, 20, 0, 18, 0, 46, 0, 6, 0, 32, 0, 34, 0, 6, 0, 4, 0, 32, 0, 16, 0, 42, 0, 44, 0, 16, 0, 14, 0, 42, 0, 27, 0, 52, 0, 55, 0, 27, 0, 24, 0, 52, 0, 12, 0, 38, 0, 40, 0, 12, 0, 10, 0, 38, 0, 22, 0, 48, 0, 50, 0, 22, 0, 20, 0, 48, 0, 8, 0, 34, 0, 36, 0, 8, 0, 6, 0, 34, 0, 18, 0, 44, 0, 46, 0, 18, 0, 16, 0, 44, 0, 4, 0, 30, 0, 32, 0, 4, 0, 2, 0, 30, 0, 14, 0, 40, 0, 42, 0, 14, 0, 12, 0, 40, 0, 79, 0, 105, 0, 77, 0, 79, 0, 107, 0, 105, 0, 65, 0, 91, 0, 63, 0, 65, 0, 93, 0, 91, 0, 75, 0, 101, 0, 73, 0, 75, 0, 103, 0, 101, 0, 61, 0, 87, 0, 59, 0, 61, 0, 89, 0, 87, 0, 71, 0, 97, 0, 69, 0, 71, 0, 99, 0, 97, 0, 82, 0, 107, 0, 79, 0, 82, 0, 110, 0, 107, 0, 67, 0, 93, 0, 65, 0, 67, 0, 95, 0, 93, 0, 77, 0, 103, 0, 75, 0, 77, 0, 105, 0, 103, 0, 63, 0, 89, 0, 61, 0, 63, 0, 91, 0, 89, 0, 73, 0, 99, 0, 71, 0, 73, 0, 101, 0, 99, 0, 59, 0, 84, 0, 56, 0, 59, 0, 87, 0, 84, 0, 69, 0, 95, 0, 67, 0, 69, 0, 97, 0, 95, 0, 23, 0, 78, 0, 21, 0, 23, 0, 80, 0, 78, 0, 9, 0, 64, 0, 7, 0, 9, 0, 66, 0, 64, 0, 41, 0, 100, 0, 43, 0, 41, 0, 98, 0, 100, 0, 26, 0, 80, 0, 23, 0, 26, 0, 83, 0, 80, 0, 53, 0, 81, 0, 25, 0, 53, 0, 109, 0, 81, 0, 11, 0, 66, 0, 9, 0, 11, 0, 68, 0, 66, 0, 43, 0, 102, 0, 45, 0, 43, 0, 100, 0, 102, 0, 29, 0, 88, 0, 31, 0, 29, 0, 86, 0, 88, 0, 13, 0, 68, 0, 11, 0, 13, 0, 70, 0, 68, 0, 45, 0, 104, 0, 47, 0, 45, 0, 102, 0, 104, 0, 1, 0, 85, 0, 28, 0, 1, 0, 58, 0, 85, 0, 31, 0, 90, 0, 33, 0, 31, 0, 88, 0, 90, 0, 15, 0, 70, 0, 13, 0, 15, 0, 72, 0, 70, 0, 47, 0, 106, 0, 49, 0, 47, 0, 104, 0, 106, 0, 33, 0, 92, 0, 35, 0, 33, 0, 90, 0, 92, 0, 17, 0, 72, 0, 15, 0, 17, 0, 74, 0, 72, 0, 49, 0, 108, 0, 51, 0, 49, 0, 106, 0, 108, 0, 3, 0, 57, 0, 0, 0, 3, 0, 60, 0, 57, 0, 35, 0, 94, 0, 37, 0, 35, 0, 92, 0, 94, 0, 19, 0, 74, 0, 17, 0, 19, 0, 76, 0, 74, 0, 51, 0, 111, 0, 54, 0, 51, 0, 108, 0, 111, 0, 5, 0, 60, 0, 3, 0, 5, 0, 62, 0, 60, 0, 37, 0, 96, 0, 39, 0, 37, 0, 94, 0, 96, 0, 21, 0, 76, 0, 19, 0, 21, 0, 78, 0, 76, 0, 7, 0, 62, 0, 5, 0, 7, 0, 64, 0, 62, 0, 39, 0, 98, 0, 41, 0, 39, 0, 96, 0, 98, 0),
+"lods": [0.714366, PackedByteArray(27, 0, 50, 0, 55, 0, 27, 0, 24, 0, 50, 0, 24, 0, 48, 0, 50, 0, 24, 0, 18, 0, 48, 0, 18, 0, 44, 0, 48, 0, 18, 0, 14, 0, 44, 0, 14, 0, 40, 0, 44, 0, 14, 0, 8, 0, 40, 0, 8, 0, 38, 0, 40, 0, 8, 0, 34, 0, 38, 0, 8, 0, 30, 0, 34, 0, 8, 0, 2, 0, 30, 0, 75, 0, 107, 0, 71, 0, 77, 0, 107, 0, 75, 0, 82, 0, 107, 0, 77, 0, 82, 0, 110, 0, 107, 0, 71, 0, 107, 0, 97, 0, 71, 0, 97, 0, 67, 0, 67, 0, 97, 0, 87, 0, 67, 0, 87, 0, 61, 0, 61, 0, 87, 0, 84, 0, 61, 0, 84, 0, 56, 0, 26, 0, 78, 0, 23, 0, 26, 0, 83, 0, 78, 0, 23, 0, 78, 0, 76, 0, 23, 0, 76, 0, 17, 0, 17, 0, 76, 0, 72, 0, 17, 0, 72, 0, 13, 0, 13, 0, 72, 0, 68, 0, 13, 0, 68, 0, 7, 0, 7, 0, 68, 0, 62, 0, 7, 0, 62, 0, 57, 0, 7, 0, 57, 0, 0, 0, 53, 0, 81, 0, 25, 0, 53, 0, 109, 0, 81, 0, 43, 0, 108, 0, 47, 0, 47, 0, 108, 0, 49, 0, 49, 0, 108, 0, 111, 0, 49, 0, 111, 0, 54, 0, 43, 0, 98, 0, 108, 0, 39, 0, 98, 0, 43, 0, 37, 0, 98, 0, 39, 0, 33, 0, 98, 0, 37, 0, 33, 0, 88, 0, 98, 0, 29, 0, 88, 0, 33, 0, 29, 0, 86, 0, 88, 0, 1, 0, 85, 0, 28, 0, 1, 0, 58, 0, 85, 0), 5.12897, PackedByteArray(27, 0, 50, 0, 55, 0, 27, 0, 18, 0, 50, 0, 18, 0, 114, 0, 50, 0, 112, 0, 113, 0, 114, 0, 18, 0, 2, 0, 113, 0, 82, 0, 107, 0, 75, 0, 82, 0, 110, 0, 107, 0, 75, 0, 107, 0, 87, 0, 75, 0, 87, 0, 84, 0, 75, 0, 84, 0, 56, 0, 26, 0, 76, 0, 17, 0, 26, 0, 83, 0, 76, 0, 17, 0, 76, 0, 57, 0, 17, 0, 57, 0, 0, 0, 53, 0, 81, 0, 25, 0, 53, 0, 109, 0, 81, 0, 49, 0, 88, 0, 108, 0, 49, 0, 108, 0, 111, 0, 49, 0, 111, 0, 54, 0, 39, 0, 88, 0, 49, 0, 29, 0, 88, 0, 39, 0, 29, 0, 86, 0, 88, 0, 1, 0, 85, 0, 28, 0, 1, 0, 58, 0, 85, 0)],
+"material": ExtResource("1_cxqsh"),
+"primitive": 3,
+"vertex_count": 115,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 160, 64, 255, 255, 222, 135, 255, 255, 255, 191, 173, 121, 165, 192, 0, 0, 160, 192, 42, 237, 24, 64, 255, 127, 0, 0, 255, 255, 255, 191, 173, 121, 165, 192, 0, 0, 160, 192, 42, 237, 24, 64, 255, 255, 227, 142, 255, 255, 255, 191, 183, 206, 181, 192, 0, 0, 160, 192, 144, 157, 52, 190, 255, 127, 0, 0, 255, 255, 255, 191, 183, 206, 181, 192, 0, 0, 160, 192, 144, 157, 52, 190, 255, 255, 11, 155, 255, 255, 255, 191, 149, 183, 208, 192, 0, 0, 160, 192, 190, 213, 41, 192, 255, 127, 0, 0, 255, 255, 255, 191, 149, 183, 208, 192, 0, 0, 160, 192, 190, 213, 41, 192, 255, 255, 125, 165, 255, 255, 255, 191, 104, 190, 245, 192, 0, 0, 160, 192, 6, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 104, 190, 245, 192, 0, 0, 160, 192, 6, 0, 160, 192, 255, 255, 217, 174, 255, 255, 255, 191, 128, 32, 18, 193, 0, 0, 160, 192, 128, 155, 229, 192, 255, 127, 0, 0, 255, 255, 255, 191, 128, 32, 18, 193, 0, 0, 160, 192, 128, 155, 229, 192, 255, 255, 146, 183, 255, 255, 255, 191, 210, 185, 45, 193, 0, 0, 160, 192, 52, 70, 18, 193, 255, 127, 0, 0, 255, 255, 255, 191, 210, 185, 45, 193, 0, 0, 160, 192, 52, 70, 18, 193, 255, 255, 255, 191, 255, 255, 255, 191, 70, 50, 77, 193, 0, 0, 160, 192, 134, 223, 45, 193, 255, 127, 0, 0, 255, 255, 255, 191, 70, 50, 77, 193, 0, 0, 160, 192, 134, 223, 45, 193, 255, 255, 108, 200, 255, 255, 255, 191, 3, 0, 112, 193, 0, 0, 160, 192, 210, 32, 69, 193, 255, 127, 0, 0, 255, 255, 255, 191, 3, 0, 112, 193, 0, 0, 160, 192, 210, 32, 69, 193, 255, 255, 37, 209, 255, 255, 255, 191, 76, 197, 138, 193, 0, 0, 160, 192, 60, 164, 87, 193, 255, 127, 0, 0, 255, 255, 255, 191, 76, 197, 138, 193, 0, 0, 160, 192, 60, 164, 87, 193, 255, 255, 129, 218, 255, 255, 255, 191, 202, 150, 158, 193, 0, 0, 160, 192, 171, 24, 101, 193, 255, 127, 0, 0, 255, 255, 255, 191, 202, 150, 158, 193, 0, 0, 160, 192, 171, 24, 101, 193, 255, 255, 242, 228, 255, 255, 255, 191, 170, 29, 179, 193, 0, 0, 160, 192, 48, 67, 109, 193, 255, 127, 0, 0, 255, 255, 255, 191, 170, 29, 179, 193, 0, 0, 160, 192, 48, 67, 109, 193, 255, 255, 27, 241, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 160, 192, 7, 0, 112, 193, 0, 0, 255, 127, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 160, 192, 7, 0, 112, 193, 255, 127, 0, 0, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 160, 192, 7, 0, 112, 193, 255, 255, 31, 248, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 192, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 192, 0, 0, 160, 64, 255, 255, 222, 135, 255, 255, 255, 191, 173, 121, 165, 192, 0, 0, 0, 192, 42, 237, 24, 64, 255, 127, 255, 255, 255, 255, 255, 191, 173, 121, 165, 192, 0, 0, 0, 192, 42, 237, 24, 64, 255, 255, 227, 142, 255, 255, 255, 191, 183, 206, 181, 192, 0, 0, 0, 192, 144, 157, 52, 190, 255, 127, 255, 255, 255, 255, 255, 191, 183, 206, 181, 192, 0, 0, 0, 192, 144, 157, 52, 190, 255, 255, 11, 155, 255, 255, 255, 191, 149, 183, 208, 192, 0, 0, 0, 192, 190, 213, 41, 192, 255, 127, 255, 255, 255, 255, 255, 191, 149, 183, 208, 192, 0, 0, 0, 192, 190, 213, 41, 192, 255, 255, 125, 165, 255, 255, 255, 191, 104, 190, 245, 192, 0, 0, 0, 192, 6, 0, 160, 192, 255, 127, 255, 255, 255, 255, 255, 191, 104, 190, 245, 192, 0, 0, 0, 192, 6, 0, 160, 192, 255, 255, 217, 174, 255, 255, 255, 191, 128, 32, 18, 193, 0, 0, 0, 192, 128, 155, 229, 192, 255, 127, 255, 255, 255, 255, 255, 191, 128, 32, 18, 193, 0, 0, 0, 192, 128, 155, 229, 192, 255, 255, 146, 183, 255, 255, 255, 191, 210, 185, 45, 193, 0, 0, 0, 192, 52, 70, 18, 193, 255, 127, 255, 255, 255, 255, 255, 191, 210, 185, 45, 193, 0, 0, 0, 192, 52, 70, 18, 193, 255, 255, 255, 191, 255, 255, 255, 191, 70, 50, 77, 193, 0, 0, 0, 192, 134, 223, 45, 193, 255, 127, 255, 255, 255, 255, 255, 191, 70, 50, 77, 193, 0, 0, 0, 192, 134, 223, 45, 193, 255, 255, 108, 200, 255, 255, 255, 191, 3, 0, 112, 193, 0, 0, 0, 192, 210, 32, 69, 193, 255, 127, 255, 255, 255, 255, 255, 191, 3, 0, 112, 193, 0, 0, 0, 192, 210, 32, 69, 193, 255, 255, 37, 209, 255, 255, 255, 191, 76, 197, 138, 193, 0, 0, 0, 192, 60, 164, 87, 193, 255, 127, 255, 255, 255, 255, 255, 191, 76, 197, 138, 193, 0, 0, 0, 192, 60, 164, 87, 193, 255, 255, 129, 218, 255, 255, 255, 191, 202, 150, 158, 193, 0, 0, 0, 192, 171, 24, 101, 193, 255, 127, 255, 255, 255, 255, 255, 191, 202, 150, 158, 193, 0, 0, 0, 192, 171, 24, 101, 193, 255, 255, 242, 228, 255, 255, 255, 191, 170, 29, 179, 193, 0, 0, 0, 192, 48, 67, 109, 193, 255, 127, 255, 255, 255, 255, 255, 191, 170, 29, 179, 193, 0, 0, 0, 192, 48, 67, 109, 193, 255, 255, 27, 241, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 0, 192, 7, 0, 112, 193, 0, 0, 255, 127, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 0, 192, 7, 0, 112, 193, 255, 127, 255, 255, 255, 255, 255, 191, 4, 0, 200, 193, 0, 0, 0, 192, 7, 0, 112, 193, 255, 255, 31, 248, 255, 255, 255, 191, 118, 238, 191, 192, 0, 0, 160, 192, 0, 0, 160, 64, 249, 7, 255, 127, 255, 255, 255, 191, 118, 238, 191, 192, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 118, 238, 191, 192, 0, 0, 160, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 152, 51, 197, 192, 0, 0, 160, 192, 181, 71, 33, 64, 240, 14, 255, 127, 255, 255, 255, 191, 152, 51, 197, 192, 0, 0, 160, 192, 181, 71, 33, 64, 255, 127, 0, 0, 255, 255, 255, 191, 148, 183, 212, 192, 0, 0, 160, 192, 152, 212, 168, 61, 12, 27, 255, 127, 255, 255, 255, 191, 148, 183, 212, 192, 0, 0, 160, 192, 152, 212, 168, 61, 255, 127, 0, 0, 255, 255, 255, 191, 1, 72, 238, 192, 0, 0, 160, 192, 219, 87, 17, 192, 125, 37, 255, 127, 255, 255, 255, 191, 1, 72, 238, 192, 0, 0, 160, 192, 219, 87, 17, 192, 255, 127, 0, 0, 255, 255, 255, 191, 113, 186, 8, 193, 0, 0, 160, 192, 6, 0, 144, 192, 217, 46, 255, 127, 255, 255, 255, 191, 113, 186, 8, 193, 0, 0, 160, 192, 6, 0, 144, 192, 255, 127, 0, 0, 255, 255, 255, 191, 19, 210, 30, 193, 0, 0, 160, 192, 135, 32, 210, 192, 146, 55, 255, 127, 255, 255, 255, 191, 19, 210, 30, 193, 0, 0, 160, 192, 135, 32, 210, 192, 255, 127, 0, 0, 255, 255, 255, 191, 33, 10, 57, 193, 0, 0, 160, 192, 229, 245, 6, 193, 255, 63, 255, 127, 255, 255, 255, 191, 33, 10, 57, 193, 0, 0, 160, 192, 229, 245, 6, 193, 255, 127, 0, 0, 255, 255, 255, 191, 195, 239, 86, 193, 0, 0, 160, 192, 243, 45, 33, 193, 108, 72, 255, 127, 255, 255, 255, 191, 195, 239, 86, 193, 0, 0, 160, 192, 243, 45, 33, 193, 255, 127, 0, 0, 255, 255, 255, 191, 3, 0, 120, 193, 0, 0, 160, 192, 149, 69, 55, 193, 37, 81, 255, 127, 255, 255, 255, 191, 3, 0, 120, 193, 0, 0, 160, 192, 149, 69, 55, 193, 255, 127, 0, 0, 255, 255, 255, 191, 8, 213, 141, 193, 0, 0, 160, 192, 6, 220, 72, 193, 129, 90, 255, 127, 255, 255, 255, 191, 8, 213, 141, 193, 0, 0, 160, 192, 6, 220, 72, 193, 255, 127, 0, 0, 255, 255, 255, 191, 218, 168, 160, 193, 0, 0, 160, 192, 60, 164, 85, 193, 243, 100, 255, 127, 255, 255, 255, 191, 218, 168, 160, 193, 0, 0, 160, 192, 60, 164, 85, 193, 255, 127, 0, 0, 255, 255, 255, 191, 251, 40, 180, 193, 0, 0, 160, 192, 59, 102, 93, 193, 15, 113, 255, 127, 255, 255, 255, 191, 251, 40, 180, 193, 0, 0, 160, 192, 59, 102, 93, 193, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 160, 192, 204, 8, 96, 193, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 160, 192, 204, 8, 96, 193, 5, 120, 255, 127, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 160, 192, 204, 8, 96, 193, 255, 127, 0, 0, 255, 255, 255, 191, 118, 238, 191, 192, 0, 0, 0, 192, 0, 0, 160, 64, 249, 7, 255, 127, 255, 255, 255, 191, 118, 238, 191, 192, 0, 0, 0, 192, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 191, 118, 238, 191, 192, 0, 0, 0, 192, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 152, 51, 197, 192, 0, 0, 0, 192, 181, 71, 33, 64, 240, 14, 255, 127, 255, 255, 255, 191, 152, 51, 197, 192, 0, 0, 0, 192, 181, 71, 33, 64, 255, 127, 255, 255, 255, 255, 255, 191, 148, 183, 212, 192, 0, 0, 0, 192, 152, 212, 168, 61, 12, 27, 255, 127, 255, 255, 255, 191, 148, 183, 212, 192, 0, 0, 0, 192, 152, 212, 168, 61, 255, 127, 255, 255, 255, 255, 255, 191, 1, 72, 238, 192, 0, 0, 0, 192, 219, 87, 17, 192, 125, 37, 255, 127, 255, 255, 255, 191, 1, 72, 238, 192, 0, 0, 0, 192, 219, 87, 17, 192, 255, 127, 255, 255, 255, 255, 255, 191, 113, 186, 8, 193, 0, 0, 0, 192, 6, 0, 144, 192, 217, 46, 255, 127, 255, 255, 255, 191, 113, 186, 8, 193, 0, 0, 0, 192, 6, 0, 144, 192, 255, 127, 255, 255, 255, 255, 255, 191, 19, 210, 30, 193, 0, 0, 0, 192, 135, 32, 210, 192, 146, 55, 255, 127, 255, 255, 255, 191, 19, 210, 30, 193, 0, 0, 0, 192, 135, 32, 210, 192, 255, 127, 255, 255, 255, 255, 255, 191, 33, 10, 57, 193, 0, 0, 0, 192, 229, 245, 6, 193, 255, 63, 255, 127, 255, 255, 255, 191, 33, 10, 57, 193, 0, 0, 0, 192, 229, 245, 6, 193, 255, 127, 255, 255, 255, 255, 255, 191, 195, 239, 86, 193, 0, 0, 0, 192, 243, 45, 33, 193, 108, 72, 255, 127, 255, 255, 255, 191, 195, 239, 86, 193, 0, 0, 0, 192, 243, 45, 33, 193, 255, 127, 255, 255, 255, 255, 255, 191, 3, 0, 120, 193, 0, 0, 0, 192, 149, 69, 55, 193, 37, 81, 255, 127, 255, 255, 255, 191, 3, 0, 120, 193, 0, 0, 0, 192, 149, 69, 55, 193, 255, 127, 255, 255, 255, 255, 255, 191, 8, 213, 141, 193, 0, 0, 0, 192, 6, 220, 72, 193, 129, 90, 255, 127, 255, 255, 255, 191, 8, 213, 141, 193, 0, 0, 0, 192, 6, 220, 72, 193, 255, 127, 255, 255, 255, 255, 255, 191, 218, 168, 160, 193, 0, 0, 0, 192, 60, 164, 85, 193, 243, 100, 255, 127, 255, 255, 255, 191, 218, 168, 160, 193, 0, 0, 0, 192, 60, 164, 85, 193, 255, 127, 255, 255, 255, 255, 255, 191, 251, 40, 180, 193, 0, 0, 0, 192, 59, 102, 93, 193, 15, 113, 255, 127, 255, 255, 255, 191, 251, 40, 180, 193, 0, 0, 0, 192, 59, 102, 93, 193, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 0, 192, 204, 8, 96, 193, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 0, 192, 204, 8, 96, 193, 5, 120, 255, 127, 255, 255, 255, 191, 0, 0, 200, 193, 0, 0, 0, 192, 204, 8, 96, 193, 255, 127, 255, 255, 255, 255, 255, 191, 3, 0, 112, 193, 0, 0, 160, 192, 210, 32, 69, 193, 33, 186, 136, 30, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 192, 0, 0, 160, 64, 220, 242, 108, 84, 255, 255, 255, 191, 128, 32, 18, 193, 0, 0, 0, 192, 128, 155, 229, 192, 239, 253, 235, 61, 255, 255, 255, 191)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_4fq5t")
diff --git a/assets/meshes/walls/small_curved_wall_inner.tres b/assets/meshes/walls/small_curved_wall_inner.tres
new file mode 100644
index 0000000..efd88a0
--- /dev/null
+++ b/assets/meshes/walls/small_curved_wall_inner.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://cwdxvx27qpdok"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_dqidi"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_ctsmp"]
+_surfaces = [{
+"aabb": AABB(-9.8618, -0.5, -11.1382, 21, 3, 21),
+"format": 4097,
+"index_count": 300,
+"index_data": PackedByteArray(3, 0, 4, 0, 2, 0, 3, 0, 5, 0, 4, 0, 1, 0, 2, 0, 0, 0, 1, 0, 3, 0, 2, 0, 5, 0, 6, 0, 4, 0, 5, 0, 7, 0, 6, 0, 9, 0, 10, 0, 8, 0, 9, 0, 11, 0, 10, 0, 7, 0, 8, 0, 6, 0, 7, 0, 9, 0, 8, 0, 11, 0, 12, 0, 10, 0, 11, 0, 13, 0, 12, 0, 15, 0, 16, 0, 14, 0, 15, 0, 17, 0, 16, 0, 13, 0, 14, 0, 12, 0, 13, 0, 15, 0, 14, 0, 17, 0, 18, 0, 16, 0, 17, 0, 19, 0, 18, 0, 21, 0, 22, 0, 20, 0, 21, 0, 23, 0, 22, 0, 19, 0, 20, 0, 18, 0, 19, 0, 21, 0, 20, 0, 23, 0, 24, 0, 22, 0, 23, 0, 25, 0, 24, 0, 28, 0, 31, 0, 30, 0, 28, 0, 29, 0, 31, 0, 26, 0, 29, 0, 28, 0, 26, 0, 27, 0, 29, 0, 30, 0, 33, 0, 32, 0, 30, 0, 31, 0, 33, 0, 34, 0, 37, 0, 36, 0, 34, 0, 35, 0, 37, 0, 32, 0, 35, 0, 34, 0, 32, 0, 33, 0, 35, 0, 36, 0, 39, 0, 38, 0, 36, 0, 37, 0, 39, 0, 40, 0, 43, 0, 42, 0, 40, 0, 41, 0, 43, 0, 38, 0, 41, 0, 40, 0, 38, 0, 39, 0, 41, 0, 42, 0, 45, 0, 44, 0, 42, 0, 43, 0, 45, 0, 46, 0, 49, 0, 48, 0, 46, 0, 47, 0, 49, 0, 44, 0, 47, 0, 46, 0, 44, 0, 45, 0, 47, 0, 48, 0, 51, 0, 50, 0, 48, 0, 49, 0, 51, 0, 9, 0, 36, 0, 11, 0, 9, 0, 34, 0, 36, 0, 19, 0, 46, 0, 21, 0, 19, 0, 44, 0, 46, 0, 5, 0, 32, 0, 7, 0, 5, 0, 30, 0, 32, 0, 16, 0, 41, 0, 14, 0, 16, 0, 43, 0, 41, 0, 6, 0, 31, 0, 4, 0, 6, 0, 33, 0, 31, 0, 15, 0, 42, 0, 17, 0, 15, 0, 40, 0, 42, 0, 1, 0, 28, 0, 3, 0, 1, 0, 26, 0, 28, 0, 11, 0, 38, 0, 13, 0, 11, 0, 36, 0, 38, 0, 22, 0, 47, 0, 20, 0, 22, 0, 49, 0, 47, 0, 2, 0, 27, 0, 0, 0, 2, 0, 29, 0, 27, 0, 12, 0, 37, 0, 10, 0, 12, 0, 39, 0, 37, 0, 21, 0, 48, 0, 23, 0, 21, 0, 46, 0, 48, 0, 7, 0, 34, 0, 9, 0, 7, 0, 32, 0, 34, 0, 17, 0, 44, 0, 19, 0, 17, 0, 42, 0, 44, 0, 25, 0, 51, 0, 24, 0, 25, 0, 50, 0, 51, 0, 8, 0, 33, 0, 6, 0, 8, 0, 35, 0, 33, 0, 18, 0, 43, 0, 16, 0, 18, 0, 45, 0, 43, 0, 4, 0, 29, 0, 2, 0, 4, 0, 31, 0, 29, 0, 13, 0, 40, 0, 15, 0, 13, 0, 38, 0, 40, 0, 23, 0, 50, 0, 25, 0, 23, 0, 48, 0, 50, 0, 3, 0, 30, 0, 5, 0, 3, 0, 28, 0, 30, 0, 14, 0, 39, 0, 12, 0, 14, 0, 41, 0, 39, 0, 24, 0, 49, 0, 22, 0, 24, 0, 51, 0, 49, 0, 10, 0, 35, 0, 8, 0, 10, 0, 37, 0, 35, 0, 20, 0, 45, 0, 18, 0, 20, 0, 47, 0, 45, 0, 0, 0, 26, 0, 1, 0, 0, 0, 27, 0, 26, 0),
+"lods": [0.646547, PackedByteArray(1, 0, 2, 0, 0, 0, 1, 0, 7, 0, 2, 0, 7, 0, 12, 0, 2, 0, 7, 0, 11, 0, 12, 0, 11, 0, 17, 0, 12, 0, 17, 0, 21, 0, 12, 0, 21, 0, 22, 0, 12, 0, 21, 0, 24, 0, 22, 0, 21, 0, 25, 0, 24, 0, 34, 0, 29, 0, 35, 0, 34, 0, 35, 0, 37, 0, 26, 0, 29, 0, 34, 0, 26, 0, 27, 0, 29, 0, 34, 0, 37, 0, 38, 0, 38, 0, 37, 0, 45, 0, 38, 0, 45, 0, 44, 0, 44, 0, 45, 0, 47, 0, 44, 0, 47, 0, 48, 0, 48, 0, 47, 0, 51, 0, 48, 0, 51, 0, 50, 0, 21, 0, 44, 0, 48, 0, 21, 0, 48, 0, 50, 0, 21, 0, 50, 0, 25, 0, 17, 0, 44, 0, 21, 0, 17, 0, 38, 0, 44, 0, 11, 0, 38, 0, 17, 0, 11, 0, 34, 0, 38, 0, 7, 0, 34, 0, 11, 0, 1, 0, 34, 0, 7, 0, 1, 0, 26, 0, 34, 0, 2, 0, 27, 0, 0, 0, 2, 0, 29, 0, 27, 0, 2, 0, 35, 0, 29, 0, 12, 0, 35, 0, 2, 0, 12, 0, 37, 0, 35, 0, 12, 0, 45, 0, 37, 0, 22, 0, 45, 0, 12, 0, 22, 0, 47, 0, 45, 0, 24, 0, 47, 0, 22, 0, 24, 0, 51, 0, 47, 0, 25, 0, 51, 0, 24, 0, 25, 0, 50, 0, 51, 0, 0, 0, 26, 0, 1, 0, 0, 0, 27, 0, 26, 0), 4.68984, PackedByteArray(1, 0, 12, 0, 0, 0, 1, 0, 7, 0, 12, 0, 7, 0, 24, 0, 12, 0, 7, 0, 25, 0, 24, 0, 26, 0, 37, 0, 34, 0, 26, 0, 27, 0, 37, 0, 34, 0, 37, 0, 45, 0, 34, 0, 45, 0, 51, 0, 34, 0, 51, 0, 50, 0, 1, 0, 34, 0, 7, 0, 1, 0, 26, 0, 34, 0, 7, 0, 34, 0, 50, 0, 7, 0, 50, 0, 25, 0, 12, 0, 27, 0, 0, 0, 12, 0, 37, 0, 27, 0, 12, 0, 45, 0, 37, 0, 24, 0, 45, 0, 12, 0, 24, 0, 51, 0, 45, 0, 25, 0, 51, 0, 24, 0, 25, 0, 50, 0, 51, 0, 0, 0, 26, 0, 1, 0, 0, 0, 27, 0, 26, 0)],
+"primitive": 3,
+"vertex_count": 52,
+"vertex_data": PackedByteArray(243, 201, 29, 193, 255, 255, 255, 190, 15, 54, 34, 193, 243, 201, 29, 193, 0, 0, 32, 64, 15, 54, 34, 193, 125, 10, 232, 192, 255, 255, 255, 190, 58, 121, 31, 193, 125, 10, 232, 192, 0, 0, 32, 64, 58, 121, 31, 193, 252, 238, 149, 192, 255, 255, 255, 190, 182, 78, 23, 193, 252, 238, 149, 192, 0, 0, 32, 64, 182, 78, 23, 193, 22, 82, 13, 192, 255, 255, 255, 190, 72, 218, 9, 193, 22, 82, 13, 192, 0, 0, 32, 64, 72, 218, 9, 193, 128, 131, 13, 62, 255, 255, 255, 190, 192, 173, 238, 192, 128, 131, 13, 62, 0, 0, 32, 64, 192, 173, 238, 192, 44, 15, 20, 64, 255, 255, 255, 190, 42, 43, 192, 192, 44, 15, 20, 64, 0, 0, 32, 64, 42, 43, 192, 192, 126, 248, 136, 64, 255, 255, 255, 190, 136, 248, 136, 192, 126, 248, 136, 64, 0, 0, 32, 64, 136, 248, 136, 192, 36, 43, 192, 64, 255, 255, 255, 190, 69, 15, 20, 192, 36, 43, 192, 64, 0, 0, 32, 64, 69, 15, 20, 192, 190, 173, 238, 64, 255, 255, 255, 190, 64, 133, 13, 190, 190, 173, 238, 64, 0, 0, 32, 64, 64, 133, 13, 190, 74, 218, 9, 65, 255, 255, 255, 190, 246, 81, 13, 64, 74, 218, 9, 65, 0, 0, 32, 64, 246, 81, 13, 64, 186, 78, 23, 65, 255, 255, 255, 190, 236, 238, 149, 64, 186, 78, 23, 65, 0, 0, 32, 64, 236, 238, 149, 64, 64, 121, 31, 65, 255, 255, 255, 190, 108, 10, 232, 64, 64, 121, 31, 65, 0, 0, 32, 64, 108, 10, 232, 64, 24, 54, 34, 65, 255, 255, 255, 190, 235, 201, 29, 65, 24, 54, 34, 65, 0, 0, 32, 64, 235, 201, 29, 65, 243, 201, 29, 193, 0, 0, 32, 64, 14, 54, 50, 193, 243, 201, 29, 193, 254, 255, 255, 190, 14, 54, 50, 193, 57, 221, 227, 192, 0, 0, 32, 64, 47, 86, 47, 193, 57, 221, 227, 192, 255, 255, 255, 190, 47, 86, 47, 193, 190, 166, 141, 192, 0, 0, 32, 64, 37, 195, 38, 193, 190, 166, 141, 192, 255, 255, 255, 190, 37, 195, 38, 193, 106, 168, 233, 191, 0, 0, 32, 64, 126, 162, 24, 193, 106, 168, 233, 191, 255, 255, 255, 190, 126, 162, 24, 193, 219, 96, 35, 63, 0, 0, 32, 64, 30, 50, 5, 193, 219, 96, 35, 63, 255, 255, 255, 190, 30, 50, 5, 193, 30, 5, 59, 64, 0, 0, 32, 64, 81, 142, 217, 192, 30, 5, 59, 64, 255, 255, 255, 190, 81, 142, 217, 192, 28, 153, 159, 64, 0, 0, 32, 64, 39, 153, 159, 192, 28, 153, 159, 64, 255, 255, 255, 190, 39, 153, 159, 192, 74, 142, 217, 64, 0, 0, 32, 64, 58, 5, 59, 192, 74, 142, 217, 64, 255, 255, 255, 190, 58, 5, 59, 192, 28, 50, 5, 65, 0, 0, 32, 64, 88, 97, 35, 191, 28, 50, 5, 65, 255, 255, 255, 190, 88, 97, 35, 191, 128, 162, 24, 65, 0, 0, 32, 64, 34, 168, 233, 63, 128, 162, 24, 65, 255, 255, 255, 190, 34, 168, 233, 63, 41, 195, 38, 65, 0, 0, 32, 64, 172, 166, 141, 64, 41, 195, 38, 65, 255, 255, 255, 190, 172, 166, 141, 64, 53, 86, 47, 65, 0, 0, 32, 64, 38, 221, 227, 64, 53, 86, 47, 65, 255, 255, 255, 190, 38, 221, 227, 64, 13, 54, 50, 65, 0, 0, 32, 64, 241, 201, 29, 65, 13, 54, 50, 65, 254, 255, 255, 190, 241, 201, 29, 65)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "wide_turn_small-6e237ca1d0f874ac4bdf9eea3a770eab_Cube_001"
+_surfaces = [{
+"aabb": AABB(-9.8618, -0.5, -11.1382, 21, 3, 21),
+"attribute_data": PackedByteArray(0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63),
+"format": 4119,
+"index_count": 300,
+"index_data": PackedByteArray(8, 0, 10, 0, 6, 0, 8, 0, 12, 0, 10, 0, 4, 0, 6, 0, 1, 0, 4, 0, 8, 0, 6, 0, 12, 0, 14, 0, 10, 0, 12, 0, 16, 0, 14, 0, 20, 0, 22, 0, 18, 0, 20, 0, 24, 0, 22, 0, 16, 0, 18, 0, 14, 0, 16, 0, 20, 0, 18, 0, 24, 0, 26, 0, 22, 0, 24, 0, 28, 0, 26, 0, 32, 0, 34, 0, 30, 0, 32, 0, 36, 0, 34, 0, 28, 0, 30, 0, 26, 0, 28, 0, 32, 0, 30, 0, 36, 0, 38, 0, 34, 0, 36, 0, 40, 0, 38, 0, 44, 0, 46, 0, 42, 0, 44, 0, 48, 0, 46, 0, 40, 0, 42, 0, 38, 0, 40, 0, 44, 0, 42, 0, 48, 0, 50, 0, 46, 0, 48, 0, 53, 0, 50, 0, 63, 0, 69, 0, 67, 0, 63, 0, 65, 0, 69, 0, 58, 0, 65, 0, 63, 0, 58, 0, 61, 0, 65, 0, 67, 0, 73, 0, 71, 0, 67, 0, 69, 0, 73, 0, 75, 0, 81, 0, 79, 0, 75, 0, 77, 0, 81, 0, 71, 0, 77, 0, 75, 0, 71, 0, 73, 0, 77, 0, 79, 0, 85, 0, 83, 0, 79, 0, 81, 0, 85, 0, 87, 0, 93, 0, 91, 0, 87, 0, 89, 0, 93, 0, 83, 0, 89, 0, 87, 0, 83, 0, 85, 0, 89, 0, 91, 0, 97, 0, 95, 0, 91, 0, 93, 0, 97, 0, 99, 0, 105, 0, 103, 0, 99, 0, 101, 0, 105, 0, 95, 0, 101, 0, 99, 0, 95, 0, 97, 0, 101, 0, 103, 0, 111, 0, 108, 0, 103, 0, 105, 0, 111, 0, 21, 0, 78, 0, 25, 0, 21, 0, 74, 0, 78, 0, 41, 0, 98, 0, 45, 0, 41, 0, 94, 0, 98, 0, 13, 0, 70, 0, 17, 0, 13, 0, 66, 0, 70, 0, 35, 0, 88, 0, 31, 0, 35, 0, 92, 0, 88, 0, 15, 0, 68, 0, 11, 0, 15, 0, 72, 0, 68, 0, 33, 0, 90, 0, 37, 0, 33, 0, 86, 0, 90, 0, 5, 0, 62, 0, 9, 0, 5, 0, 57, 0, 62, 0, 25, 0, 82, 0, 29, 0, 25, 0, 78, 0, 82, 0, 47, 0, 100, 0, 43, 0, 47, 0, 104, 0, 100, 0, 7, 0, 60, 0, 2, 0, 7, 0, 64, 0, 60, 0, 27, 0, 80, 0, 23, 0, 27, 0, 84, 0, 80, 0, 45, 0, 102, 0, 49, 0, 45, 0, 98, 0, 102, 0, 17, 0, 74, 0, 21, 0, 17, 0, 70, 0, 74, 0, 37, 0, 94, 0, 41, 0, 37, 0, 90, 0, 94, 0, 54, 0, 110, 0, 52, 0, 54, 0, 106, 0, 110, 0, 19, 0, 72, 0, 15, 0, 19, 0, 76, 0, 72, 0, 39, 0, 92, 0, 35, 0, 39, 0, 96, 0, 92, 0, 11, 0, 64, 0, 7, 0, 11, 0, 68, 0, 64, 0, 29, 0, 86, 0, 33, 0, 29, 0, 82, 0, 86, 0, 49, 0, 107, 0, 55, 0, 49, 0, 102, 0, 107, 0, 9, 0, 66, 0, 13, 0, 9, 0, 62, 0, 66, 0, 31, 0, 84, 0, 27, 0, 31, 0, 88, 0, 84, 0, 51, 0, 104, 0, 47, 0, 51, 0, 109, 0, 104, 0, 23, 0, 76, 0, 19, 0, 23, 0, 80, 0, 76, 0, 43, 0, 96, 0, 39, 0, 43, 0, 100, 0, 96, 0, 0, 0, 56, 0, 3, 0, 0, 0, 59, 0, 56, 0),
+"lods": [0.646547, PackedByteArray(4, 0, 6, 0, 1, 0, 4, 0, 16, 0, 6, 0, 16, 0, 26, 0, 6, 0, 16, 0, 24, 0, 26, 0, 24, 0, 36, 0, 26, 0, 36, 0, 44, 0, 26, 0, 44, 0, 46, 0, 26, 0, 44, 0, 50, 0, 46, 0, 44, 0, 53, 0, 50, 0, 75, 0, 65, 0, 77, 0, 75, 0, 77, 0, 81, 0, 58, 0, 65, 0, 75, 0, 58, 0, 61, 0, 65, 0, 75, 0, 81, 0, 83, 0, 83, 0, 81, 0, 97, 0, 83, 0, 97, 0, 95, 0, 95, 0, 97, 0, 101, 0, 95, 0, 101, 0, 103, 0, 103, 0, 101, 0, 111, 0, 103, 0, 111, 0, 108, 0, 45, 0, 94, 0, 102, 0, 45, 0, 102, 0, 107, 0, 45, 0, 107, 0, 55, 0, 37, 0, 94, 0, 45, 0, 37, 0, 82, 0, 94, 0, 25, 0, 82, 0, 37, 0, 25, 0, 74, 0, 82, 0, 17, 0, 74, 0, 25, 0, 5, 0, 74, 0, 17, 0, 5, 0, 57, 0, 74, 0, 7, 0, 60, 0, 2, 0, 7, 0, 64, 0, 60, 0, 7, 0, 76, 0, 64, 0, 27, 0, 76, 0, 7, 0, 27, 0, 80, 0, 76, 0, 27, 0, 96, 0, 80, 0, 47, 0, 96, 0, 27, 0, 47, 0, 100, 0, 96, 0, 51, 0, 100, 0, 47, 0, 51, 0, 109, 0, 100, 0, 54, 0, 110, 0, 52, 0, 54, 0, 106, 0, 110, 0, 0, 0, 56, 0, 3, 0, 0, 0, 59, 0, 56, 0), 4.68984, PackedByteArray(4, 0, 26, 0, 1, 0, 4, 0, 16, 0, 26, 0, 16, 0, 50, 0, 26, 0, 16, 0, 53, 0, 50, 0, 58, 0, 81, 0, 75, 0, 58, 0, 61, 0, 81, 0, 75, 0, 81, 0, 97, 0, 75, 0, 97, 0, 111, 0, 75, 0, 111, 0, 108, 0, 5, 0, 74, 0, 17, 0, 5, 0, 57, 0, 74, 0, 17, 0, 74, 0, 107, 0, 17, 0, 107, 0, 55, 0, 27, 0, 60, 0, 2, 0, 27, 0, 80, 0, 60, 0, 27, 0, 96, 0, 80, 0, 51, 0, 96, 0, 27, 0, 51, 0, 109, 0, 96, 0, 54, 0, 110, 0, 52, 0, 54, 0, 106, 0, 110, 0, 0, 0, 56, 0, 3, 0, 0, 0, 59, 0, 56, 0)],
+"material": ExtResource("1_dqidi"),
+"primitive": 3,
+"vertex_count": 112,
+"vertex_data": PackedByteArray(243, 201, 29, 193, 255, 255, 255, 190, 15, 54, 34, 193, 0, 0, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 255, 255, 255, 190, 15, 54, 34, 193, 32, 120, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 255, 255, 255, 190, 15, 54, 34, 193, 255, 127, 0, 0, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 15, 54, 34, 193, 0, 0, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 15, 54, 34, 193, 32, 120, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 15, 54, 34, 193, 255, 127, 255, 255, 255, 255, 255, 191, 125, 10, 232, 192, 255, 255, 255, 190, 58, 121, 31, 193, 27, 113, 255, 127, 255, 255, 255, 191, 125, 10, 232, 192, 255, 255, 255, 190, 58, 121, 31, 193, 255, 127, 0, 0, 255, 255, 255, 191, 125, 10, 232, 192, 0, 0, 32, 64, 58, 121, 31, 193, 27, 113, 255, 127, 255, 255, 255, 191, 125, 10, 232, 192, 0, 0, 32, 64, 58, 121, 31, 193, 255, 127, 255, 255, 255, 255, 255, 191, 252, 238, 149, 192, 255, 255, 255, 190, 182, 78, 23, 193, 243, 100, 255, 127, 255, 255, 255, 191, 252, 238, 149, 192, 255, 255, 255, 190, 182, 78, 23, 193, 255, 127, 0, 0, 255, 255, 255, 191, 252, 238, 149, 192, 0, 0, 32, 64, 182, 78, 23, 193, 243, 100, 255, 127, 255, 255, 255, 191, 252, 238, 149, 192, 0, 0, 32, 64, 182, 78, 23, 193, 255, 127, 255, 255, 255, 255, 255, 191, 22, 82, 13, 192, 255, 255, 255, 190, 72, 218, 9, 193, 129, 90, 255, 127, 255, 255, 255, 191, 22, 82, 13, 192, 255, 255, 255, 190, 72, 218, 9, 193, 255, 127, 0, 0, 255, 255, 255, 191, 22, 82, 13, 192, 0, 0, 32, 64, 72, 218, 9, 193, 129, 90, 255, 127, 255, 255, 255, 191, 22, 82, 13, 192, 0, 0, 32, 64, 72, 218, 9, 193, 255, 127, 255, 255, 255, 255, 255, 191, 128, 131, 13, 62, 255, 255, 255, 190, 192, 173, 238, 192, 37, 81, 255, 127, 255, 255, 255, 191, 128, 131, 13, 62, 255, 255, 255, 190, 192, 173, 238, 192, 255, 127, 0, 0, 255, 255, 255, 191, 128, 131, 13, 62, 0, 0, 32, 64, 192, 173, 238, 192, 37, 81, 255, 127, 255, 255, 255, 191, 128, 131, 13, 62, 0, 0, 32, 64, 192, 173, 238, 192, 255, 127, 255, 255, 255, 255, 255, 191, 44, 15, 20, 64, 255, 255, 255, 190, 42, 43, 192, 192, 108, 72, 255, 127, 255, 255, 255, 191, 44, 15, 20, 64, 255, 255, 255, 190, 42, 43, 192, 192, 255, 127, 0, 0, 255, 255, 255, 191, 44, 15, 20, 64, 0, 0, 32, 64, 42, 43, 192, 192, 108, 72, 255, 127, 255, 255, 255, 191, 44, 15, 20, 64, 0, 0, 32, 64, 42, 43, 192, 192, 255, 127, 255, 255, 255, 255, 255, 191, 126, 248, 136, 64, 255, 255, 255, 190, 136, 248, 136, 192, 255, 63, 255, 127, 255, 255, 255, 191, 126, 248, 136, 64, 255, 255, 255, 190, 136, 248, 136, 192, 255, 127, 0, 0, 255, 255, 255, 191, 126, 248, 136, 64, 0, 0, 32, 64, 136, 248, 136, 192, 255, 63, 255, 127, 255, 255, 255, 191, 126, 248, 136, 64, 0, 0, 32, 64, 136, 248, 136, 192, 255, 127, 255, 255, 255, 255, 255, 191, 36, 43, 192, 64, 255, 255, 255, 190, 69, 15, 20, 192, 146, 55, 255, 127, 255, 255, 255, 191, 36, 43, 192, 64, 255, 255, 255, 190, 69, 15, 20, 192, 255, 127, 0, 0, 255, 255, 255, 191, 36, 43, 192, 64, 0, 0, 32, 64, 69, 15, 20, 192, 146, 55, 255, 127, 255, 255, 255, 191, 36, 43, 192, 64, 0, 0, 32, 64, 69, 15, 20, 192, 255, 127, 255, 255, 255, 255, 255, 191, 190, 173, 238, 64, 255, 255, 255, 190, 64, 133, 13, 190, 217, 46, 255, 127, 255, 255, 255, 191, 190, 173, 238, 64, 255, 255, 255, 190, 64, 133, 13, 190, 255, 127, 0, 0, 255, 255, 255, 191, 190, 173, 238, 64, 0, 0, 32, 64, 64, 133, 13, 190, 217, 46, 255, 127, 255, 255, 255, 191, 190, 173, 238, 64, 0, 0, 32, 64, 64, 133, 13, 190, 255, 127, 255, 255, 255, 255, 255, 191, 74, 218, 9, 65, 255, 255, 255, 190, 246, 81, 13, 64, 125, 37, 255, 127, 255, 255, 255, 191, 74, 218, 9, 65, 255, 255, 255, 190, 246, 81, 13, 64, 255, 127, 0, 0, 255, 255, 255, 191, 74, 218, 9, 65, 0, 0, 32, 64, 246, 81, 13, 64, 125, 37, 255, 127, 255, 255, 255, 191, 74, 218, 9, 65, 0, 0, 32, 64, 246, 81, 13, 64, 255, 127, 255, 255, 255, 255, 255, 191, 186, 78, 23, 65, 255, 255, 255, 190, 236, 238, 149, 64, 12, 27, 255, 127, 255, 255, 255, 191, 186, 78, 23, 65, 255, 255, 255, 190, 236, 238, 149, 64, 255, 127, 0, 0, 255, 255, 255, 191, 186, 78, 23, 65, 0, 0, 32, 64, 236, 238, 149, 64, 12, 27, 255, 127, 255, 255, 255, 191, 186, 78, 23, 65, 0, 0, 32, 64, 236, 238, 149, 64, 255, 127, 255, 255, 255, 255, 255, 191, 64, 121, 31, 65, 255, 255, 255, 190, 108, 10, 232, 64, 227, 14, 255, 127, 255, 255, 255, 191, 64, 121, 31, 65, 255, 255, 255, 190, 108, 10, 232, 64, 255, 127, 0, 0, 255, 255, 255, 191, 64, 121, 31, 65, 0, 0, 32, 64, 108, 10, 232, 64, 227, 14, 255, 127, 255, 255, 255, 191, 64, 121, 31, 65, 0, 0, 32, 64, 108, 10, 232, 64, 255, 127, 255, 255, 255, 255, 255, 191, 24, 54, 34, 65, 255, 255, 255, 190, 235, 201, 29, 65, 223, 7, 255, 127, 255, 255, 255, 191, 24, 54, 34, 65, 255, 255, 255, 190, 235, 201, 29, 65, 255, 127, 0, 0, 255, 255, 255, 191, 24, 54, 34, 65, 255, 255, 255, 190, 235, 201, 29, 65, 255, 127, 255, 127, 255, 255, 255, 191, 24, 54, 34, 65, 0, 0, 32, 64, 235, 201, 29, 65, 223, 7, 255, 127, 255, 255, 255, 191, 24, 54, 34, 65, 0, 0, 32, 64, 235, 201, 29, 65, 255, 127, 255, 127, 255, 255, 255, 191, 24, 54, 34, 65, 0, 0, 32, 64, 235, 201, 29, 65, 255, 127, 255, 255, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 14, 54, 50, 193, 0, 0, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 14, 54, 50, 193, 255, 127, 255, 255, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 14, 54, 50, 193, 255, 255, 31, 248, 255, 255, 255, 191, 243, 201, 29, 193, 254, 255, 255, 190, 14, 54, 50, 193, 0, 0, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 254, 255, 255, 190, 14, 54, 50, 193, 255, 127, 0, 0, 255, 255, 255, 191, 243, 201, 29, 193, 254, 255, 255, 190, 14, 54, 50, 193, 255, 255, 31, 248, 255, 255, 255, 191, 57, 221, 227, 192, 0, 0, 32, 64, 47, 86, 47, 193, 255, 127, 255, 255, 255, 255, 255, 191, 57, 221, 227, 192, 0, 0, 32, 64, 47, 86, 47, 193, 255, 255, 27, 241, 255, 255, 255, 191, 57, 221, 227, 192, 255, 255, 255, 190, 47, 86, 47, 193, 255, 127, 0, 0, 255, 255, 255, 191, 57, 221, 227, 192, 255, 255, 255, 190, 47, 86, 47, 193, 255, 255, 27, 241, 255, 255, 255, 191, 190, 166, 141, 192, 0, 0, 32, 64, 37, 195, 38, 193, 255, 127, 255, 255, 255, 255, 255, 191, 190, 166, 141, 192, 0, 0, 32, 64, 37, 195, 38, 193, 255, 255, 242, 228, 255, 255, 255, 191, 190, 166, 141, 192, 255, 255, 255, 190, 37, 195, 38, 193, 255, 127, 0, 0, 255, 255, 255, 191, 190, 166, 141, 192, 255, 255, 255, 190, 37, 195, 38, 193, 255, 255, 242, 228, 255, 255, 255, 191, 106, 168, 233, 191, 0, 0, 32, 64, 126, 162, 24, 193, 255, 127, 255, 255, 255, 255, 255, 191, 106, 168, 233, 191, 0, 0, 32, 64, 126, 162, 24, 193, 255, 255, 129, 218, 255, 255, 255, 191, 106, 168, 233, 191, 255, 255, 255, 190, 126, 162, 24, 193, 255, 127, 0, 0, 255, 255, 255, 191, 106, 168, 233, 191, 255, 255, 255, 190, 126, 162, 24, 193, 255, 255, 129, 218, 255, 255, 255, 191, 219, 96, 35, 63, 0, 0, 32, 64, 30, 50, 5, 193, 255, 127, 255, 255, 255, 255, 255, 191, 219, 96, 35, 63, 0, 0, 32, 64, 30, 50, 5, 193, 255, 255, 37, 209, 255, 255, 255, 191, 219, 96, 35, 63, 255, 255, 255, 190, 30, 50, 5, 193, 255, 127, 0, 0, 255, 255, 255, 191, 219, 96, 35, 63, 255, 255, 255, 190, 30, 50, 5, 193, 255, 255, 37, 209, 255, 255, 255, 191, 30, 5, 59, 64, 0, 0, 32, 64, 81, 142, 217, 192, 255, 127, 255, 255, 255, 255, 255, 191, 30, 5, 59, 64, 0, 0, 32, 64, 81, 142, 217, 192, 255, 255, 108, 200, 255, 255, 255, 191, 30, 5, 59, 64, 255, 255, 255, 190, 81, 142, 217, 192, 255, 127, 0, 0, 255, 255, 255, 191, 30, 5, 59, 64, 255, 255, 255, 190, 81, 142, 217, 192, 255, 255, 108, 200, 255, 255, 255, 191, 28, 153, 159, 64, 0, 0, 32, 64, 39, 153, 159, 192, 255, 127, 255, 255, 255, 255, 255, 191, 28, 153, 159, 64, 0, 0, 32, 64, 39, 153, 159, 192, 255, 255, 255, 191, 255, 255, 255, 191, 28, 153, 159, 64, 255, 255, 255, 190, 39, 153, 159, 192, 255, 127, 0, 0, 255, 255, 255, 191, 28, 153, 159, 64, 255, 255, 255, 190, 39, 153, 159, 192, 255, 255, 255, 191, 255, 255, 255, 191, 74, 142, 217, 64, 0, 0, 32, 64, 58, 5, 59, 192, 255, 127, 255, 255, 255, 255, 255, 191, 74, 142, 217, 64, 0, 0, 32, 64, 58, 5, 59, 192, 255, 255, 146, 183, 255, 255, 255, 191, 74, 142, 217, 64, 255, 255, 255, 190, 58, 5, 59, 192, 255, 127, 0, 0, 255, 255, 255, 191, 74, 142, 217, 64, 255, 255, 255, 190, 58, 5, 59, 192, 255, 255, 146, 183, 255, 255, 255, 191, 28, 50, 5, 65, 0, 0, 32, 64, 88, 97, 35, 191, 255, 127, 255, 255, 255, 255, 255, 191, 28, 50, 5, 65, 0, 0, 32, 64, 88, 97, 35, 191, 255, 255, 217, 174, 255, 255, 255, 191, 28, 50, 5, 65, 255, 255, 255, 190, 88, 97, 35, 191, 255, 127, 0, 0, 255, 255, 255, 191, 28, 50, 5, 65, 255, 255, 255, 190, 88, 97, 35, 191, 255, 255, 217, 174, 255, 255, 255, 191, 128, 162, 24, 65, 0, 0, 32, 64, 34, 168, 233, 63, 255, 127, 255, 255, 255, 255, 255, 191, 128, 162, 24, 65, 0, 0, 32, 64, 34, 168, 233, 63, 255, 255, 125, 165, 255, 255, 255, 191, 128, 162, 24, 65, 255, 255, 255, 190, 34, 168, 233, 63, 255, 127, 0, 0, 255, 255, 255, 191, 128, 162, 24, 65, 255, 255, 255, 190, 34, 168, 233, 63, 255, 255, 125, 165, 255, 255, 255, 191, 41, 195, 38, 65, 0, 0, 32, 64, 172, 166, 141, 64, 255, 127, 255, 255, 255, 255, 255, 191, 41, 195, 38, 65, 0, 0, 32, 64, 172, 166, 141, 64, 255, 255, 11, 155, 255, 255, 255, 191, 41, 195, 38, 65, 255, 255, 255, 190, 172, 166, 141, 64, 255, 127, 0, 0, 255, 255, 255, 191, 41, 195, 38, 65, 255, 255, 255, 190, 172, 166, 141, 64, 255, 255, 11, 155, 255, 255, 255, 191, 53, 86, 47, 65, 0, 0, 32, 64, 38, 221, 227, 64, 255, 127, 255, 255, 255, 255, 255, 191, 53, 86, 47, 65, 0, 0, 32, 64, 38, 221, 227, 64, 255, 255, 227, 142, 255, 255, 255, 191, 53, 86, 47, 65, 255, 255, 255, 190, 38, 221, 227, 64, 255, 127, 0, 0, 255, 255, 255, 191, 53, 86, 47, 65, 255, 255, 255, 190, 38, 221, 227, 64, 255, 255, 227, 142, 255, 255, 255, 191, 13, 54, 50, 65, 0, 0, 32, 64, 241, 201, 29, 65, 255, 127, 255, 127, 255, 255, 255, 191, 13, 54, 50, 65, 0, 0, 32, 64, 241, 201, 29, 65, 255, 127, 255, 255, 255, 255, 255, 191, 13, 54, 50, 65, 0, 0, 32, 64, 241, 201, 29, 65, 255, 255, 222, 135, 255, 255, 255, 191, 13, 54, 50, 65, 254, 255, 255, 190, 241, 201, 29, 65, 255, 127, 0, 0, 255, 255, 255, 191, 13, 54, 50, 65, 254, 255, 255, 190, 241, 201, 29, 65, 255, 127, 255, 127, 255, 255, 255, 191, 13, 54, 50, 65, 254, 255, 255, 190, 241, 201, 29, 65, 255, 255, 222, 135, 255, 255, 255, 191)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_ctsmp")
diff --git a/assets/meshes/walls/tall_corner_diagonal_wall.tres b/assets/meshes/walls/tall_corner_diagonal_wall.tres
new file mode 100644
index 0000000..584f6d2
--- /dev/null
+++ b/assets/meshes/walls/tall_corner_diagonal_wall.tres
@@ -0,0 +1,31 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://c4d2oixq5f5uq"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_550vy"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_hu103"]
+_surfaces = [{
+"aabb": AABB(-5.70711, -0.5, -5, 10.7071, 5.5, 10.7071),
+"format": 4097,
+"index_count": 36,
+"index_data": PackedByteArray(1, 0, 2, 0, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, 6, 0, 2, 0, 0, 0, 5, 0, 6, 0, 4, 0, 6, 0, 5, 0, 4, 0, 7, 0, 6, 0, 1, 0, 5, 0, 0, 0, 1, 0, 4, 0, 5, 0, 2, 0, 7, 0, 3, 0, 2, 0, 6, 0, 7, 0, 3, 0, 4, 0, 1, 0, 3, 0, 7, 0, 4, 0),
+"primitive": 3,
+"vertex_count": 8,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 158, 160, 182, 192, 0, 0, 32, 64, 98, 95, 137, 192, 158, 160, 182, 192, 0, 0, 0, 191, 98, 95, 137, 192, 98, 95, 137, 64, 0, 0, 0, 191, 158, 160, 182, 64, 98, 95, 137, 64, 0, 0, 160, 64, 158, 160, 182, 64)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "tall_corner_diagonal_wall_Cube_001"
+_surfaces = [{
+"aabb": AABB(-5.70711, -0.5, -5, 10.7071, 5.5, 10.7071),
+"attribute_data": PackedByteArray(0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62),
+"format": 4119,
+"index_count": 36,
+"index_data": PackedByteArray(5, 0, 7, 0, 10, 0, 5, 0, 2, 0, 7, 0, 1, 0, 19, 0, 6, 0, 1, 0, 17, 0, 19, 0, 13, 0, 18, 0, 16, 0, 13, 0, 21, 0, 18, 0, 3, 0, 15, 0, 0, 0, 3, 0, 12, 0, 15, 0, 8, 0, 23, 0, 11, 0, 8, 0, 20, 0, 23, 0, 9, 0, 14, 0, 4, 0, 9, 0, 22, 0, 14, 0),
+"material": ExtResource("1_550vy"),
+"primitive": 3,
+"vertex_count": 24,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 255, 191, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 191, 166, 183, 88, 200, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 255, 191, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 101, 102, 49, 243, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 255, 255, 255, 191, 69, 175, 185, 208, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 255, 191, 235, 138, 18, 245, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 191, 255, 127, 255, 255, 255, 63, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 101, 102, 49, 243, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 255, 255, 255, 191, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 255, 191, 255, 127, 255, 255, 255, 63, 158, 160, 182, 192, 0, 0, 32, 64, 98, 95, 137, 192, 0, 0, 255, 191, 255, 255, 255, 191, 158, 160, 182, 192, 0, 0, 32, 64, 98, 95, 137, 192, 255, 63, 255, 127, 69, 175, 69, 47, 158, 160, 182, 192, 0, 0, 32, 64, 98, 95, 137, 192, 101, 102, 49, 243, 255, 255, 255, 191, 158, 160, 182, 192, 0, 0, 0, 191, 98, 95, 137, 192, 0, 0, 255, 191, 255, 255, 255, 191, 158, 160, 182, 192, 0, 0, 0, 191, 98, 95, 137, 192, 255, 63, 255, 127, 166, 183, 166, 55, 158, 160, 182, 192, 0, 0, 0, 191, 98, 95, 137, 192, 255, 127, 0, 0, 255, 255, 255, 191, 98, 95, 137, 64, 0, 0, 0, 191, 158, 160, 182, 64, 255, 63, 255, 127, 235, 138, 236, 10, 98, 95, 137, 64, 0, 0, 0, 191, 158, 160, 182, 64, 255, 127, 0, 0, 255, 255, 255, 191, 98, 95, 137, 64, 0, 0, 0, 191, 158, 160, 182, 64, 255, 191, 255, 127, 255, 255, 255, 63, 98, 95, 137, 64, 0, 0, 160, 64, 158, 160, 182, 64, 255, 63, 255, 127, 255, 127, 0, 0, 98, 95, 137, 64, 0, 0, 160, 64, 158, 160, 182, 64, 101, 102, 49, 243, 255, 255, 255, 191, 98, 95, 137, 64, 0, 0, 160, 64, 158, 160, 182, 64, 255, 191, 255, 127, 255, 255, 255, 63)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_hu103")
diff --git a/assets/meshes/walls/tall_diagonal_wall.tres b/assets/meshes/walls/tall_diagonal_wall.tres
new file mode 100644
index 0000000..0ec2a89
--- /dev/null
+++ b/assets/meshes/walls/tall_diagonal_wall.tres
@@ -0,0 +1,31 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://pe8b3dso12w3"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_rcumi"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_lku0s"]
+_surfaces = [{
+"aabb": AABB(-5, -0.5, 5, 10, 5.5, 1),
+"format": 4097,
+"index_count": 36,
+"index_data": PackedByteArray(1, 0, 7, 0, 0, 0, 1, 0, 6, 0, 7, 0, 4, 0, 2, 0, 5, 0, 4, 0, 3, 0, 2, 0, 5, 0, 6, 0, 1, 0, 5, 0, 2, 0, 6, 0, 4, 0, 1, 0, 0, 0, 4, 0, 5, 0, 1, 0, 3, 0, 6, 0, 2, 0, 3, 0, 7, 0, 6, 0, 0, 0, 3, 0, 4, 0, 0, 0, 7, 0, 3, 0),
+"primitive": 3,
+"vertex_count": 8,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 64, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 64)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "tall_diagonal_wall_Cube_001"
+_surfaces = [{
+"aabb": AABB(-5, -0.5, 5, 10, 5.5, 1),
+"attribute_data": PackedByteArray(0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 32, 63, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 0, 0, 0, 0, 192, 62, 0, 0, 0, 0),
+"format": 4119,
+"index_count": 36,
+"index_data": PackedByteArray(3, 0, 21, 0, 0, 0, 3, 0, 18, 0, 21, 0, 14, 0, 8, 0, 17, 0, 14, 0, 11, 0, 8, 0, 15, 0, 19, 0, 4, 0, 15, 0, 6, 0, 19, 0, 13, 0, 5, 0, 2, 0, 13, 0, 16, 0, 5, 0, 10, 0, 20, 0, 7, 0, 10, 0, 23, 0, 20, 0, 1, 0, 9, 0, 12, 0, 1, 0, 22, 0, 9, 0),
+"material": ExtResource("1_rcumi"),
+"primitive": 3,
+"vertex_count": 24,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 64, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 64, 102, 102, 102, 230, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 64, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 192, 64, 102, 102, 102, 230, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 192, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 192, 64, 255, 255, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 192, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 192, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 192, 64, 255, 255, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 255, 127, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 102, 102, 102, 230, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 255, 255, 255, 255, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 255, 255, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 64, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 64, 102, 102, 102, 230, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 64, 255, 127, 255, 127, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 64, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 64, 255, 127, 255, 127, 255, 127, 255, 255)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_lku0s")
diff --git a/assets/meshes/walls/tall_wall.tres b/assets/meshes/walls/tall_wall.tres
new file mode 100644
index 0000000..86073bf
--- /dev/null
+++ b/assets/meshes/walls/tall_wall.tres
@@ -0,0 +1,31 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://dfs62b7cohday"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_6ybn6"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_nhmc7"]
+_surfaces = [{
+"aabb": AABB(5, -0.5, -5, 1.00001, 5.50001, 10),
+"format": 4097,
+"index_count": 36,
+"index_data": PackedByteArray(7, 0, 2, 0, 5, 0, 7, 0, 0, 0, 2, 0, 5, 0, 3, 0, 4, 0, 5, 0, 2, 0, 3, 0, 6, 0, 5, 0, 4, 0, 6, 0, 7, 0, 5, 0, 4, 0, 1, 0, 6, 0, 4, 0, 3, 0, 1, 0, 1, 0, 2, 0, 0, 0, 1, 0, 3, 0, 2, 0, 6, 0, 0, 0, 7, 0, 6, 0, 1, 0, 0, 0),
+"primitive": 3,
+"vertex_count": 8,
+"vertex_data": PackedByteArray(0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 192)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "tall_wall_Cube_001"
+_surfaces = [{
+"aabb": AABB(5, -0.5, -5, 1.00001, 5.50001, 10),
+"attribute_data": PackedByteArray(0, 0, 12, 63, 0, 0, 0, 63, 0, 0, 12, 63, 0, 0, 0, 63, 0, 0, 12, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 12, 63, 0, 0, 128, 62, 0, 0, 12, 63, 0, 0, 128, 62, 0, 0, 12, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 12, 63, 0, 0, 128, 62, 0, 0, 12, 63, 0, 0, 128, 62, 0, 0, 12, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 12, 63, 0, 0, 0, 63, 0, 0, 12, 63, 0, 0, 0, 63, 0, 0, 12, 63, 0, 0, 0, 63),
+"format": 4119,
+"index_count": 36,
+"index_data": PackedByteArray(23, 0, 7, 0, 17, 0, 23, 0, 1, 0, 7, 0, 16, 0, 10, 0, 14, 0, 16, 0, 6, 0, 10, 0, 18, 0, 15, 0, 12, 0, 18, 0, 21, 0, 15, 0, 13, 0, 3, 0, 19, 0, 13, 0, 9, 0, 3, 0, 5, 0, 8, 0, 2, 0, 5, 0, 11, 0, 8, 0, 20, 0, 0, 0, 22, 0, 20, 0, 4, 0, 0, 0),
+"material": ExtResource("1_6ybn6"),
+"primitive": 3,
+"vertex_count": 24,
+"vertex_data": PackedByteArray(0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 160, 192, 255, 255, 255, 255, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 160, 192, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 160, 64, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 255, 127, 255, 127, 255, 255, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 192, 0, 0, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 192, 255, 255, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 160, 192, 255, 127, 255, 255, 255, 255, 255, 191)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_nhmc7")
diff --git a/assets/meshes/walls/turn_wall.tres b/assets/meshes/walls/turn_wall.tres
new file mode 100644
index 0000000..2d5ab6c
--- /dev/null
+++ b/assets/meshes/walls/turn_wall.tres
@@ -0,0 +1,35 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://d27ytirksdd4d"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_x5dc7"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_i708r"]
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -6, 11, 3, 11),
+"format": 4097,
+"index_count": 348,
+"index_data": PackedByteArray(10, 0, 39, 0, 9, 0, 10, 0, 40, 0, 39, 0, 16, 0, 17, 0, 5, 0, 16, 0, 19, 0, 17, 0, 0, 0, 31, 0, 1, 0, 0, 0, 30, 0, 31, 0, 26, 0, 55, 0, 25, 0, 26, 0, 56, 0, 55, 0, 6, 0, 34, 0, 4, 0, 6, 0, 36, 0, 34, 0, 15, 0, 44, 0, 14, 0, 15, 0, 45, 0, 44, 0, 18, 0, 59, 0, 29, 0, 18, 0, 48, 0, 59, 0, 21, 0, 50, 0, 20, 0, 21, 0, 51, 0, 50, 0, 11, 0, 40, 0, 10, 0, 11, 0, 41, 0, 40, 0, 25, 0, 54, 0, 24, 0, 25, 0, 55, 0, 54, 0, 7, 0, 36, 0, 6, 0, 7, 0, 37, 0, 36, 0, 16, 0, 45, 0, 15, 0, 16, 0, 46, 0, 45, 0, 29, 0, 58, 0, 28, 0, 29, 0, 59, 0, 58, 0, 20, 0, 49, 0, 19, 0, 20, 0, 50, 0, 49, 0, 12, 0, 41, 0, 11, 0, 12, 0, 42, 0, 41, 0, 35, 0, 33, 0, 47, 0, 35, 0, 32, 0, 33, 0, 30, 0, 48, 0, 31, 0, 30, 0, 34, 0, 48, 0, 47, 0, 46, 0, 35, 0, 47, 0, 49, 0, 46, 0, 49, 0, 45, 0, 46, 0, 49, 0, 50, 0, 45, 0, 50, 0, 44, 0, 45, 0, 50, 0, 51, 0, 44, 0, 51, 0, 43, 0, 44, 0, 51, 0, 52, 0, 43, 0, 52, 0, 42, 0, 43, 0, 52, 0, 53, 0, 42, 0, 53, 0, 41, 0, 42, 0, 53, 0, 54, 0, 41, 0, 54, 0, 40, 0, 41, 0, 54, 0, 55, 0, 40, 0, 55, 0, 39, 0, 40, 0, 55, 0, 56, 0, 39, 0, 56, 0, 38, 0, 39, 0, 56, 0, 57, 0, 38, 0, 57, 0, 37, 0, 38, 0, 57, 0, 58, 0, 37, 0, 58, 0, 36, 0, 37, 0, 58, 0, 59, 0, 36, 0, 59, 0, 34, 0, 36, 0, 59, 0, 48, 0, 34, 0, 22, 0, 51, 0, 21, 0, 22, 0, 52, 0, 51, 0, 4, 0, 30, 0, 0, 0, 4, 0, 34, 0, 30, 0, 3, 0, 32, 0, 2, 0, 3, 0, 33, 0, 32, 0, 14, 0, 43, 0, 13, 0, 14, 0, 44, 0, 43, 0, 2, 0, 35, 0, 5, 0, 2, 0, 32, 0, 35, 0, 27, 0, 56, 0, 26, 0, 27, 0, 57, 0, 56, 0, 1, 0, 48, 0, 18, 0, 1, 0, 31, 0, 48, 0, 9, 0, 38, 0, 8, 0, 9, 0, 39, 0, 38, 0, 23, 0, 52, 0, 22, 0, 23, 0, 53, 0, 52, 0, 17, 0, 33, 0, 3, 0, 17, 0, 47, 0, 33, 0, 19, 0, 47, 0, 17, 0, 19, 0, 49, 0, 47, 0, 13, 0, 42, 0, 12, 0, 13, 0, 43, 0, 42, 0, 28, 0, 57, 0, 27, 0, 28, 0, 58, 0, 57, 0, 5, 0, 46, 0, 16, 0, 5, 0, 35, 0, 46, 0, 8, 0, 37, 0, 7, 0, 8, 0, 38, 0, 37, 0, 24, 0, 53, 0, 23, 0, 24, 0, 54, 0, 53, 0, 6, 0, 28, 0, 7, 0, 6, 0, 29, 0, 28, 0, 7, 0, 27, 0, 8, 0, 7, 0, 28, 0, 27, 0, 8, 0, 26, 0, 9, 0, 8, 0, 27, 0, 26, 0, 9, 0, 25, 0, 10, 0, 9, 0, 26, 0, 25, 0, 10, 0, 24, 0, 11, 0, 10, 0, 25, 0, 24, 0, 11, 0, 23, 0, 12, 0, 11, 0, 24, 0, 23, 0, 12, 0, 22, 0, 13, 0, 12, 0, 23, 0, 22, 0, 13, 0, 21, 0, 14, 0, 13, 0, 22, 0, 21, 0, 14, 0, 20, 0, 15, 0, 14, 0, 21, 0, 20, 0, 15, 0, 19, 0, 16, 0, 15, 0, 20, 0, 19, 0, 17, 0, 2, 0, 5, 0, 17, 0, 3, 0, 2, 0, 4, 0, 29, 0, 6, 0, 4, 0, 18, 0, 29, 0, 0, 0, 18, 0, 4, 0, 0, 0, 1, 0, 18, 0),
+"lods": [0.481844, PackedByteArray(14, 0, 19, 0, 5, 0, 19, 0, 2, 0, 5, 0, 19, 0, 3, 0, 2, 0, 14, 0, 23, 0, 19, 0, 12, 0, 23, 0, 14, 0, 11, 0, 23, 0, 12, 0, 11, 0, 24, 0, 23, 0, 11, 0, 25, 0, 24, 0, 7, 0, 25, 0, 11, 0, 7, 0, 28, 0, 25, 0, 0, 0, 28, 0, 7, 0, 0, 0, 1, 0, 28, 0, 0, 0, 31, 0, 1, 0, 0, 0, 30, 0, 31, 0, 11, 0, 42, 0, 40, 0, 11, 0, 40, 0, 38, 0, 12, 0, 42, 0, 11, 0, 11, 0, 38, 0, 7, 0, 12, 0, 43, 0, 42, 0, 7, 0, 38, 0, 36, 0, 7, 0, 36, 0, 30, 0, 7, 0, 30, 0, 0, 0, 14, 0, 43, 0, 12, 0, 14, 0, 35, 0, 43, 0, 5, 0, 35, 0, 14, 0, 2, 0, 35, 0, 5, 0, 2, 0, 32, 0, 35, 0, 25, 0, 54, 0, 24, 0, 24, 0, 54, 0, 53, 0, 25, 0, 56, 0, 54, 0, 24, 0, 53, 0, 23, 0, 25, 0, 48, 0, 56, 0, 23, 0, 53, 0, 50, 0, 28, 0, 48, 0, 25, 0, 1, 0, 48, 0, 28, 0, 1, 0, 31, 0, 48, 0, 23, 0, 50, 0, 47, 0, 23, 0, 47, 0, 19, 0, 19, 0, 47, 0, 33, 0, 19, 0, 33, 0, 3, 0, 35, 0, 33, 0, 47, 0, 35, 0, 32, 0, 33, 0, 47, 0, 50, 0, 35, 0, 50, 0, 43, 0, 35, 0, 50, 0, 53, 0, 43, 0, 53, 0, 42, 0, 43, 0, 53, 0, 54, 0, 42, 0, 54, 0, 40, 0, 42, 0, 54, 0, 56, 0, 40, 0, 56, 0, 38, 0, 40, 0, 56, 0, 48, 0, 38, 0, 48, 0, 36, 0, 38, 0, 30, 0, 36, 0, 48, 0, 30, 0, 48, 0, 31, 0, 3, 0, 32, 0, 2, 0, 3, 0, 33, 0, 32, 0), 1.34331, PackedByteArray(0, 0, 31, 0, 1, 0, 0, 0, 30, 0, 31, 0, 25, 0, 53, 0, 24, 0, 24, 0, 53, 0, 23, 0, 23, 0, 53, 0, 33, 0, 23, 0, 33, 0, 3, 0, 25, 0, 48, 0, 53, 0, 1, 0, 48, 0, 25, 0, 1, 0, 31, 0, 48, 0, 35, 0, 33, 0, 53, 0, 35, 0, 32, 0, 33, 0, 53, 0, 40, 0, 35, 0, 53, 0, 48, 0, 40, 0, 30, 0, 40, 0, 48, 0, 30, 0, 48, 0, 31, 0, 12, 0, 30, 0, 0, 0, 12, 0, 40, 0, 30, 0, 12, 0, 35, 0, 40, 0, 2, 0, 35, 0, 12, 0, 2, 0, 32, 0, 35, 0, 3, 0, 32, 0, 2, 0, 3, 0, 33, 0, 32, 0, 12, 0, 25, 0, 24, 0, 12, 0, 24, 0, 23, 0, 0, 0, 25, 0, 12, 0, 0, 0, 1, 0, 25, 0, 23, 0, 2, 0, 12, 0, 23, 0, 3, 0, 2, 0)],
+"name": "Material.002",
+"primitive": 3,
+"vertex_count": 60,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 0, 0, 128, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 128, 64, 34, 209, 52, 192, 0, 0, 0, 191, 64, 137, 157, 192, 40, 215, 213, 191, 0, 0, 0, 191, 200, 47, 150, 192, 32, 76, 14, 191, 0, 0, 0, 191, 202, 19, 138, 192, 0, 0, 0, 63, 0, 0, 0, 191, 164, 212, 114, 192, 12, 75, 189, 63, 0, 0, 0, 191, 180, 248, 72, 192, 34, 75, 23, 64, 0, 0, 0, 191, 34, 75, 23, 192, 180, 248, 72, 64, 0, 0, 0, 191, 12, 75, 189, 191, 164, 212, 114, 64, 0, 0, 0, 191, 0, 0, 0, 191, 202, 19, 138, 64, 0, 0, 0, 191, 32, 76, 14, 63, 200, 47, 150, 64, 0, 0, 0, 191, 40, 215, 213, 63, 64, 137, 157, 64, 0, 0, 0, 191, 34, 209, 52, 64, 0, 0, 160, 64, 154, 153, 25, 64, 0, 0, 128, 64, 0, 0, 128, 192, 154, 153, 25, 64, 0, 0, 160, 192, 64, 137, 157, 64, 51, 51, 19, 64, 34, 209, 52, 64, 200, 47, 150, 64, 205, 204, 12, 64, 40, 215, 213, 63, 202, 19, 138, 64, 102, 102, 6, 64, 32, 76, 14, 63, 164, 212, 114, 64, 0, 0, 0, 64, 0, 0, 0, 191, 180, 248, 72, 64, 51, 51, 243, 63, 12, 75, 189, 191, 34, 75, 23, 64, 51, 51, 243, 63, 34, 75, 23, 192, 12, 75, 189, 63, 51, 51, 243, 63, 180, 248, 72, 192, 0, 0, 0, 63, 0, 0, 0, 64, 164, 212, 114, 192, 32, 76, 14, 191, 102, 102, 6, 64, 202, 19, 138, 192, 40, 215, 213, 191, 205, 204, 12, 64, 200, 47, 150, 192, 34, 209, 52, 192, 51, 51, 19, 64, 64, 137, 157, 192, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 192, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 192, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 64, 239, 231, 125, 192, 0, 0, 0, 191, 157, 251, 191, 192, 157, 251, 191, 64, 0, 0, 0, 191, 239, 231, 125, 64, 152, 118, 44, 192, 0, 0, 0, 191, 43, 67, 189, 192, 43, 182, 180, 191, 0, 0, 0, 191, 165, 24, 181, 192, 78, 82, 49, 190, 0, 0, 0, 191, 54, 164, 167, 192, 1, 0, 128, 63, 0, 0, 0, 191, 205, 32, 149, 192, 121, 155, 5, 64, 0, 0, 0, 191, 1, 191, 123, 192, 95, 140, 68, 64, 0, 0, 0, 191, 95, 140, 68, 192, 1, 191, 123, 64, 0, 0, 0, 191, 121, 155, 5, 192, 205, 32, 149, 64, 0, 0, 0, 191, 1, 0, 128, 191, 54, 164, 167, 64, 0, 0, 0, 191, 78, 82, 49, 62, 165, 24, 181, 64, 0, 0, 0, 191, 43, 182, 180, 63, 43, 67, 189, 64, 0, 0, 0, 191, 152, 118, 44, 64, 157, 251, 191, 64, 0, 0, 32, 64, 239, 231, 125, 64, 239, 231, 125, 192, 0, 0, 32, 64, 157, 251, 191, 192, 43, 67, 189, 64, 0, 0, 32, 64, 152, 118, 44, 64, 165, 24, 181, 64, 0, 0, 32, 64, 43, 182, 180, 63, 54, 164, 167, 64, 0, 0, 32, 64, 78, 82, 49, 62, 205, 32, 149, 64, 0, 0, 32, 64, 1, 0, 128, 191, 1, 191, 123, 64, 0, 0, 32, 64, 121, 155, 5, 192, 95, 140, 68, 64, 0, 0, 32, 64, 95, 140, 68, 192, 121, 155, 5, 64, 0, 0, 32, 64, 1, 191, 123, 192, 1, 0, 128, 63, 0, 0, 32, 64, 205, 32, 149, 192, 78, 82, 49, 190, 0, 0, 32, 64, 54, 164, 167, 192, 43, 182, 180, 191, 0, 0, 32, 64, 165, 24, 181, 192, 152, 118, 44, 192, 0, 0, 32, 64, 43, 67, 189, 192)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "turn_wall_Cube001"
+_surfaces = [{
+"aabb": AABB(-5, -0.5, -6, 11, 3, 11),
+"attribute_data": PackedByteArray(0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 154, 153, 25, 62, 0, 0, 0, 63, 154, 153, 25, 62, 0, 0, 0, 63, 0, 0, 192, 62, 206, 204, 140, 62, 0, 0, 192, 62, 206, 204, 140, 62, 89, 172, 55, 62, 180, 3, 255, 62, 89, 172, 55, 62, 180, 3, 255, 62, 94, 59, 85, 62, 28, 19, 252, 62, 94, 59, 85, 62, 28, 19, 252, 62, 50, 197, 113, 62, 28, 59, 247, 62, 50, 197, 113, 62, 28, 59, 247, 62, 103, 102, 134, 62, 236, 144, 240, 62, 103, 102, 134, 62, 236, 144, 240, 62, 232, 237, 146, 62, 188, 49, 232, 62, 232, 237, 146, 62, 188, 49, 232, 62, 57, 66, 158, 62, 60, 66, 222, 62, 57, 66, 158, 62, 60, 66, 222, 62, 188, 49, 168, 62, 232, 237, 210, 62, 188, 49, 168, 62, 232, 237, 210, 62, 238, 144, 176, 62, 102, 102, 198, 62, 238, 144, 176, 62, 102, 102, 198, 62, 30, 59, 183, 62, 152, 226, 184, 62, 30, 59, 183, 62, 152, 226, 184, 62, 28, 19, 188, 62, 176, 157, 170, 62, 28, 19, 188, 62, 176, 157, 170, 62, 179, 3, 191, 62, 46, 214, 155, 62, 179, 3, 191, 62, 46, 214, 155, 62, 0, 0, 32, 63, 206, 204, 140, 62, 0, 0, 32, 63, 206, 204, 140, 62, 153, 153, 89, 63, 0, 0, 0, 63, 153, 153, 89, 63, 0, 0, 0, 63, 38, 126, 32, 63, 46, 214, 155, 62, 38, 126, 32, 63, 46, 214, 155, 62, 114, 246, 33, 63, 176, 157, 170, 62, 114, 246, 33, 63, 176, 157, 170, 62, 112, 98, 36, 63, 152, 226, 184, 62, 112, 98, 36, 63, 152, 226, 184, 62, 138, 183, 39, 63, 102, 102, 198, 62, 138, 183, 39, 63, 102, 102, 198, 62, 33, 231, 43, 63, 232, 237, 210, 62, 33, 231, 43, 63, 232, 237, 210, 62, 228, 222, 48, 63, 58, 66, 222, 62, 228, 222, 48, 63, 58, 66, 222, 62, 11, 137, 54, 63, 190, 49, 232, 62, 11, 137, 54, 63, 190, 49, 232, 62, 204, 204, 60, 63, 240, 144, 240, 62, 204, 204, 60, 63, 240, 144, 240, 62, 180, 142, 67, 63, 30, 59, 247, 62, 180, 142, 67, 63, 30, 59, 247, 62, 40, 177, 74, 63, 28, 19, 252, 62, 40, 177, 74, 63, 28, 19, 252, 62, 233, 20, 82, 63, 180, 3, 255, 62, 233, 20, 82, 63, 180, 3, 255, 62, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 192, 62, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 32, 63, 0, 0, 64, 63, 0, 0, 96, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 154, 153, 25, 62, 0, 0, 0, 63, 0, 0, 192, 62, 154, 153, 57, 63, 255, 255, 191, 62, 206, 204, 140, 62, 0, 0, 192, 62, 206, 204, 140, 62, 89, 172, 55, 62, 180, 3, 255, 62, 0, 0, 192, 62, 234, 20, 50, 63, 94, 59, 85, 62, 28, 19, 252, 62, 0, 0, 192, 62, 40, 177, 42, 63, 50, 197, 113, 62, 28, 59, 247, 62, 0, 0, 192, 62, 180, 142, 35, 63, 103, 102, 134, 62, 236, 144, 240, 62, 0, 0, 192, 62, 205, 204, 28, 63, 232, 237, 146, 62, 188, 49, 232, 62, 0, 0, 192, 62, 12, 137, 22, 63, 57, 66, 158, 62, 60, 66, 222, 62, 0, 0, 192, 62, 0, 0, 0, 63, 188, 49, 168, 62, 232, 237, 210, 62, 0, 0, 192, 62, 232, 237, 210, 62, 238, 144, 176, 62, 102, 102, 198, 62, 0, 0, 192, 62, 104, 102, 198, 62, 30, 59, 183, 62, 152, 226, 184, 62, 0, 0, 192, 62, 152, 226, 184, 62, 28, 19, 188, 62, 176, 157, 170, 62, 1, 0, 192, 62, 174, 157, 170, 62, 179, 3, 191, 62, 46, 214, 155, 62, 0, 0, 192, 62, 44, 214, 155, 62, 0, 0, 32, 63, 206, 204, 140, 62, 0, 0, 32, 63, 206, 204, 140, 62, 0, 0, 32, 63, 154, 153, 57, 63, 153, 153, 89, 63, 0, 0, 0, 63, 0, 0, 32, 63, 44, 214, 155, 62, 38, 126, 32, 63, 46, 214, 155, 62, 0, 0, 32, 63, 176, 157, 170, 62, 114, 246, 33, 63, 176, 157, 170, 62, 0, 0, 32, 63, 152, 226, 184, 62, 112, 98, 36, 63, 152, 226, 184, 62, 0, 0, 32, 63, 104, 102, 198, 62, 138, 183, 39, 63, 102, 102, 198, 62, 0, 0, 32, 63, 232, 237, 210, 62, 33, 231, 43, 63, 232, 237, 210, 62, 0, 0, 32, 63, 0, 0, 0, 63, 228, 222, 48, 63, 58, 66, 222, 62, 0, 0, 32, 63, 12, 137, 22, 63, 11, 137, 54, 63, 190, 49, 232, 62, 0, 0, 32, 63, 205, 204, 28, 63, 204, 204, 60, 63, 240, 144, 240, 62, 0, 0, 32, 63, 180, 142, 35, 63, 180, 142, 67, 63, 30, 59, 247, 62, 0, 0, 32, 63, 40, 177, 42, 63, 40, 177, 74, 63, 28, 19, 252, 62, 0, 0, 32, 63, 234, 20, 50, 63, 233, 20, 82, 63, 180, 3, 255, 62, 228, 222, 48, 63, 58, 66, 222, 62, 228, 222, 48, 63, 58, 66, 222, 62),
+"format": 4119,
+"index_count": 348,
+"index_data": PackedByteArray(25, 0, 86, 0, 23, 0, 25, 0, 88, 0, 86, 0, 36, 0, 38, 0, 14, 0, 36, 0, 42, 0, 38, 0, 2, 0, 67, 0, 3, 0, 2, 0, 65, 0, 67, 0, 57, 0, 119, 0, 55, 0, 57, 0, 121, 0, 119, 0, 17, 0, 76, 0, 13, 0, 17, 0, 80, 0, 76, 0, 35, 0, 96, 0, 33, 0, 35, 0, 98, 0, 96, 0, 41, 0, 127, 0, 63, 0, 41, 0, 105, 0, 127, 0, 47, 0, 109, 0, 45, 0, 47, 0, 111, 0, 109, 0, 27, 0, 88, 0, 25, 0, 27, 0, 90, 0, 88, 0, 55, 0, 117, 0, 53, 0, 55, 0, 119, 0, 117, 0, 19, 0, 80, 0, 17, 0, 19, 0, 82, 0, 80, 0, 37, 0, 98, 0, 35, 0, 37, 0, 100, 0, 98, 0, 63, 0, 125, 0, 61, 0, 63, 0, 127, 0, 125, 0, 45, 0, 107, 0, 43, 0, 45, 0, 109, 0, 107, 0, 29, 0, 90, 0, 27, 0, 29, 0, 92, 0, 90, 0, 78, 0, 75, 0, 103, 0, 78, 0, 72, 0, 75, 0, 66, 0, 104, 0, 68, 0, 66, 0, 77, 0, 104, 0, 103, 0, 101, 0, 78, 0, 103, 0, 106, 0, 101, 0, 106, 0, 99, 0, 101, 0, 106, 0, 108, 0, 99, 0, 108, 0, 97, 0, 99, 0, 108, 0, 110, 0, 97, 0, 110, 0, 95, 0, 97, 0, 110, 0, 112, 0, 95, 0, 112, 0, 93, 0, 95, 0, 112, 0, 114, 0, 93, 0, 114, 0, 91, 0, 93, 0, 114, 0, 116, 0, 91, 0, 116, 0, 89, 0, 91, 0, 116, 0, 118, 0, 89, 0, 118, 0, 87, 0, 89, 0, 118, 0, 120, 0, 87, 0, 120, 0, 85, 0, 87, 0, 120, 0, 122, 0, 85, 0, 122, 0, 83, 0, 85, 0, 122, 0, 124, 0, 83, 0, 124, 0, 81, 0, 83, 0, 124, 0, 126, 0, 81, 0, 126, 0, 77, 0, 81, 0, 126, 0, 104, 0, 77, 0, 49, 0, 111, 0, 47, 0, 49, 0, 113, 0, 111, 0, 13, 0, 64, 0, 0, 0, 13, 0, 76, 0, 64, 0, 11, 0, 71, 0, 8, 0, 11, 0, 74, 0, 71, 0, 33, 0, 94, 0, 31, 0, 33, 0, 96, 0, 94, 0, 7, 0, 79, 0, 15, 0, 7, 0, 70, 0, 79, 0, 59, 0, 121, 0, 57, 0, 59, 0, 123, 0, 121, 0, 5, 0, 105, 0, 41, 0, 5, 0, 69, 0, 105, 0, 23, 0, 84, 0, 21, 0, 23, 0, 86, 0, 84, 0, 51, 0, 113, 0, 49, 0, 51, 0, 115, 0, 113, 0, 39, 0, 73, 0, 10, 0, 39, 0, 102, 0, 73, 0, 43, 0, 102, 0, 39, 0, 43, 0, 107, 0, 102, 0, 31, 0, 92, 0, 29, 0, 31, 0, 94, 0, 92, 0, 61, 0, 123, 0, 59, 0, 61, 0, 125, 0, 123, 0, 15, 0, 100, 0, 37, 0, 15, 0, 79, 0, 100, 0, 21, 0, 82, 0, 19, 0, 21, 0, 84, 0, 82, 0, 53, 0, 115, 0, 51, 0, 53, 0, 117, 0, 115, 0, 16, 0, 60, 0, 18, 0, 16, 0, 62, 0, 60, 0, 18, 0, 58, 0, 20, 0, 18, 0, 60, 0, 58, 0, 20, 0, 56, 0, 22, 0, 20, 0, 58, 0, 56, 0, 22, 0, 54, 0, 24, 0, 22, 0, 56, 0, 54, 0, 24, 0, 52, 0, 26, 0, 24, 0, 54, 0, 52, 0, 26, 0, 50, 0, 28, 0, 26, 0, 52, 0, 50, 0, 28, 0, 48, 0, 30, 0, 28, 0, 50, 0, 48, 0, 30, 0, 46, 0, 32, 0, 30, 0, 48, 0, 46, 0, 32, 0, 44, 0, 34, 0, 32, 0, 46, 0, 44, 0, 34, 0, 42, 0, 36, 0, 34, 0, 44, 0, 42, 0, 38, 0, 6, 0, 14, 0, 38, 0, 9, 0, 6, 0, 12, 0, 62, 0, 16, 0, 12, 0, 40, 0, 62, 0, 1, 0, 40, 0, 12, 0, 1, 0, 4, 0, 40, 0),
+"lods": [0.481844, PackedByteArray(32, 0, 42, 0, 14, 0, 42, 0, 6, 0, 14, 0, 42, 0, 9, 0, 6, 0, 32, 0, 50, 0, 42, 0, 28, 0, 50, 0, 32, 0, 26, 0, 50, 0, 28, 0, 26, 0, 52, 0, 50, 0, 26, 0, 54, 0, 52, 0, 18, 0, 54, 0, 26, 0, 18, 0, 60, 0, 54, 0, 1, 0, 60, 0, 18, 0, 1, 0, 4, 0, 60, 0, 2, 0, 67, 0, 3, 0, 2, 0, 65, 0, 67, 0, 27, 0, 92, 0, 88, 0, 27, 0, 88, 0, 84, 0, 29, 0, 92, 0, 27, 0, 27, 0, 84, 0, 19, 0, 29, 0, 94, 0, 92, 0, 19, 0, 84, 0, 80, 0, 19, 0, 80, 0, 64, 0, 19, 0, 64, 0, 0, 0, 33, 0, 94, 0, 29, 0, 33, 0, 79, 0, 94, 0, 15, 0, 79, 0, 33, 0, 7, 0, 79, 0, 15, 0, 7, 0, 70, 0, 79, 0, 55, 0, 117, 0, 129, 0, 129, 0, 117, 0, 115, 0, 55, 0, 121, 0, 117, 0, 129, 0, 115, 0, 51, 0, 55, 0, 105, 0, 121, 0, 51, 0, 115, 0, 109, 0, 61, 0, 105, 0, 55, 0, 5, 0, 105, 0, 61, 0, 5, 0, 69, 0, 105, 0, 51, 0, 109, 0, 102, 0, 51, 0, 102, 0, 43, 0, 43, 0, 102, 0, 73, 0, 43, 0, 73, 0, 10, 0, 78, 0, 75, 0, 103, 0, 78, 0, 72, 0, 75, 0, 103, 0, 108, 0, 78, 0, 108, 0, 95, 0, 78, 0, 108, 0, 114, 0, 95, 0, 114, 0, 93, 0, 95, 0, 114, 0, 116, 0, 93, 0, 116, 0, 89, 0, 93, 0, 116, 0, 120, 0, 89, 0, 120, 0, 85, 0, 89, 0, 120, 0, 104, 0, 85, 0, 104, 0, 81, 0, 85, 0, 66, 0, 81, 0, 104, 0, 66, 0, 104, 0, 68, 0, 11, 0, 71, 0, 8, 0, 11, 0, 74, 0, 71, 0), 1.34331, PackedByteArray(2, 0, 67, 0, 3, 0, 2, 0, 65, 0, 67, 0, 55, 0, 115, 0, 128, 0, 128, 0, 115, 0, 51, 0, 51, 0, 115, 0, 73, 0, 51, 0, 73, 0, 10, 0, 55, 0, 105, 0, 115, 0, 5, 0, 105, 0, 55, 0, 5, 0, 69, 0, 105, 0, 78, 0, 75, 0, 114, 0, 78, 0, 72, 0, 75, 0, 114, 0, 89, 0, 78, 0, 114, 0, 104, 0, 89, 0, 66, 0, 89, 0, 104, 0, 66, 0, 104, 0, 68, 0, 29, 0, 64, 0, 0, 0, 29, 0, 88, 0, 64, 0, 29, 0, 79, 0, 88, 0, 7, 0, 79, 0, 29, 0, 7, 0, 70, 0, 79, 0, 11, 0, 71, 0, 8, 0, 11, 0, 74, 0, 71, 0, 28, 0, 54, 0, 52, 0, 28, 0, 52, 0, 50, 0, 1, 0, 54, 0, 28, 0, 1, 0, 4, 0, 54, 0, 50, 0, 6, 0, 28, 0, 50, 0, 9, 0, 6, 0)],
+"material": ExtResource("1_x5dc7"),
+"name": "Material.002",
+"primitive": 3,
+"vertex_count": 130,
+"vertex_data": PackedByteArray(0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 255, 127, 209, 160, 104, 16, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 255, 127, 255, 127, 209, 160, 104, 16, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 160, 192, 185, 133, 90, 244, 255, 255, 255, 63, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 0, 0, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 91, 116, 21, 250, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 128, 192, 0, 0, 0, 191, 0, 0, 160, 192, 241, 123, 255, 127, 255, 127, 0, 0, 0, 0, 128, 192, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 128, 64, 14, 4, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 128, 64, 255, 127, 0, 0, 255, 255, 255, 191, 34, 209, 52, 192, 0, 0, 0, 191, 64, 137, 157, 192, 27, 113, 255, 127, 255, 127, 0, 0, 34, 209, 52, 192, 0, 0, 0, 191, 64, 137, 157, 192, 255, 127, 0, 0, 255, 255, 255, 191, 40, 215, 213, 191, 0, 0, 0, 191, 200, 47, 150, 192, 243, 100, 255, 127, 255, 127, 0, 0, 40, 215, 213, 191, 0, 0, 0, 191, 200, 47, 150, 192, 255, 127, 0, 0, 255, 255, 255, 191, 32, 76, 14, 191, 0, 0, 0, 191, 202, 19, 138, 192, 129, 90, 255, 127, 255, 127, 0, 0, 32, 76, 14, 191, 0, 0, 0, 191, 202, 19, 138, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 0, 63, 0, 0, 0, 191, 164, 212, 114, 192, 37, 81, 255, 127, 255, 127, 0, 0, 0, 0, 0, 63, 0, 0, 0, 191, 164, 212, 114, 192, 255, 127, 0, 0, 255, 255, 255, 191, 12, 75, 189, 63, 0, 0, 0, 191, 180, 248, 72, 192, 108, 72, 255, 127, 255, 127, 0, 0, 12, 75, 189, 63, 0, 0, 0, 191, 180, 248, 72, 192, 255, 127, 0, 0, 255, 255, 255, 191, 34, 75, 23, 64, 0, 0, 0, 191, 34, 75, 23, 192, 255, 63, 255, 127, 255, 127, 0, 0, 34, 75, 23, 64, 0, 0, 0, 191, 34, 75, 23, 192, 255, 127, 0, 0, 255, 255, 255, 191, 180, 248, 72, 64, 0, 0, 0, 191, 12, 75, 189, 191, 146, 55, 255, 127, 255, 127, 0, 0, 180, 248, 72, 64, 0, 0, 0, 191, 12, 75, 189, 191, 255, 127, 0, 0, 255, 255, 255, 191, 164, 212, 114, 64, 0, 0, 0, 191, 0, 0, 0, 191, 217, 46, 255, 127, 255, 127, 0, 0, 164, 212, 114, 64, 0, 0, 0, 191, 0, 0, 0, 191, 255, 127, 0, 0, 255, 255, 255, 191, 202, 19, 138, 64, 0, 0, 0, 191, 32, 76, 14, 63, 125, 37, 255, 127, 255, 127, 0, 0, 202, 19, 138, 64, 0, 0, 0, 191, 32, 76, 14, 63, 255, 127, 0, 0, 255, 255, 255, 191, 200, 47, 150, 64, 0, 0, 0, 191, 40, 215, 213, 63, 12, 27, 255, 127, 255, 127, 0, 0, 200, 47, 150, 64, 0, 0, 0, 191, 40, 215, 213, 63, 255, 127, 0, 0, 255, 255, 255, 191, 64, 137, 157, 64, 0, 0, 0, 191, 34, 209, 52, 64, 227, 14, 255, 127, 255, 127, 0, 0, 64, 137, 157, 64, 0, 0, 0, 191, 34, 209, 52, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 154, 153, 25, 64, 0, 0, 128, 64, 211, 3, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 154, 153, 25, 64, 0, 0, 128, 64, 19, 112, 141, 244, 255, 255, 255, 191, 0, 0, 128, 192, 154, 153, 25, 64, 0, 0, 160, 192, 43, 124, 255, 127, 110, 145, 252, 8, 0, 0, 128, 192, 154, 153, 25, 64, 0, 0, 160, 192, 121, 132, 19, 240, 255, 255, 255, 63, 64, 137, 157, 64, 51, 51, 19, 64, 34, 209, 52, 64, 135, 14, 255, 127, 255, 127, 0, 0, 64, 137, 157, 64, 51, 51, 19, 64, 34, 209, 52, 64, 111, 105, 141, 234, 255, 255, 255, 191, 200, 47, 150, 64, 205, 204, 12, 64, 40, 215, 213, 63, 191, 26, 255, 127, 255, 127, 0, 0, 200, 47, 150, 64, 205, 204, 12, 64, 40, 215, 213, 63, 110, 99, 105, 223, 255, 255, 255, 63, 202, 19, 138, 64, 102, 102, 6, 64, 32, 76, 14, 63, 57, 37, 255, 127, 255, 127, 0, 0, 202, 19, 138, 64, 102, 102, 6, 64, 32, 76, 14, 63, 79, 95, 42, 213, 255, 255, 255, 63, 164, 212, 114, 64, 0, 0, 0, 64, 0, 0, 0, 191, 154, 46, 255, 127, 255, 127, 0, 0, 164, 212, 114, 64, 0, 0, 0, 64, 0, 0, 0, 191, 99, 93, 167, 204, 255, 255, 255, 63, 180, 248, 72, 64, 51, 51, 243, 63, 12, 75, 189, 191, 118, 55, 255, 127, 255, 127, 0, 0, 180, 248, 72, 64, 51, 51, 243, 63, 12, 75, 189, 191, 220, 94, 16, 199, 255, 255, 255, 63, 34, 75, 23, 64, 51, 51, 243, 63, 34, 75, 23, 192, 255, 63, 255, 127, 255, 127, 0, 0, 34, 75, 23, 64, 51, 51, 243, 63, 34, 75, 23, 192, 158, 98, 61, 197, 255, 255, 255, 63, 12, 75, 189, 63, 51, 51, 243, 63, 180, 248, 72, 192, 137, 72, 255, 127, 255, 127, 0, 0, 12, 75, 189, 63, 51, 51, 243, 63, 180, 248, 72, 192, 51, 104, 16, 199, 255, 255, 255, 63, 0, 0, 0, 63, 0, 0, 0, 64, 164, 212, 114, 192, 100, 81, 255, 127, 255, 127, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 164, 212, 114, 192, 68, 111, 167, 204, 255, 255, 255, 63, 32, 76, 14, 191, 102, 102, 6, 64, 202, 19, 138, 192, 198, 90, 255, 127, 255, 127, 0, 0, 32, 76, 14, 191, 102, 102, 6, 64, 202, 19, 138, 192, 219, 117, 42, 213, 255, 255, 255, 63, 40, 215, 213, 191, 205, 204, 12, 64, 200, 47, 150, 192, 64, 101, 255, 127, 255, 127, 0, 0, 40, 215, 213, 191, 205, 204, 12, 64, 200, 47, 150, 192, 251, 123, 105, 223, 255, 255, 255, 63, 34, 209, 52, 192, 51, 51, 19, 64, 64, 137, 157, 192, 120, 113, 255, 127, 255, 127, 0, 0, 34, 209, 52, 192, 51, 51, 19, 64, 64, 137, 157, 192, 29, 129, 110, 233, 255, 255, 255, 63, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 192, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 0, 191, 0, 0, 192, 192, 255, 255, 238, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 192, 0, 0, 255, 127, 255, 255, 255, 191, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 192, 255, 255, 238, 255, 255, 127, 255, 255, 0, 0, 160, 192, 0, 0, 32, 64, 0, 0, 192, 192, 185, 133, 90, 244, 255, 255, 255, 63, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 15, 128, 255, 127, 255, 255, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 64, 91, 116, 21, 250, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 64, 255, 255, 15, 128, 255, 127, 255, 255, 239, 231, 125, 192, 0, 0, 0, 191, 157, 251, 191, 192, 255, 127, 0, 0, 255, 255, 255, 191, 239, 231, 125, 192, 0, 0, 0, 191, 157, 251, 191, 192, 255, 255, 213, 251, 255, 127, 255, 255, 157, 251, 191, 64, 0, 0, 0, 191, 239, 231, 125, 64, 255, 255, 41, 132, 255, 127, 255, 255, 157, 251, 191, 64, 0, 0, 0, 191, 239, 231, 125, 64, 255, 127, 0, 0, 255, 255, 255, 191, 152, 118, 44, 192, 0, 0, 0, 191, 43, 67, 189, 192, 255, 127, 0, 0, 255, 255, 255, 191, 152, 118, 44, 192, 0, 0, 0, 191, 43, 67, 189, 192, 255, 255, 9, 241, 255, 127, 255, 255, 43, 182, 180, 191, 0, 0, 0, 191, 165, 24, 181, 192, 255, 127, 0, 0, 255, 255, 255, 191, 43, 182, 180, 191, 0, 0, 0, 191, 165, 24, 181, 192, 255, 255, 242, 228, 255, 127, 255, 255, 78, 82, 49, 190, 0, 0, 0, 191, 54, 164, 167, 192, 255, 127, 0, 0, 255, 255, 255, 191, 78, 82, 49, 190, 0, 0, 0, 191, 54, 164, 167, 192, 255, 255, 129, 218, 255, 127, 255, 255, 1, 0, 128, 63, 0, 0, 0, 191, 205, 32, 149, 192, 255, 127, 0, 0, 255, 255, 255, 191, 1, 0, 128, 63, 0, 0, 0, 191, 205, 32, 149, 192, 255, 255, 37, 209, 255, 127, 255, 255, 121, 155, 5, 64, 0, 0, 0, 191, 1, 191, 123, 192, 255, 127, 0, 0, 255, 255, 255, 191, 121, 155, 5, 64, 0, 0, 0, 191, 1, 191, 123, 192, 255, 255, 108, 200, 255, 127, 255, 255, 95, 140, 68, 64, 0, 0, 0, 191, 95, 140, 68, 192, 255, 127, 0, 0, 255, 255, 255, 191, 95, 140, 68, 64, 0, 0, 0, 191, 95, 140, 68, 192, 255, 255, 255, 191, 255, 127, 255, 255, 1, 191, 123, 64, 0, 0, 0, 191, 121, 155, 5, 192, 255, 127, 0, 0, 255, 255, 255, 191, 1, 191, 123, 64, 0, 0, 0, 191, 121, 155, 5, 192, 255, 255, 146, 183, 255, 127, 255, 255, 205, 32, 149, 64, 0, 0, 0, 191, 1, 0, 128, 191, 255, 127, 0, 0, 255, 255, 255, 191, 205, 32, 149, 64, 0, 0, 0, 191, 1, 0, 128, 191, 255, 255, 217, 174, 255, 127, 255, 255, 54, 164, 167, 64, 0, 0, 0, 191, 78, 82, 49, 62, 255, 127, 0, 0, 255, 255, 255, 191, 54, 164, 167, 64, 0, 0, 0, 191, 78, 82, 49, 62, 255, 255, 125, 165, 255, 127, 254, 255, 165, 24, 181, 64, 0, 0, 0, 191, 43, 182, 180, 63, 255, 127, 0, 0, 255, 255, 255, 191, 165, 24, 181, 64, 0, 0, 0, 191, 43, 182, 180, 63, 255, 255, 11, 155, 255, 127, 254, 255, 43, 67, 189, 64, 0, 0, 0, 191, 152, 118, 44, 64, 255, 127, 0, 0, 255, 255, 255, 191, 43, 67, 189, 64, 0, 0, 0, 191, 152, 118, 44, 64, 255, 255, 245, 142, 255, 127, 255, 255, 157, 251, 191, 64, 0, 0, 32, 64, 239, 231, 125, 64, 27, 112, 152, 244, 255, 255, 255, 191, 157, 251, 191, 64, 0, 0, 32, 64, 239, 231, 125, 64, 255, 255, 41, 132, 255, 127, 255, 255, 239, 231, 125, 192, 0, 0, 32, 64, 157, 251, 191, 192, 255, 255, 213, 251, 255, 127, 255, 255, 239, 231, 125, 192, 0, 0, 32, 64, 157, 251, 191, 192, 124, 132, 27, 240, 255, 255, 255, 63, 43, 67, 189, 64, 0, 0, 32, 64, 152, 118, 44, 64, 255, 255, 245, 142, 255, 127, 254, 255, 43, 67, 189, 64, 0, 0, 32, 64, 152, 118, 44, 64, 118, 105, 154, 234, 255, 255, 255, 191, 165, 24, 181, 64, 0, 0, 32, 64, 43, 182, 180, 63, 255, 255, 11, 155, 255, 127, 254, 255, 165, 24, 181, 64, 0, 0, 32, 64, 43, 182, 180, 63, 120, 99, 127, 223, 255, 255, 255, 63, 54, 164, 167, 64, 0, 0, 32, 64, 78, 82, 49, 62, 255, 255, 125, 165, 255, 127, 255, 255, 54, 164, 167, 64, 0, 0, 32, 64, 78, 82, 49, 62, 88, 95, 65, 213, 255, 255, 255, 63, 205, 32, 149, 64, 0, 0, 32, 64, 1, 0, 128, 191, 255, 255, 217, 174, 255, 127, 255, 255, 205, 32, 149, 64, 0, 0, 32, 64, 1, 0, 128, 191, 101, 93, 190, 204, 255, 255, 255, 63, 1, 191, 123, 64, 0, 0, 32, 64, 121, 155, 5, 192, 255, 255, 146, 183, 255, 127, 255, 255, 1, 191, 123, 64, 0, 0, 32, 64, 121, 155, 5, 192, 214, 94, 23, 199, 255, 255, 255, 63, 95, 140, 68, 64, 0, 0, 32, 64, 95, 140, 68, 192, 255, 255, 255, 191, 255, 127, 255, 255, 95, 140, 68, 64, 0, 0, 32, 64, 95, 140, 68, 192, 158, 98, 61, 197, 255, 255, 255, 63, 121, 155, 5, 64, 0, 0, 32, 64, 1, 191, 123, 192, 255, 255, 108, 200, 255, 127, 255, 255, 121, 155, 5, 64, 0, 0, 32, 64, 1, 191, 123, 192, 65, 104, 23, 199, 255, 255, 255, 63, 1, 0, 128, 63, 0, 0, 32, 64, 205, 32, 149, 192, 255, 255, 37, 209, 255, 127, 255, 255, 1, 0, 128, 63, 0, 0, 32, 64, 205, 32, 149, 192, 89, 111, 190, 204, 255, 255, 255, 63, 78, 82, 49, 190, 0, 0, 32, 64, 54, 164, 167, 192, 255, 255, 129, 218, 255, 127, 255, 255, 78, 82, 49, 190, 0, 0, 32, 64, 54, 164, 167, 192, 233, 117, 65, 213, 255, 255, 255, 63, 43, 182, 180, 191, 0, 0, 32, 64, 165, 24, 181, 192, 255, 255, 242, 228, 255, 127, 255, 255, 43, 182, 180, 191, 0, 0, 32, 64, 165, 24, 181, 192, 7, 124, 127, 223, 255, 255, 255, 63, 152, 118, 44, 192, 0, 0, 32, 64, 43, 67, 189, 192, 255, 255, 9, 241, 255, 127, 255, 255, 152, 118, 44, 192, 0, 0, 32, 64, 43, 67, 189, 192, 35, 129, 118, 233, 255, 255, 255, 63, 34, 75, 23, 64, 51, 51, 243, 63, 34, 75, 23, 192, 250, 97, 221, 197, 255, 127, 0, 0, 34, 75, 23, 64, 51, 51, 243, 63, 34, 75, 23, 192, 81, 98, 220, 197, 255, 127, 0, 0)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_i708r")
diff --git a/assets/meshes/walls/turn_wall_inner.tres b/assets/meshes/walls/turn_wall_inner.tres
new file mode 100644
index 0000000..7e65c3c
--- /dev/null
+++ b/assets/meshes/walls/turn_wall_inner.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://bx645tiy0eiik"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_e0mcs"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_bfq01"]
+_surfaces = [{
+"aabb": AABB(-9.8618, -0.5, -0.138198, 10, 3, 10),
+"format": 4097,
+"index_count": 300,
+"index_data": PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 3, 0, 4, 0, 7, 0, 5, 0, 4, 0, 6, 0, 7, 0, 2, 0, 5, 0, 3, 0, 2, 0, 4, 0, 5, 0, 6, 0, 9, 0, 7, 0, 6, 0, 8, 0, 9, 0, 8, 0, 11, 0, 9, 0, 8, 0, 10, 0, 11, 0, 10, 0, 13, 0, 11, 0, 10, 0, 12, 0, 13, 0, 12, 0, 15, 0, 13, 0, 12, 0, 14, 0, 15, 0, 14, 0, 17, 0, 15, 0, 14, 0, 16, 0, 17, 0, 16, 0, 19, 0, 17, 0, 16, 0, 18, 0, 19, 0, 18, 0, 21, 0, 19, 0, 18, 0, 20, 0, 21, 0, 20, 0, 23, 0, 21, 0, 20, 0, 22, 0, 23, 0, 22, 0, 25, 0, 23, 0, 22, 0, 24, 0, 25, 0, 26, 0, 29, 0, 28, 0, 26, 0, 27, 0, 29, 0, 30, 0, 33, 0, 32, 0, 30, 0, 31, 0, 33, 0, 28, 0, 31, 0, 30, 0, 28, 0, 29, 0, 31, 0, 32, 0, 35, 0, 34, 0, 32, 0, 33, 0, 35, 0, 34, 0, 37, 0, 36, 0, 34, 0, 35, 0, 37, 0, 36, 0, 39, 0, 38, 0, 36, 0, 37, 0, 39, 0, 38, 0, 41, 0, 40, 0, 38, 0, 39, 0, 41, 0, 40, 0, 43, 0, 42, 0, 40, 0, 41, 0, 43, 0, 42, 0, 45, 0, 44, 0, 42, 0, 43, 0, 45, 0, 44, 0, 47, 0, 46, 0, 44, 0, 45, 0, 47, 0, 46, 0, 49, 0, 48, 0, 46, 0, 47, 0, 49, 0, 48, 0, 51, 0, 50, 0, 48, 0, 49, 0, 51, 0, 2, 0, 30, 0, 4, 0, 2, 0, 28, 0, 30, 0, 12, 0, 40, 0, 14, 0, 12, 0, 38, 0, 40, 0, 22, 0, 50, 0, 24, 0, 22, 0, 48, 0, 50, 0, 11, 0, 35, 0, 9, 0, 11, 0, 37, 0, 35, 0, 18, 0, 46, 0, 20, 0, 18, 0, 44, 0, 46, 0, 1, 0, 26, 0, 0, 0, 1, 0, 27, 0, 26, 0, 8, 0, 36, 0, 10, 0, 8, 0, 34, 0, 36, 0, 21, 0, 45, 0, 19, 0, 21, 0, 47, 0, 45, 0, 7, 0, 31, 0, 5, 0, 7, 0, 33, 0, 31, 0, 17, 0, 41, 0, 15, 0, 17, 0, 43, 0, 41, 0, 4, 0, 32, 0, 6, 0, 4, 0, 30, 0, 32, 0, 14, 0, 42, 0, 16, 0, 14, 0, 40, 0, 42, 0, 3, 0, 27, 0, 1, 0, 3, 0, 29, 0, 27, 0, 13, 0, 37, 0, 11, 0, 13, 0, 39, 0, 37, 0, 23, 0, 47, 0, 21, 0, 23, 0, 49, 0, 47, 0, 0, 0, 28, 0, 2, 0, 0, 0, 26, 0, 28, 0, 10, 0, 38, 0, 12, 0, 10, 0, 36, 0, 38, 0, 20, 0, 48, 0, 22, 0, 20, 0, 46, 0, 48, 0, 9, 0, 33, 0, 7, 0, 9, 0, 35, 0, 33, 0, 19, 0, 43, 0, 17, 0, 19, 0, 45, 0, 43, 0, 24, 0, 51, 0, 25, 0, 24, 0, 50, 0, 51, 0, 6, 0, 34, 0, 8, 0, 6, 0, 32, 0, 34, 0, 16, 0, 44, 0, 18, 0, 16, 0, 42, 0, 44, 0, 5, 0, 29, 0, 3, 0, 5, 0, 31, 0, 29, 0, 15, 0, 39, 0, 13, 0, 15, 0, 41, 0, 39, 0, 25, 0, 49, 0, 23, 0, 25, 0, 51, 0, 49, 0),
+"lods": [0.486218, PackedByteArray(0, 0, 3, 0, 1, 0, 0, 0, 6, 0, 3, 0, 6, 0, 13, 0, 3, 0, 6, 0, 10, 0, 13, 0, 10, 0, 14, 0, 13, 0, 14, 0, 23, 0, 13, 0, 14, 0, 20, 0, 23, 0, 20, 0, 25, 0, 23, 0, 20, 0, 24, 0, 25, 0, 26, 0, 31, 0, 28, 0, 26, 0, 27, 0, 31, 0, 28, 0, 31, 0, 39, 0, 28, 0, 39, 0, 38, 0, 38, 0, 39, 0, 41, 0, 38, 0, 41, 0, 48, 0, 48, 0, 41, 0, 45, 0, 48, 0, 45, 0, 51, 0, 48, 0, 51, 0, 50, 0, 20, 0, 50, 0, 24, 0, 20, 0, 48, 0, 50, 0, 14, 0, 48, 0, 20, 0, 14, 0, 38, 0, 48, 0, 10, 0, 38, 0, 14, 0, 6, 0, 38, 0, 10, 0, 6, 0, 28, 0, 38, 0, 0, 0, 28, 0, 6, 0, 0, 0, 26, 0, 28, 0, 1, 0, 26, 0, 0, 0, 1, 0, 27, 0, 26, 0, 23, 0, 41, 0, 13, 0, 13, 0, 41, 0, 39, 0, 23, 0, 45, 0, 41, 0, 25, 0, 45, 0, 23, 0, 25, 0, 51, 0, 45, 0, 13, 0, 39, 0, 31, 0, 13, 0, 31, 0, 3, 0, 3, 0, 31, 0, 27, 0, 3, 0, 27, 0, 1, 0, 24, 0, 51, 0, 25, 0, 24, 0, 50, 0, 51, 0), 2.39373, PackedByteArray(0, 0, 13, 0, 1, 0, 0, 0, 14, 0, 13, 0, 14, 0, 25, 0, 13, 0, 14, 0, 24, 0, 25, 0, 26, 0, 45, 0, 38, 0, 26, 0, 27, 0, 45, 0, 38, 0, 45, 0, 51, 0, 38, 0, 51, 0, 50, 0, 14, 0, 50, 0, 24, 0, 14, 0, 38, 0, 50, 0, 0, 0, 38, 0, 14, 0, 0, 0, 26, 0, 38, 0, 1, 0, 26, 0, 0, 0, 1, 0, 27, 0, 26, 0, 13, 0, 27, 0, 1, 0, 13, 0, 45, 0, 27, 0, 25, 0, 45, 0, 13, 0, 25, 0, 51, 0, 45, 0, 24, 0, 51, 0, 25, 0, 24, 0, 50, 0, 51, 0)],
+"primitive": 3,
+"vertex_count": 52,
+"vertex_data": PackedByteArray(243, 201, 29, 193, 255, 255, 255, 190, 192, 131, 13, 190, 243, 201, 29, 193, 0, 0, 32, 64, 192, 131, 13, 190, 152, 231, 8, 193, 255, 255, 255, 190, 128, 164, 87, 189, 152, 231, 8, 193, 0, 0, 32, 64, 128, 164, 87, 189, 113, 193, 232, 192, 255, 255, 255, 190, 64, 103, 79, 62, 113, 193, 232, 192, 0, 0, 32, 64, 64, 103, 79, 62, 120, 30, 193, 192, 255, 255, 255, 190, 64, 125, 31, 63, 120, 30, 193, 192, 0, 0, 32, 64, 64, 125, 31, 63, 228, 147, 155, 192, 255, 255, 255, 190, 64, 204, 153, 63, 228, 147, 155, 192, 0, 0, 32, 64, 64, 204, 153, 63, 78, 140, 113, 192, 255, 255, 255, 190, 104, 209, 246, 63, 78, 140, 113, 192, 0, 0, 32, 64, 104, 209, 246, 63, 100, 155, 50, 192, 255, 255, 255, 190, 86, 155, 50, 64, 100, 155, 50, 192, 0, 0, 32, 64, 86, 155, 50, 64, 126, 209, 246, 191, 255, 255, 255, 190, 60, 140, 113, 64, 126, 209, 246, 191, 0, 0, 32, 64, 60, 140, 113, 64, 72, 204, 153, 191, 255, 255, 255, 190, 218, 147, 155, 64, 72, 204, 153, 191, 0, 0, 32, 64, 218, 147, 155, 64, 64, 125, 31, 191, 255, 255, 255, 190, 108, 30, 193, 64, 64, 125, 31, 191, 0, 0, 32, 64, 108, 30, 193, 64, 0, 103, 79, 190, 255, 255, 255, 190, 100, 193, 232, 64, 0, 103, 79, 190, 0, 0, 32, 64, 100, 193, 232, 64, 0, 167, 87, 61, 255, 255, 255, 190, 147, 231, 8, 65, 0, 167, 87, 61, 0, 0, 32, 64, 147, 231, 8, 65, 192, 132, 13, 62, 255, 255, 255, 190, 238, 201, 29, 65, 192, 132, 13, 62, 0, 0, 32, 64, 238, 201, 29, 65, 243, 201, 29, 193, 254, 255, 255, 190, 15, 159, 92, 63, 243, 201, 29, 193, 0, 0, 32, 64, 15, 159, 92, 63, 58, 254, 10, 193, 255, 255, 255, 190, 14, 85, 112, 63, 58, 254, 10, 193, 0, 0, 32, 64, 14, 85, 112, 63, 175, 9, 241, 192, 255, 255, 255, 190, 94, 144, 149, 63, 175, 9, 241, 192, 0, 0, 32, 64, 94, 144, 149, 63, 104, 93, 205, 192, 255, 255, 255, 190, 80, 0, 198, 63, 104, 93, 205, 192, 0, 0, 32, 64, 80, 0, 198, 63, 227, 147, 171, 192, 255, 255, 255, 190, 23, 83, 4, 64, 227, 147, 171, 192, 0, 0, 32, 64, 23, 83, 4, 64, 32, 65, 140, 192, 255, 255, 255, 190, 2, 47, 46, 64, 32, 65, 140, 192, 0, 0, 32, 64, 2, 47, 46, 64, 160, 220, 95, 192, 255, 255, 255, 190, 148, 220, 95, 64, 160, 220, 95, 192, 0, 0, 32, 64, 148, 220, 95, 64, 11, 47, 46, 192, 255, 255, 255, 190, 24, 65, 140, 64, 11, 47, 46, 192, 0, 0, 32, 64, 24, 65, 140, 64, 25, 83, 4, 192, 255, 255, 255, 190, 219, 147, 171, 64, 25, 83, 4, 192, 0, 0, 32, 64, 219, 147, 171, 64, 78, 0, 198, 191, 255, 255, 255, 190, 94, 93, 205, 64, 78, 0, 198, 191, 0, 0, 32, 64, 94, 93, 205, 64, 84, 144, 149, 191, 255, 255, 255, 190, 164, 9, 241, 64, 84, 144, 149, 191, 0, 0, 32, 64, 164, 9, 241, 64, 229, 84, 112, 191, 255, 255, 255, 190, 54, 254, 10, 65, 229, 84, 112, 191, 0, 0, 32, 64, 54, 254, 10, 65, 46, 159, 92, 191, 254, 255, 255, 190, 241, 201, 29, 65, 46, 159, 92, 191, 0, 0, 32, 64, 241, 201, 29, 65)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "wide_turn_small-6e237ca1d0f874ac4bdf9eea3a770eab_Cube_002"
+_surfaces = [{
+"aabb": AABB(-9.8618, -0.5, -0.138198, 10, 3, 10),
+"attribute_data": PackedByteArray(0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 192, 62, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63, 0, 0, 32, 63, 0, 0, 128, 63),
+"format": 4119,
+"index_count": 300,
+"index_data": PackedByteArray(2, 0, 9, 0, 5, 0, 2, 0, 7, 0, 9, 0, 11, 0, 17, 0, 13, 0, 11, 0, 15, 0, 17, 0, 7, 0, 13, 0, 9, 0, 7, 0, 11, 0, 13, 0, 15, 0, 21, 0, 17, 0, 15, 0, 19, 0, 21, 0, 19, 0, 25, 0, 21, 0, 19, 0, 23, 0, 25, 0, 23, 0, 29, 0, 25, 0, 23, 0, 27, 0, 29, 0, 27, 0, 33, 0, 29, 0, 27, 0, 31, 0, 33, 0, 31, 0, 37, 0, 33, 0, 31, 0, 35, 0, 37, 0, 35, 0, 41, 0, 37, 0, 35, 0, 39, 0, 41, 0, 39, 0, 45, 0, 41, 0, 39, 0, 43, 0, 45, 0, 43, 0, 49, 0, 45, 0, 43, 0, 47, 0, 49, 0, 47, 0, 55, 0, 49, 0, 47, 0, 52, 0, 55, 0, 57, 0, 64, 0, 62, 0, 57, 0, 60, 0, 64, 0, 66, 0, 72, 0, 70, 0, 66, 0, 68, 0, 72, 0, 62, 0, 68, 0, 66, 0, 62, 0, 64, 0, 68, 0, 70, 0, 76, 0, 74, 0, 70, 0, 72, 0, 76, 0, 74, 0, 80, 0, 78, 0, 74, 0, 76, 0, 80, 0, 78, 0, 84, 0, 82, 0, 78, 0, 80, 0, 84, 0, 82, 0, 88, 0, 86, 0, 82, 0, 84, 0, 88, 0, 86, 0, 92, 0, 90, 0, 86, 0, 88, 0, 92, 0, 90, 0, 96, 0, 94, 0, 90, 0, 92, 0, 96, 0, 94, 0, 100, 0, 98, 0, 94, 0, 96, 0, 100, 0, 98, 0, 104, 0, 102, 0, 98, 0, 100, 0, 104, 0, 102, 0, 109, 0, 106, 0, 102, 0, 104, 0, 109, 0, 6, 0, 67, 0, 10, 0, 6, 0, 63, 0, 67, 0, 26, 0, 87, 0, 30, 0, 26, 0, 83, 0, 87, 0, 46, 0, 107, 0, 50, 0, 46, 0, 103, 0, 107, 0, 24, 0, 77, 0, 20, 0, 24, 0, 81, 0, 77, 0, 38, 0, 99, 0, 42, 0, 38, 0, 95, 0, 99, 0, 3, 0, 56, 0, 0, 0, 3, 0, 59, 0, 56, 0, 18, 0, 79, 0, 22, 0, 18, 0, 75, 0, 79, 0, 44, 0, 97, 0, 40, 0, 44, 0, 101, 0, 97, 0, 16, 0, 69, 0, 12, 0, 16, 0, 73, 0, 69, 0, 36, 0, 89, 0, 32, 0, 36, 0, 93, 0, 89, 0, 10, 0, 71, 0, 14, 0, 10, 0, 67, 0, 71, 0, 30, 0, 91, 0, 34, 0, 30, 0, 87, 0, 91, 0, 8, 0, 61, 0, 4, 0, 8, 0, 65, 0, 61, 0, 28, 0, 81, 0, 24, 0, 28, 0, 85, 0, 81, 0, 48, 0, 101, 0, 44, 0, 48, 0, 105, 0, 101, 0, 1, 0, 63, 0, 6, 0, 1, 0, 58, 0, 63, 0, 22, 0, 83, 0, 26, 0, 22, 0, 79, 0, 83, 0, 42, 0, 103, 0, 46, 0, 42, 0, 99, 0, 103, 0, 20, 0, 73, 0, 16, 0, 20, 0, 77, 0, 73, 0, 40, 0, 93, 0, 36, 0, 40, 0, 97, 0, 93, 0, 51, 0, 110, 0, 53, 0, 51, 0, 108, 0, 110, 0, 14, 0, 75, 0, 18, 0, 14, 0, 71, 0, 75, 0, 34, 0, 95, 0, 38, 0, 34, 0, 91, 0, 95, 0, 12, 0, 65, 0, 8, 0, 12, 0, 69, 0, 65, 0, 32, 0, 85, 0, 28, 0, 32, 0, 89, 0, 85, 0, 54, 0, 105, 0, 48, 0, 54, 0, 111, 0, 105, 0),
+"lods": [0.486218, PackedByteArray(2, 0, 9, 0, 5, 0, 2, 0, 15, 0, 9, 0, 15, 0, 29, 0, 9, 0, 15, 0, 23, 0, 29, 0, 23, 0, 31, 0, 29, 0, 31, 0, 49, 0, 29, 0, 31, 0, 43, 0, 49, 0, 43, 0, 55, 0, 49, 0, 43, 0, 52, 0, 55, 0, 57, 0, 68, 0, 62, 0, 57, 0, 60, 0, 68, 0, 62, 0, 68, 0, 84, 0, 62, 0, 84, 0, 82, 0, 82, 0, 84, 0, 88, 0, 82, 0, 88, 0, 102, 0, 102, 0, 88, 0, 96, 0, 102, 0, 96, 0, 109, 0, 102, 0, 109, 0, 106, 0, 42, 0, 107, 0, 50, 0, 42, 0, 103, 0, 107, 0, 30, 0, 103, 0, 42, 0, 30, 0, 83, 0, 103, 0, 22, 0, 83, 0, 30, 0, 14, 0, 83, 0, 22, 0, 14, 0, 63, 0, 83, 0, 1, 0, 63, 0, 14, 0, 1, 0, 58, 0, 63, 0, 3, 0, 56, 0, 0, 0, 3, 0, 59, 0, 56, 0, 48, 0, 89, 0, 28, 0, 28, 0, 89, 0, 85, 0, 48, 0, 97, 0, 89, 0, 54, 0, 97, 0, 48, 0, 54, 0, 111, 0, 97, 0, 28, 0, 85, 0, 69, 0, 28, 0, 69, 0, 8, 0, 8, 0, 69, 0, 61, 0, 8, 0, 61, 0, 4, 0, 51, 0, 110, 0, 53, 0, 51, 0, 108, 0, 110, 0), 2.39373, PackedByteArray(2, 0, 29, 0, 5, 0, 2, 0, 31, 0, 29, 0, 31, 0, 55, 0, 29, 0, 31, 0, 52, 0, 55, 0, 57, 0, 96, 0, 82, 0, 57, 0, 60, 0, 96, 0, 82, 0, 96, 0, 109, 0, 82, 0, 109, 0, 106, 0, 30, 0, 107, 0, 50, 0, 30, 0, 83, 0, 107, 0, 1, 0, 83, 0, 30, 0, 1, 0, 58, 0, 83, 0, 3, 0, 56, 0, 0, 0, 3, 0, 59, 0, 56, 0, 28, 0, 61, 0, 4, 0, 28, 0, 97, 0, 61, 0, 54, 0, 97, 0, 28, 0, 54, 0, 111, 0, 97, 0, 51, 0, 110, 0, 53, 0, 51, 0, 108, 0, 110, 0)],
+"material": ExtResource("1_e0mcs"),
+"primitive": 3,
+"vertex_count": 112,
+"vertex_data": PackedByteArray(243, 201, 29, 193, 255, 255, 255, 190, 192, 131, 13, 190, 0, 0, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 255, 255, 255, 190, 192, 131, 13, 190, 255, 127, 0, 0, 255, 255, 255, 191, 243, 201, 29, 193, 255, 255, 255, 190, 192, 131, 13, 190, 255, 255, 31, 248, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 192, 131, 13, 190, 0, 0, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 192, 131, 13, 190, 255, 127, 255, 255, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 192, 131, 13, 190, 255, 255, 31, 248, 255, 255, 255, 191, 152, 231, 8, 193, 255, 255, 255, 190, 128, 164, 87, 189, 255, 127, 0, 0, 255, 255, 255, 191, 152, 231, 8, 193, 255, 255, 255, 190, 128, 164, 87, 189, 255, 255, 27, 241, 255, 255, 255, 191, 152, 231, 8, 193, 0, 0, 32, 64, 128, 164, 87, 189, 255, 127, 255, 255, 255, 255, 255, 191, 152, 231, 8, 193, 0, 0, 32, 64, 128, 164, 87, 189, 255, 255, 27, 241, 255, 255, 255, 191, 113, 193, 232, 192, 255, 255, 255, 190, 64, 103, 79, 62, 255, 127, 0, 0, 255, 255, 255, 191, 113, 193, 232, 192, 255, 255, 255, 190, 64, 103, 79, 62, 255, 255, 242, 228, 255, 255, 255, 191, 113, 193, 232, 192, 0, 0, 32, 64, 64, 103, 79, 62, 255, 127, 255, 255, 255, 255, 255, 191, 113, 193, 232, 192, 0, 0, 32, 64, 64, 103, 79, 62, 255, 255, 242, 228, 255, 255, 255, 191, 120, 30, 193, 192, 255, 255, 255, 190, 64, 125, 31, 63, 255, 127, 0, 0, 255, 255, 255, 191, 120, 30, 193, 192, 255, 255, 255, 190, 64, 125, 31, 63, 255, 255, 129, 218, 255, 255, 255, 191, 120, 30, 193, 192, 0, 0, 32, 64, 64, 125, 31, 63, 255, 127, 255, 255, 255, 255, 255, 191, 120, 30, 193, 192, 0, 0, 32, 64, 64, 125, 31, 63, 255, 255, 129, 218, 255, 255, 255, 191, 228, 147, 155, 192, 255, 255, 255, 190, 64, 204, 153, 63, 255, 127, 0, 0, 255, 255, 255, 191, 228, 147, 155, 192, 255, 255, 255, 190, 64, 204, 153, 63, 255, 255, 37, 209, 255, 255, 255, 191, 228, 147, 155, 192, 0, 0, 32, 64, 64, 204, 153, 63, 255, 127, 255, 255, 255, 255, 255, 191, 228, 147, 155, 192, 0, 0, 32, 64, 64, 204, 153, 63, 255, 255, 37, 209, 255, 255, 255, 191, 78, 140, 113, 192, 255, 255, 255, 190, 104, 209, 246, 63, 255, 127, 0, 0, 255, 255, 255, 191, 78, 140, 113, 192, 255, 255, 255, 190, 104, 209, 246, 63, 255, 255, 108, 200, 255, 255, 255, 191, 78, 140, 113, 192, 0, 0, 32, 64, 104, 209, 246, 63, 255, 127, 255, 255, 255, 255, 255, 191, 78, 140, 113, 192, 0, 0, 32, 64, 104, 209, 246, 63, 255, 255, 108, 200, 255, 255, 255, 191, 100, 155, 50, 192, 255, 255, 255, 190, 86, 155, 50, 64, 255, 127, 0, 0, 255, 255, 255, 191, 100, 155, 50, 192, 255, 255, 255, 190, 86, 155, 50, 64, 255, 255, 255, 191, 255, 255, 255, 191, 100, 155, 50, 192, 0, 0, 32, 64, 86, 155, 50, 64, 255, 127, 255, 255, 255, 255, 255, 191, 100, 155, 50, 192, 0, 0, 32, 64, 86, 155, 50, 64, 255, 255, 255, 191, 255, 255, 255, 191, 126, 209, 246, 191, 255, 255, 255, 190, 60, 140, 113, 64, 255, 127, 0, 0, 255, 255, 255, 191, 126, 209, 246, 191, 255, 255, 255, 190, 60, 140, 113, 64, 255, 255, 146, 183, 255, 255, 255, 191, 126, 209, 246, 191, 0, 0, 32, 64, 60, 140, 113, 64, 255, 127, 255, 255, 255, 255, 255, 191, 126, 209, 246, 191, 0, 0, 32, 64, 60, 140, 113, 64, 255, 255, 146, 183, 255, 255, 255, 191, 72, 204, 153, 191, 255, 255, 255, 190, 218, 147, 155, 64, 255, 127, 0, 0, 255, 255, 255, 191, 72, 204, 153, 191, 255, 255, 255, 190, 218, 147, 155, 64, 255, 255, 217, 174, 255, 255, 255, 191, 72, 204, 153, 191, 0, 0, 32, 64, 218, 147, 155, 64, 255, 127, 255, 255, 255, 255, 255, 191, 72, 204, 153, 191, 0, 0, 32, 64, 218, 147, 155, 64, 255, 255, 217, 174, 255, 255, 255, 191, 64, 125, 31, 191, 255, 255, 255, 190, 108, 30, 193, 64, 255, 127, 0, 0, 255, 255, 255, 191, 64, 125, 31, 191, 255, 255, 255, 190, 108, 30, 193, 64, 255, 255, 125, 165, 255, 255, 255, 191, 64, 125, 31, 191, 0, 0, 32, 64, 108, 30, 193, 64, 255, 127, 255, 255, 255, 255, 255, 191, 64, 125, 31, 191, 0, 0, 32, 64, 108, 30, 193, 64, 255, 255, 125, 165, 255, 255, 255, 191, 0, 103, 79, 190, 255, 255, 255, 190, 100, 193, 232, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 103, 79, 190, 255, 255, 255, 190, 100, 193, 232, 64, 255, 255, 11, 155, 255, 255, 255, 191, 0, 103, 79, 190, 0, 0, 32, 64, 100, 193, 232, 64, 255, 127, 255, 255, 255, 255, 255, 191, 0, 103, 79, 190, 0, 0, 32, 64, 100, 193, 232, 64, 255, 255, 11, 155, 255, 255, 255, 191, 0, 167, 87, 61, 255, 255, 255, 190, 147, 231, 8, 65, 255, 127, 0, 0, 255, 255, 255, 191, 0, 167, 87, 61, 255, 255, 255, 190, 147, 231, 8, 65, 255, 255, 227, 142, 255, 255, 255, 191, 0, 167, 87, 61, 0, 0, 32, 64, 147, 231, 8, 65, 255, 127, 255, 255, 255, 255, 255, 191, 0, 167, 87, 61, 0, 0, 32, 64, 147, 231, 8, 65, 255, 255, 227, 142, 255, 255, 255, 191, 192, 132, 13, 62, 255, 255, 255, 190, 238, 201, 29, 65, 255, 127, 0, 0, 255, 255, 255, 191, 192, 132, 13, 62, 255, 255, 255, 190, 238, 201, 29, 65, 255, 127, 255, 127, 255, 255, 255, 191, 192, 132, 13, 62, 255, 255, 255, 190, 238, 201, 29, 65, 255, 255, 222, 135, 255, 255, 255, 191, 192, 132, 13, 62, 0, 0, 32, 64, 238, 201, 29, 65, 255, 127, 255, 127, 255, 255, 255, 191, 192, 132, 13, 62, 0, 0, 32, 64, 238, 201, 29, 65, 255, 127, 255, 255, 255, 255, 255, 191, 192, 132, 13, 62, 0, 0, 32, 64, 238, 201, 29, 65, 255, 255, 222, 135, 255, 255, 255, 191, 243, 201, 29, 193, 254, 255, 255, 190, 15, 159, 92, 63, 0, 0, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 254, 255, 255, 190, 15, 159, 92, 63, 32, 120, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 254, 255, 255, 190, 15, 159, 92, 63, 255, 127, 0, 0, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 15, 159, 92, 63, 0, 0, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 15, 159, 92, 63, 32, 120, 255, 127, 255, 255, 255, 191, 243, 201, 29, 193, 0, 0, 32, 64, 15, 159, 92, 63, 255, 127, 255, 255, 255, 255, 255, 191, 58, 254, 10, 193, 255, 255, 255, 190, 14, 85, 112, 63, 27, 113, 255, 127, 255, 255, 255, 191, 58, 254, 10, 193, 255, 255, 255, 190, 14, 85, 112, 63, 255, 127, 0, 0, 255, 255, 255, 191, 58, 254, 10, 193, 0, 0, 32, 64, 14, 85, 112, 63, 27, 113, 255, 127, 255, 255, 255, 191, 58, 254, 10, 193, 0, 0, 32, 64, 14, 85, 112, 63, 255, 127, 255, 255, 255, 255, 255, 191, 175, 9, 241, 192, 255, 255, 255, 190, 94, 144, 149, 63, 243, 100, 255, 127, 255, 255, 255, 191, 175, 9, 241, 192, 255, 255, 255, 190, 94, 144, 149, 63, 255, 127, 0, 0, 255, 255, 255, 191, 175, 9, 241, 192, 0, 0, 32, 64, 94, 144, 149, 63, 243, 100, 255, 127, 255, 255, 255, 191, 175, 9, 241, 192, 0, 0, 32, 64, 94, 144, 149, 63, 255, 127, 255, 255, 255, 255, 255, 191, 104, 93, 205, 192, 255, 255, 255, 190, 80, 0, 198, 63, 129, 90, 255, 127, 255, 255, 255, 191, 104, 93, 205, 192, 255, 255, 255, 190, 80, 0, 198, 63, 255, 127, 0, 0, 255, 255, 255, 191, 104, 93, 205, 192, 0, 0, 32, 64, 80, 0, 198, 63, 129, 90, 255, 127, 255, 255, 255, 191, 104, 93, 205, 192, 0, 0, 32, 64, 80, 0, 198, 63, 255, 127, 255, 255, 255, 255, 255, 191, 227, 147, 171, 192, 255, 255, 255, 190, 23, 83, 4, 64, 37, 81, 255, 127, 255, 255, 255, 191, 227, 147, 171, 192, 255, 255, 255, 190, 23, 83, 4, 64, 255, 127, 0, 0, 255, 255, 255, 191, 227, 147, 171, 192, 0, 0, 32, 64, 23, 83, 4, 64, 37, 81, 255, 127, 255, 255, 255, 191, 227, 147, 171, 192, 0, 0, 32, 64, 23, 83, 4, 64, 255, 127, 255, 255, 255, 255, 255, 191, 32, 65, 140, 192, 255, 255, 255, 190, 2, 47, 46, 64, 108, 72, 255, 127, 255, 255, 255, 191, 32, 65, 140, 192, 255, 255, 255, 190, 2, 47, 46, 64, 255, 127, 0, 0, 255, 255, 255, 191, 32, 65, 140, 192, 0, 0, 32, 64, 2, 47, 46, 64, 108, 72, 255, 127, 255, 255, 255, 191, 32, 65, 140, 192, 0, 0, 32, 64, 2, 47, 46, 64, 255, 127, 255, 255, 255, 255, 255, 191, 160, 220, 95, 192, 255, 255, 255, 190, 148, 220, 95, 64, 255, 63, 255, 127, 255, 255, 255, 191, 160, 220, 95, 192, 255, 255, 255, 190, 148, 220, 95, 64, 255, 127, 0, 0, 255, 255, 255, 191, 160, 220, 95, 192, 0, 0, 32, 64, 148, 220, 95, 64, 255, 63, 255, 127, 255, 255, 255, 191, 160, 220, 95, 192, 0, 0, 32, 64, 148, 220, 95, 64, 255, 127, 255, 255, 255, 255, 255, 191, 11, 47, 46, 192, 255, 255, 255, 190, 24, 65, 140, 64, 146, 55, 255, 127, 255, 255, 255, 191, 11, 47, 46, 192, 255, 255, 255, 190, 24, 65, 140, 64, 255, 127, 0, 0, 255, 255, 255, 191, 11, 47, 46, 192, 0, 0, 32, 64, 24, 65, 140, 64, 146, 55, 255, 127, 255, 255, 255, 191, 11, 47, 46, 192, 0, 0, 32, 64, 24, 65, 140, 64, 255, 127, 255, 255, 255, 255, 255, 191, 25, 83, 4, 192, 255, 255, 255, 190, 219, 147, 171, 64, 217, 46, 255, 127, 255, 255, 255, 191, 25, 83, 4, 192, 255, 255, 255, 190, 219, 147, 171, 64, 255, 127, 0, 0, 255, 255, 255, 191, 25, 83, 4, 192, 0, 0, 32, 64, 219, 147, 171, 64, 217, 46, 255, 127, 255, 255, 255, 191, 25, 83, 4, 192, 0, 0, 32, 64, 219, 147, 171, 64, 255, 127, 255, 255, 255, 255, 255, 191, 78, 0, 198, 191, 255, 255, 255, 190, 94, 93, 205, 64, 125, 37, 255, 127, 255, 255, 255, 191, 78, 0, 198, 191, 255, 255, 255, 190, 94, 93, 205, 64, 255, 127, 0, 0, 255, 255, 255, 191, 78, 0, 198, 191, 0, 0, 32, 64, 94, 93, 205, 64, 125, 37, 255, 127, 255, 255, 255, 191, 78, 0, 198, 191, 0, 0, 32, 64, 94, 93, 205, 64, 255, 127, 255, 255, 255, 255, 255, 191, 84, 144, 149, 191, 255, 255, 255, 190, 164, 9, 241, 64, 12, 27, 255, 127, 255, 255, 255, 191, 84, 144, 149, 191, 255, 255, 255, 190, 164, 9, 241, 64, 255, 127, 0, 0, 255, 255, 255, 191, 84, 144, 149, 191, 0, 0, 32, 64, 164, 9, 241, 64, 12, 27, 255, 127, 255, 255, 255, 191, 84, 144, 149, 191, 0, 0, 32, 64, 164, 9, 241, 64, 255, 127, 255, 255, 255, 255, 255, 191, 229, 84, 112, 191, 255, 255, 255, 190, 54, 254, 10, 65, 227, 14, 255, 127, 255, 255, 255, 191, 229, 84, 112, 191, 255, 255, 255, 190, 54, 254, 10, 65, 255, 127, 0, 0, 255, 255, 255, 191, 229, 84, 112, 191, 0, 0, 32, 64, 54, 254, 10, 65, 227, 14, 255, 127, 255, 255, 255, 191, 229, 84, 112, 191, 0, 0, 32, 64, 54, 254, 10, 65, 255, 127, 255, 255, 255, 255, 255, 191, 46, 159, 92, 191, 254, 255, 255, 190, 241, 201, 29, 65, 223, 7, 255, 127, 255, 255, 255, 191, 46, 159, 92, 191, 254, 255, 255, 190, 241, 201, 29, 65, 255, 127, 0, 0, 255, 255, 255, 191, 46, 159, 92, 191, 254, 255, 255, 190, 241, 201, 29, 65, 255, 127, 255, 127, 255, 255, 255, 191, 46, 159, 92, 191, 0, 0, 32, 64, 241, 201, 29, 65, 223, 7, 255, 127, 255, 255, 255, 191, 46, 159, 92, 191, 0, 0, 32, 64, 241, 201, 29, 65, 255, 127, 255, 127, 255, 255, 255, 191, 46, 159, 92, 191, 0, 0, 32, 64, 241, 201, 29, 65, 255, 127, 255, 255, 255, 255, 255, 191)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_bfq01")
diff --git a/assets/meshes/walls/x_wall.tres b/assets/meshes/walls/x_wall.tres
new file mode 100644
index 0000000..1498008
--- /dev/null
+++ b/assets/meshes/walls/x_wall.tres
@@ -0,0 +1,33 @@
+[gd_resource type="ArrayMesh" load_steps=3 format=3 uid="uid://b7vu2ekwlvagf"]
+
+[ext_resource type="Material" uid="uid://dd3673p284fqe" path="res://assets/mats/wall.tres" id="1_qlmot"]
+
+[sub_resource type="ArrayMesh" id="ArrayMesh_odwpc"]
+_surfaces = [{
+"aabb": AABB(3.5, -0.5, -5, 2.5, 3, 10),
+"format": 4097,
+"index_count": 96,
+"index_data": PackedByteArray(5, 0, 0, 0, 4, 0, 5, 0, 1, 0, 0, 0, 11, 0, 7, 0, 14, 0, 11, 0, 6, 0, 7, 0, 2, 0, 9, 0, 3, 0, 2, 0, 8, 0, 9, 0, 1, 0, 6, 0, 0, 0, 1, 0, 7, 0, 6, 0, 8, 0, 15, 0, 9, 0, 8, 0, 10, 0, 15, 0, 3, 0, 4, 0, 2, 0, 3, 0, 5, 0, 4, 0, 4, 0, 8, 0, 2, 0, 4, 0, 10, 0, 8, 0, 6, 0, 4, 0, 0, 0, 11, 0, 4, 0, 6, 0, 4, 0, 12, 0, 10, 0, 13, 0, 4, 0, 11, 0, 4, 0, 13, 0, 12, 0, 15, 0, 3, 0, 9, 0, 5, 0, 7, 0, 1, 0, 5, 0, 14, 0, 7, 0, 15, 0, 5, 0, 3, 0, 17, 0, 5, 0, 15, 0, 5, 0, 16, 0, 14, 0, 16, 0, 5, 0, 17, 0, 14, 0, 13, 0, 11, 0, 14, 0, 16, 0, 13, 0, 16, 0, 12, 0, 13, 0, 16, 0, 17, 0, 12, 0, 17, 0, 10, 0, 12, 0, 17, 0, 15, 0, 10, 0),
+"lods": [0.437443, PackedByteArray(5, 0, 0, 0, 4, 0, 5, 0, 1, 0, 0, 0, 3, 0, 5, 0, 4, 0, 3, 0, 4, 0, 2, 0, 13, 0, 7, 0, 15, 0, 13, 0, 6, 0, 7, 0, 8, 0, 13, 0, 15, 0, 8, 0, 15, 0, 9, 0, 2, 0, 9, 0, 3, 0, 2, 0, 8, 0, 9, 0, 1, 0, 6, 0, 0, 0, 1, 0, 7, 0, 6, 0, 4, 0, 8, 0, 2, 0, 4, 0, 13, 0, 8, 0, 13, 0, 4, 0, 6, 0, 6, 0, 4, 0, 0, 0, 15, 0, 3, 0, 9, 0, 15, 0, 5, 0, 3, 0, 5, 0, 15, 0, 7, 0, 5, 0, 7, 0, 1, 0)],
+"primitive": 3,
+"vertex_count": 18,
+"vertex_data": PackedByteArray(0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 192, 2, 0, 96, 64, 0, 0, 0, 191, 0, 0, 0, 128, 2, 0, 96, 64, 0, 0, 32, 64, 0, 0, 0, 128, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 64, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 192, 19, 13, 155, 64, 0, 0, 0, 191, 241, 88, 147, 191, 19, 13, 155, 64, 0, 0, 0, 191, 240, 88, 147, 63, 144, 1, 151, 64, 0, 0, 0, 191, 74, 187, 215, 190, 144, 1, 151, 64, 0, 0, 0, 191, 72, 187, 215, 62, 19, 13, 155, 64, 0, 0, 32, 64, 241, 88, 147, 63, 19, 13, 155, 64, 0, 0, 32, 64, 240, 88, 147, 191, 144, 1, 151, 64, 0, 0, 32, 64, 74, 187, 215, 62, 144, 1, 151, 64, 0, 0, 32, 64, 72, 187, 215, 190)
+}]
+blend_shape_mode = 0
+
+[resource]
+resource_name = "x_wall_Cube001"
+_surfaces = [{
+"aabb": AABB(3.5, -0.5, -5, 2.5, 3, 10),
+"attribute_data": PackedByteArray(0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 192, 62, 0, 0, 32, 63, 0, 0, 192, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 32, 63, 0, 0, 128, 62, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 192, 62, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 32, 63, 0, 0, 0, 63, 0, 0, 192, 62, 24, 188, 206, 62, 0, 0, 192, 62, 24, 188, 206, 62, 0, 0, 192, 62, 232, 67, 177, 62, 0, 0, 192, 62, 232, 67, 177, 62, 0, 0, 192, 62, 36, 184, 197, 62, 0, 0, 192, 62, 36, 184, 197, 62, 0, 0, 192, 62, 220, 71, 186, 62, 1, 0, 192, 62, 198, 210, 187, 62, 0, 0, 32, 63, 232, 67, 177, 62, 0, 0, 32, 63, 232, 67, 177, 62, 0, 0, 32, 63, 24, 188, 206, 62, 0, 0, 32, 63, 24, 188, 206, 62, 0, 0, 32, 63, 222, 71, 186, 62, 0, 0, 32, 63, 222, 71, 186, 62, 0, 0, 32, 63, 56, 45, 196, 62, 0, 0, 32, 63, 36, 184, 197, 62, 0, 0, 32, 63, 0, 0, 192, 62),
+"format": 4119,
+"index_count": 96,
+"index_data": PackedByteArray(16, 0, 0, 0, 13, 0, 16, 0, 3, 0, 0, 0, 33, 0, 23, 0, 39, 0, 33, 0, 20, 0, 23, 0, 8, 0, 27, 0, 10, 0, 8, 0, 25, 0, 27, 0, 4, 0, 19, 0, 2, 0, 4, 0, 21, 0, 19, 0, 26, 0, 41, 0, 29, 0, 26, 0, 31, 0, 41, 0, 9, 0, 12, 0, 6, 0, 9, 0, 15, 0, 12, 0, 14, 0, 24, 0, 7, 0, 14, 0, 30, 0, 24, 0, 18, 0, 14, 0, 1, 0, 32, 0, 14, 0, 18, 0, 14, 0, 34, 0, 30, 0, 37, 0, 14, 0, 32, 0, 14, 0, 37, 0, 34, 0, 40, 0, 11, 0, 28, 0, 17, 0, 22, 0, 5, 0, 17, 0, 38, 0, 22, 0, 40, 0, 17, 0, 11, 0, 44, 0, 17, 0, 40, 0, 17, 0, 42, 0, 38, 0, 42, 0, 17, 0, 44, 0, 39, 0, 36, 0, 33, 0, 39, 0, 43, 0, 36, 0, 43, 0, 35, 0, 36, 0, 43, 0, 45, 0, 35, 0, 45, 0, 31, 0, 35, 0, 45, 0, 41, 0, 31, 0),
+"lods": [0.437443, PackedByteArray(46, 0, 0, 0, 12, 0, 46, 0, 3, 0, 0, 0, 9, 0, 46, 0, 12, 0, 9, 0, 12, 0, 6, 0, 36, 0, 23, 0, 41, 0, 36, 0, 20, 0, 23, 0, 26, 0, 36, 0, 41, 0, 26, 0, 41, 0, 29, 0, 8, 0, 27, 0, 10, 0, 8, 0, 25, 0, 27, 0, 4, 0, 19, 0, 2, 0, 4, 0, 21, 0, 19, 0, 14, 0, 24, 0, 7, 0, 14, 0, 37, 0, 24, 0, 37, 0, 14, 0, 18, 0, 18, 0, 14, 0, 1, 0, 40, 0, 11, 0, 28, 0, 40, 0, 17, 0, 11, 0, 17, 0, 40, 0, 22, 0, 17, 0, 22, 0, 5, 0)],
+"material": ExtResource("1_qlmot"),
+"primitive": 3,
+"vertex_count": 47,
+"vertex_data": PackedByteArray(0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 136, 29, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 136, 29, 255, 127, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 0, 0, 136, 157, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 192, 0, 0, 136, 157, 255, 127, 0, 0, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 192, 255, 255, 255, 255, 255, 255, 255, 191, 0, 0, 160, 64, 0, 0, 32, 64, 0, 0, 160, 192, 255, 127, 255, 255, 255, 255, 255, 191, 2, 0, 96, 64, 0, 0, 0, 191, 0, 0, 0, 128, 0, 0, 136, 157, 255, 127, 0, 0, 2, 0, 96, 64, 0, 0, 0, 191, 0, 0, 0, 128, 136, 29, 255, 127, 255, 127, 0, 0, 2, 0, 96, 64, 0, 0, 0, 191, 0, 0, 0, 128, 255, 127, 0, 0, 8, 247, 255, 191, 2, 0, 96, 64, 0, 0, 32, 64, 0, 0, 0, 128, 0, 0, 136, 157, 255, 127, 0, 0, 2, 0, 96, 64, 0, 0, 32, 64, 0, 0, 0, 128, 136, 29, 255, 127, 255, 127, 0, 0, 2, 0, 96, 64, 0, 0, 32, 64, 0, 0, 0, 128, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 64, 255, 255, 136, 157, 255, 127, 255, 255, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 64, 255, 127, 255, 127, 255, 255, 255, 63, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 64, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 64, 255, 255, 136, 157, 255, 127, 255, 255, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 127, 0, 0, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 192, 255, 255, 255, 255, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 0, 191, 0, 0, 160, 192, 118, 226, 255, 127, 255, 127, 255, 255, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 192, 255, 255, 255, 255, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 192, 255, 127, 255, 255, 255, 255, 255, 191, 0, 0, 192, 64, 0, 0, 32, 64, 0, 0, 160, 192, 118, 226, 255, 127, 255, 127, 255, 255, 19, 13, 155, 64, 0, 0, 0, 191, 241, 88, 147, 191, 255, 127, 0, 0, 255, 255, 255, 191, 19, 13, 155, 64, 0, 0, 0, 191, 241, 88, 147, 191, 149, 231, 255, 127, 255, 127, 255, 255, 19, 13, 155, 64, 0, 0, 0, 191, 240, 88, 147, 63, 255, 127, 0, 0, 243, 242, 255, 191, 19, 13, 155, 64, 0, 0, 0, 191, 240, 88, 147, 63, 255, 255, 105, 152, 255, 127, 255, 255, 144, 1, 151, 64, 0, 0, 0, 191, 74, 187, 215, 190, 255, 127, 0, 0, 115, 249, 255, 191, 144, 1, 151, 64, 0, 0, 0, 191, 74, 187, 215, 190, 222, 245, 255, 127, 255, 127, 254, 255, 144, 1, 151, 64, 0, 0, 0, 191, 72, 187, 215, 62, 255, 255, 32, 138, 255, 127, 254, 255, 144, 1, 151, 64, 0, 0, 0, 191, 72, 187, 215, 62, 255, 127, 0, 0, 77, 245, 255, 191, 19, 13, 155, 64, 0, 0, 32, 64, 241, 88, 147, 63, 255, 127, 255, 255, 255, 255, 255, 191, 19, 13, 155, 64, 0, 0, 32, 64, 241, 88, 147, 63, 255, 255, 105, 152, 255, 127, 254, 255, 19, 13, 155, 64, 0, 0, 32, 64, 240, 88, 147, 191, 255, 127, 255, 255, 255, 255, 255, 191, 19, 13, 155, 64, 0, 0, 32, 64, 240, 88, 147, 191, 149, 231, 255, 127, 255, 127, 255, 255, 144, 1, 151, 64, 0, 0, 32, 64, 74, 187, 215, 62, 255, 127, 255, 255, 255, 255, 255, 191, 144, 1, 151, 64, 0, 0, 32, 64, 74, 187, 215, 62, 255, 255, 32, 138, 255, 127, 254, 255, 144, 1, 151, 64, 0, 0, 32, 64, 72, 187, 215, 190, 255, 127, 255, 255, 255, 255, 255, 191, 144, 1, 151, 64, 0, 0, 32, 64, 72, 187, 215, 190, 222, 245, 255, 127, 255, 127, 255, 255, 2, 0, 96, 64, 0, 0, 32, 64, 0, 0, 0, 128, 162, 11, 255, 127, 255, 127, 0, 0)
+}]
+blend_shape_mode = 0
+shadow_mesh = SubResource("ArrayMesh_odwpc")
diff --git a/assets/sounds/plonk.ogg b/assets/sounds/plonk.ogg
new file mode 100644
index 0000000..647e678
--- /dev/null
+++ b/assets/sounds/plonk.ogg
Binary files differ
diff --git a/assets/sounds/plonk.ogg.import b/assets/sounds/plonk.ogg.import
new file mode 100644
index 0000000..612582f
--- /dev/null
+++ b/assets/sounds/plonk.ogg.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://bvtxqrhkbai7x"
+path="res://.godot/imported/plonk.ogg-e4d61f1dbd79b41fcba0cbca804fdb61.oggvorbisstr"
+
+[deps]
+
+source_file="res://assets/sounds/plonk.ogg"
+dest_files=["res://.godot/imported/plonk.ogg-e4d61f1dbd79b41fcba0cbca804fdb61.oggvorbisstr"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/assets/textures/wall.png b/assets/textures/wall.png
index f1681d2..b9465a9 100644
--- a/assets/textures/wall.png
+++ b/assets/textures/wall.png
Binary files differ
diff --git a/classes/block.gd b/classes/block.gd
new file mode 100644
index 0000000..c630727
--- /dev/null
+++ b/classes/block.gd
@@ -0,0 +1,87 @@
+@tool
+extends StaticBody3D
+class_name Block
+
+## A Block that goes in a [TrackObject] to be placed by a [TrackLoader].
+
+## [code]true[/code] if this block in the editor.
+var editor := false
+## [code]true[/code] if this block is being photographed.
+var making_thumbnail := false
+## The current material.
+var mat := default_mat()
+
+## A dictionary storing the walls.
+## Dictionary[int, Wall]
+var walls := {
+ WALL_W: null, # z-
+ WALL_E: null, # z+
+ WALL_S: null, # x-
+ WALL_N: null, # x+
+}
+
+const WALL_W := 1
+const WALL_E := 2
+const WALL_S := 4
+const WALL_N := 8
+const STRING := {
+ WALL_W: "west",
+ WALL_E: "east",
+ WALL_S: "south",
+ WALL_N: "north",
+}
+const ITER := [WALL_W, WALL_E, WALL_S, WALL_N]
+
+func _ready() -> void:
+ if Engine.is_editor_hint():
+ return
+ if editor:
+ collision_layer = Globals.DEFAULT_EDITOR_LAYER
+ if not making_thumbnail:
+ var cam := get_node_or_null(^"camera")
+ if cam:
+ cam.queue_free()
+ input_ray_pickable = false
+
+# helpers
+
+func has_wall(w: int) -> bool: return has_walls(w, true) & w
+func remove_wall(w: int) -> void: remove_walls(w, true)
+func make_wall(w: int) -> void: make_walls(w, true)
+
+# virtual functions
+
+## Gets the [AABB] of this block.
+func get_aabb() -> AABB: return AABB()
+## Makes this block visually highlighted. See also [method un_highlight].
+func highlight() -> void: pass
+## Reverses [method highlight].
+func un_highlight() -> void: pass
+## Get the wall mode.
+## Returns a flag. see [const WALL_W].
+func get_wall_mode() -> int: return 0
+func make_walls(_w: int, _singular := false) -> void: pass
+func remove_walls(w: int, singular := false) -> void:
+ for wall in walls:
+ if w & wall:
+ if not is_instance_valid(walls[wall]):
+ push_error("wall doesnt exist!")
+ return
+ walls[wall].queue_free()
+ if singular:
+ return
+func has_walls(w := WALL_W | WALL_E | WALL_N | WALL_S, singular := false) -> int:
+ var has := 0
+ for wall in walls:
+ if w & wall:
+ if is_instance_valid(walls[wall]):
+ if singular:
+ return wall
+ has |= wall
+ elif singular:
+ return 0
+ return has
+## Can this block be painted? (TODO)
+func materials_allowed() -> int: return 0
+func default_mat() -> int: return 0
+func set_mat(_mat_id: int) -> void: pass
diff --git a/classes/booster.gd b/classes/booster.gd
new file mode 100644
index 0000000..7ed3de7
--- /dev/null
+++ b/classes/booster.gd
@@ -0,0 +1,7 @@
+@tool
+class_name Booster
+extends Platform3D
+
+## Reset the animation
+func sync() -> void:
+ %animator.seek(0, true)
diff --git a/classes/car.gd b/classes/car.gd
index 6c0cd87..bbb3164 100644
--- a/classes/car.gd
+++ b/classes/car.gd
@@ -3,6 +3,7 @@ class_name Car
@export var STEER_SPEED := 1.0
@export var steer_curve: Curve = preload("res://assets/cars/kenney_sedan/steer_curve.tres")
+const sparks := preload("res://assets/cars/sparks.tscn")
var steer_target := 0.0
@@ -11,7 +12,8 @@ var steer_target := 0.0
@export var reverse_ratio := -2.5
@export var final_drive_ratio := 3.38
@export var max_engine_rpm := 8000.0
-@export var gear_shift_time = 0.3
+@export var gear_shift_time := 0.3
+@export var BOOSTER_FORCE := 25000
@export var power_curve: Curve = preload("res://assets/cars/kenney_sedan/power_curve.tres")
@onready var body_mesh := $body as MeshInstance3D
@onready var checkpoint_sound := $checkpoint as AudioStreamPlayer
@@ -55,6 +57,8 @@ func reset() -> void:
gear_timer = 0
clutch_position = 0
steering = 0
+ angular_damp = 0
+ linear_damp = 0
throttle = 0
engine_force = 0
brake = MAX_BRAKE_FORCE
@@ -92,7 +96,7 @@ func steer(to: float) -> void:
else:
to = -steer_curve.sample_baked(-to) if to < 0.0 else steer_curve.sample_baked(to)
- steer_target = clampf(lerpf(steer_target, to, 10 * get_physics_process_delta_time()), -1, 1) * .75
+ steer_target = clampf(lerpf(steer_target, to, 10 * get_physics_process_delta_time()), -1, 1) * .9
## virtual
func shift_down() -> bool:
@@ -124,7 +128,7 @@ func _process(delta: float):
if can_shift:
_process_gear_inputs(delta)
steering = -steer_target
- body_mesh.rotation.z = lerp(body_mesh.rotation.z, clampf(((-steering * .001) * whl_rpm()) + randf_range(-0.05,0.05), -.4, .4), 10 * delta)
+ body_mesh.rotation.z = lerp(body_mesh.rotation.z, clampf((-steering * .001 + randf_range(-0.0005,0.0005)) * whl_rpm(), -.3, .3), 2 * delta)
engine_rpm = clampf(move_toward(engine_rpm, (wheel_rpm * engine_force * 0.0015), 800), 800, MAX_ENGINE_FORCE)
func limit(delta: float) -> void:
@@ -147,6 +151,11 @@ func _physics_process(delta: float):
downforce(5)
for i in 4:
+ if wheels[i].get_contact_body() is Booster:
+ apply_central_force(
+ (wheels[i].get_contact_body().transform.basis.x) * BOOSTER_FORCE
+ )
+
particles[i].emitting = wheels[i].get_skidinfo() < (.2 if i > 2 else .99) and wheels[i].is_in_contact() and kph() > 30
if particles[i].emitting:
@warning_ignore("narrowing_conversion")
@@ -154,7 +163,7 @@ func _physics_process(delta: float):
if !skids[i][-1].active:
skids[i].append(trail_scene.instantiate() as Trail3D)
get_parent().add_child(skids[i][-1])
- (skids[i][-1] as Trail3D).add(wheels[i].global_position - Vector3(0, .661, 0))
+ (skids[i][-1] as Trail3D).add(wheels[i].global_position - Vector3(0, .561, 0))
elif skids[i][-1].active:
skids[i][-1].active = false
@@ -162,3 +171,16 @@ func start() -> void:
brake = 0
can_shift = true
can_accelerate = true
+
+func _integrate_forces(state: PhysicsDirectBodyState3D) -> void:
+ if kph() < 100:
+ return
+ var contact := state.get_contact_count()
+ while contact > 0:
+ contact -= 1
+ var p := state.get_contact_local_position(contact) # it says local, but its global.
+ var direction := state.get_contact_local_normal(contact)
+ var sprk := sparks.instantiate()
+ (sprk.process_material as ParticleProcessMaterial).direction = direction
+ get_parent().add_child(sprk)
+ sprk.global_position = p
diff --git a/classes/checkpoint.gd b/classes/checkpoint.gd
index 468f38c..eef61aa 100644
--- a/classes/checkpoint.gd
+++ b/classes/checkpoint.gd
@@ -1,9 +1,22 @@
-extends PathFollow3D
+extends Block
class_name CheckPoint
signal collected
-@export var needs_collision := true
+@export var player_detector: Area3D
-func enter() -> void:
- collected.emit()
+func enter(_var = null):
+ collected.emit()
+
+func _ready() -> void:
+ super()
+ if editor:
+ player_detector.queue_free()
+ else:
+ player_detector.body_entered.connect(enter)
+
+@export var mesh: MeshInstance3D # i want traits (tho macros would be good 2)
+
+func un_highlight(): mesh.set_surface_override_material(0, MatMap.map[mat])
+func highlight() -> void: mesh.set_surface_override_material(0, MatMap.get_highlight(mat))
+func default_mat(): return 8
diff --git a/classes/decoration.gd b/classes/decoration.gd
new file mode 100644
index 0000000..4cfb942
--- /dev/null
+++ b/classes/decoration.gd
@@ -0,0 +1,6 @@
+extends Block
+class_name Decoration
+
+## Unthemeable type of block.
+
+func materials_allowed() -> int: return 0x0
diff --git a/classes/finish.gd b/classes/finish.gd
index d7c9eb9..3b57a69 100644
--- a/classes/finish.gd
+++ b/classes/finish.gd
@@ -1,9 +1,22 @@
-extends PathFollow3D
+extends Block
class_name Finish
signal collected
-@export var needs_collision := true
+@export var player_detector: Area3D
-func enter() -> void:
- collected.emit() \ No newline at end of file
+func enter(_var = null):
+ collected.emit()
+
+func _ready() -> void:
+ super()
+ if editor:
+ player_detector.queue_free()
+ else:
+ player_detector.body_entered.connect(enter)
+
+@export var mesh: MeshInstance3D
+
+func un_highlight(): mesh.set_surface_override_material(0, MatMap.map[mat])
+func highlight() -> void: mesh.set_surface_override_material(0, MatMap.get_highlight(mat))
+func default_mat(): return 16
diff --git a/classes/ghost.gd b/classes/ghost.gd
index 674436e..93df69c 100644
--- a/classes/ghost.gd
+++ b/classes/ghost.gd
@@ -3,7 +3,7 @@ class_name GhostCar
@onready var wheels: Array[Node3D] = [$bl as Node3D, $br as Node3D, $fr as Node3D, $fl as Node3D]
@onready var body_mesh: MeshInstance3D = $body
-@onready var engine: AudioStreamPlayer3D = $Engine
+@onready var engine: EngineNoise = $Engine
const trail_scene = preload("res://scenes/trail.tscn")
const inactive = {active = false};
@@ -57,7 +57,7 @@ func update(car_vars: PackedFloat32Array, delta: float) -> void:
if !skids[i][-1].active:
skids[i].append(trail_scene.instantiate() as Trail3D)
get_parent().add_child(skids[i][-1])
- (skids[i][-1] as Trail3D).add(to_global(CarVars.arr2vec(v, CarVars.WHEEL_POSITION_START + (i * 3))) - Vector3(0, .661, 0))
+ (skids[i][-1] as Trail3D).add(to_global(CarVars.arr2vec(v, CarVars.WHEEL_POSITION_START + (i * 3))) - Vector3(0, .561, 0))
elif skids[i][-1].active:
skids[i][-1].active = false
diff --git a/classes/platform.gd b/classes/platform.gd
new file mode 100644
index 0000000..5b86671
--- /dev/null
+++ b/classes/platform.gd
@@ -0,0 +1,104 @@
+@tool
+class_name Platform3D
+extends Block
+
+@export var mesh: MeshInstance3D
+
+var west_wall_scene: PackedScene
+var east_wall_scene: PackedScene
+var south_wall_scene: PackedScene
+var north_wall_scene: PackedScene
+
+func wall_scenes() -> Dictionary:
+ return {
+ WALL_W: west_wall_scene,
+ WALL_E: east_wall_scene,
+ WALL_S: south_wall_scene,
+ WALL_N: north_wall_scene,
+ }
+
+func wall_transforms() -> Dictionary:
+ return {
+ WALL_W: west_wall_transform,
+ WALL_E: east_wall_transform,
+ WALL_S: south_wall_transform,
+ WALL_N: north_wall_transform,
+ }
+
+var west_wall_transform: Transform3D = Transform3D(Basis(), Vector3()):
+ set(wt):
+ west_wall_transform = wt
+ if is_instance_valid(walls[WALL_W]):
+ walls[WALL_W].global_transform = wt
+var east_wall_transform: Transform3D = Transform3D(Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(0, 0, -1), Vector3()):
+ set(wt):
+ east_wall_transform = wt
+ if is_instance_valid(walls[WALL_E]):
+ walls[WALL_E].global_transform = wt
+var south_wall_transform: Transform3D = Transform3D(Vector3(0, 0, -1), Vector3(0, 1, 0), Vector3(1, 0, 0), Vector3()):
+ set(wt):
+ south_wall_transform = wt
+ if is_instance_valid(walls[WALL_S]):
+ walls[WALL_S].global_transform = wt
+var north_wall_transform: Transform3D = Transform3D(Vector3(0, 0, 1), Vector3(0, 1, 0), Vector3(-1, 0, 0), Vector3()):
+ set(wt):
+ north_wall_transform = wt
+ if is_instance_valid(walls[WALL_N]):
+ walls[WALL_N].global_transform = wt
+
+@export_flags("West", "East", "South", "North") var wall_mode := WALL_W | WALL_E | WALL_S | WALL_N:
+ set(wm):
+ wall_mode = wm
+ notify_property_list_changed()
+
+@export_flags("Test west", "Test east", "Test south", "Test north") var tests = 0:
+ set(v):
+ tests = v if v else 0
+ for wall in ITER:
+ if has_walls(wall, true) and not tests & wall:
+ remove_walls(wall, true)
+ elif tests & wall:
+ make_walls(wall, true)
+
+func _get_property_list() -> Array:
+ var west_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_W else PROPERTY_USAGE_NO_EDITOR
+ var east_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_E else PROPERTY_USAGE_NO_EDITOR
+ var north_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_N else PROPERTY_USAGE_NO_EDITOR
+ var south_usage := PROPERTY_USAGE_DEFAULT if wall_mode & WALL_S else PROPERTY_USAGE_NO_EDITOR
+ return [
+ { "name": "west_wall_scene", "type": TYPE_OBJECT, "usage": west_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" },
+ { "name": "west_wall_transform", "type": TYPE_TRANSFORM3D, "usage": west_usage },
+ { "name": "east_wall_scene", "type": TYPE_OBJECT, "usage": east_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" },
+ { "name": "east_wall_transform", "type": TYPE_TRANSFORM3D, "usage": east_usage },
+ { "name": "north_wall_scene", "type": TYPE_OBJECT, "usage": north_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" },
+ { "name": "north_wall_transform", "type": TYPE_TRANSFORM3D, "usage": north_usage },
+ { "name": "south_wall_scene", "type": TYPE_OBJECT, "usage": south_usage, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" },
+ { "name": "south_wall_transform", "type": TYPE_TRANSFORM3D, "usage": south_usage },
+ ]
+
+# virtual wall functions
+func make_walls(w: int, singular := false) -> void:
+ for wall in walls:
+ if w & wall:
+ if is_instance_valid(walls[wall]):
+ push_error("wall exists!")
+ return
+ var node: Wall = wall_scenes()[wall].instantiate()
+ node.global_transform = wall_transforms()[wall]
+ add_child(node)
+ walls[wall] = node
+ if singular:
+ return
+func get_wall_mode() -> int: return wall_mode
+func get_aabb() -> AABB: return mesh.get_aabb()
+# virtual mat functions
+func materials_allowed() -> int: return 1|2|4
+func default_mat() -> int: return 1
+func set_mat(p_mat: int) -> void: mat = p_mat; reset_map()
+# virtual editor functions
+func un_highlight(): reset_map()
+func highlight() -> void: mesh.set_surface_override_material(0, MatMap.get_highlight(mat))
+# utility functions
+func reset_map():
+ mesh.set_surface_override_material(0, MatMap.map[mat])
+
diff --git a/classes/resources/block_map.gd b/classes/resources/block_map.gd
new file mode 100644
index 0000000..8193a7c
--- /dev/null
+++ b/classes/resources/block_map.gd
@@ -0,0 +1,24 @@
+extends Resource
+class_name BlockMap
+
+const map := [
+ preload("res://assets/blocks/platform_booster.tscn"),
+ preload("res://assets/blocks/platform_corner.tscn"),
+ preload("res://assets/blocks/platform_depression.tscn"),
+ preload("res://assets/blocks/platform_diagonal.tscn"),
+ preload("res://assets/blocks/platform_poke.tscn"),
+ preload("res://assets/blocks/platform_poke_corner.tscn"),
+ preload("res://assets/blocks/platform_ramp.tscn"),
+ preload("res://assets/blocks/platform_square.tscn"),
+ preload("res://assets/blocks/platform_turn_1x1.tscn"),
+ preload("res://assets/blocks/platform_turn_2x2.tscn"),
+ preload("res://assets/blocks/platform_turn_3x3.tscn"),
+ preload("res://assets/blocks/platform_x.tscn"),
+ preload("res://assets/blocks/ring_checkpoint.tscn"),
+ preload("res://assets/blocks/ring_finish.tscn"),
+ preload("res://assets/blocks/ring_start.tscn"),
+ preload("res://assets/blocks/tree.tscn")
+]
+
+static func find(s: PackedScene):
+ return map.find(s)
diff --git a/classes/resources/dir.gd b/classes/resources/dir.gd
new file mode 100644
index 0000000..6d8b228
--- /dev/null
+++ b/classes/resources/dir.gd
@@ -0,0 +1,5 @@
+@icon("res://ui/assets/folder.png")
+extends FileItem
+class_name DirRes
+
+@export var files: Array[FileItem]
diff --git a/classes/resources/file_item.gd b/classes/resources/file_item.gd
new file mode 100644
index 0000000..a5f936a
--- /dev/null
+++ b/classes/resources/file_item.gd
@@ -0,0 +1,4 @@
+extends Resource
+class_name FileItem
+
+@export_multiline var description = "";
diff --git a/classes/resources/ghost_data.gd b/classes/resources/ghost_data.gd
index ca57af2..1354349 100644
--- a/classes/resources/ghost_data.gd
+++ b/classes/resources/ghost_data.gd
@@ -60,7 +60,11 @@ static func from_d(d: Dictionary) -> GhostData:
## Saves a basic dictionary to a path.
static func _save_file(path: String, data: Dictionary) -> void:
+ if !DirAccess.dir_exists_absolute(path.get_base_dir()):
+ DirAccess.make_dir_recursive_absolute(path.get_base_dir())
var file := FileAccess.open_compressed(path, FileAccess.WRITE, FileAccess.COMPRESSION_ZSTD)
+ if file == null:
+ push_error(FileAccess.get_open_error())
file.store_buffer(var_to_bytes(data))
## Loads a basic dictionary out of a file.
diff --git a/classes/resources/highlight_mat_map.gd b/classes/resources/highlight_mat_map.gd
new file mode 100644
index 0000000..ce64a5b
--- /dev/null
+++ b/classes/resources/highlight_mat_map.gd
@@ -0,0 +1,14 @@
+extends Resource
+class_name MatMap
+
+static func get_highlight(m_id: int) -> BaseMaterial3D:
+ return load("%s_highlight.%s" % [map[m_id].resource_path.get_basename(), map[m_id].resource_path.get_extension()])
+
+const map := {
+ 1: preload("res://assets/mats/platform.material"),
+ 2: preload("res://assets/mats/road.tres"),
+ 4: preload("res://assets/mats/grass.tres"),
+ 8: preload("res://assets/mats/ring_checkpoint.tres"),
+ 16: preload("res://assets/mats/ring_finish.tres"),
+ 32: preload("res://assets/mats/ring_start.tres")
+}
diff --git a/classes/resources/link.gd b/classes/resources/link.gd
new file mode 100644
index 0000000..e2f1d9f
--- /dev/null
+++ b/classes/resources/link.gd
@@ -0,0 +1,42 @@
+@tool
+#@icon("res://ui/assets/block.png")
+class_name WeakLink
+extends FileItem
+
+var scene: PackedScene:
+ set(s):
+ scene = s; notify_property_list_changed()
+var material: int = 0:
+ set(m): material = m; notify_property_list_changed()
+var material_color: Color
+var texture: Texture2D:
+ set(t): texture = t; notify_property_list_changed()
+enum Type { Scene, Material, Texture }
+var type: Type:
+ get:
+ if scene != null:
+ return Type.Scene
+ elif material != 0:
+ return Type.Material
+ elif texture != null:
+ return Type.Texture
+ @warning_ignore("assert_always_false")
+ assert(false, "no resource available")
+ return Type.Scene # smh
+
+func _get_property_list() -> Array:
+ var unset := not scene and not material and not texture
+ return [
+ { "name": "scene", "type": TYPE_OBJECT, "usage": PROPERTY_USAGE_DEFAULT if unset || scene != null else PROPERTY_USAGE_NO_EDITOR, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "PackedScene" },
+ { "name": "material", "type": TYPE_INT, "usage": PROPERTY_USAGE_DEFAULT if unset || material != null else PROPERTY_USAGE_NO_EDITOR, "hint": PROPERTY_HINT_LAYERS_2D_RENDER },
+ { "name": "material_color", "type": TYPE_COLOR, "usage": PROPERTY_USAGE_DEFAULT if material != null else PROPERTY_USAGE_NO_EDITOR, "hint": PROPERTY_HINT_RESOURCE_TYPE },
+ { "name": "texture", "type": TYPE_OBJECT, "usage": PROPERTY_USAGE_DEFAULT if unset || texture != null else PROPERTY_USAGE_NO_EDITOR, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": "Texture2D" },
+ ]
+
+func hash_s() -> PackedByteArray:
+ var item: PackedByteArray
+ match type:
+ Type.Scene: item = var_to_str(scene._bundled).to_ascii_buffer()
+ Type.Material: item = [material]
+ Type.Texture: item = texture.get_image().get_data()
+ return Thumbnail.hash_b(item)
diff --git a/classes/resources/thumbnail.gd b/classes/resources/thumbnail.gd
new file mode 100644
index 0000000..5e470da
--- /dev/null
+++ b/classes/resources/thumbnail.gd
@@ -0,0 +1,56 @@
+extends Object
+class_name Thumbnail
+
+@warning_ignore("shadowed_global_identifier")
+static func _load(p: String, hash: PackedByteArray, error_if_hash_mismatch := true) -> Image:
+ if FileAccess.file_exists(p):
+ var f := FileAccess.open(p, FileAccess.READ)
+ var img := Image.new()
+ var buf := f.get_buffer(f.get_length())
+ if buf:
+ var dict: Dictionary = bytes_to_var(buf)
+ var e := img.load_png_from_buffer(dict.b)
+ if e != OK:
+ push_error("error: ", e)
+ return null
+ if dict.h != hash:
+ if error_if_hash_mismatch:
+ push_error("error loading thumbnail %s: hash (thumbnail hash) %s != (file hash) %s" % [p, dict.h.hex_encode(), hash.hex_encode()])
+ return null
+ return img
+ return null
+
+static func hash_f(p: String) -> PackedByteArray:
+ var file := FileAccess.open(p, FileAccess.READ)
+ return hash_b(file.get_buffer(file.get_length()))
+
+static func hash_b(b: PackedByteArray) -> PackedByteArray:
+ var h := HashingContext.new()
+ h.start(HashingContext.HASH_SHA1)
+ h.update(b)
+ return h.finish()
+
+static func create_thumb(parent: Node, node: Node3D, size := Vector2i(64, 64), world := World3D.new()) -> Image:
+ var port := SubViewport.new()
+ port.size = size
+ port.msaa_3d = Viewport.MSAA_4X
+ port.screen_space_aa = Viewport.SCREEN_SPACE_AA_FXAA
+ port.own_world_3d = true
+ port.world_3d = world
+ parent.add_child(port)
+ port.add_child(node)
+ port.render_target_update_mode = SubViewport.UPDATE_ONCE
+ await RenderingServer.frame_post_draw
+ var img: Image = port.get_texture().get_image()
+ port.queue_free()
+ return img
+
+@warning_ignore("shadowed_global_identifier")
+static func save(img: Image, p: String, hash: PackedByteArray) -> Error:
+ if !DirAccess.dir_exists_absolute(p.get_base_dir()):
+ DirAccess.make_dir_recursive_absolute(p.get_base_dir())
+ var file := FileAccess.open(p, FileAccess.WRITE)
+ if file == null:
+ return FileAccess.get_open_error()
+ file.store_buffer(var_to_bytes({ b = img.save_png_to_buffer(), h = hash }))
+ return OK
diff --git a/classes/resources/track.gd b/classes/resources/track.gd
new file mode 100644
index 0000000..cf41dbb
--- /dev/null
+++ b/classes/resources/track.gd
@@ -0,0 +1,106 @@
+extends Resource
+class_name TrackResource
+@export_group("Sun position")
+## Sun x rotation
+@export_range(-360, 360) var sun_x := -90
+## Sun y rotation ( its a game, the sun rotates around us )
+@export_range(-360, 360) var sun_y := 0
+@export_group("", "")
+## The height of the overview cam
+@export var overview_height := 300.0
+## The name of this track
+@export var name: String = "":
+ set(n):
+ if name != n:
+ name = n
+ name_changed.emit(name)
+## Offset the entire track
+@export var offset := Vector3.UP
+@export_group("Race")
+## Num laps, 1 = go to finish and done
+@export var laps := 1
+
+var builtin := false # i could (should) use class overrides and stuff but im tired
+
+signal name_changed(name: String)
+signal saved
+
+## should look something like:
+## [codeblock]
+## [
+## TrackObject {
+## scene: "res://assets/blocks/platform.tscn",
+## transform: Transform3D(0, 0, 1, 0),
+## material: "platform",
+## ...more fields i come up with
+## }
+## ]
+## [/codeblock]
+var blocks: Array[TrackObject]
+
+func _init(p_blocks: Array[TrackObject]) -> void:
+ blocks = p_blocks
+
+static func from_d(d: Dictionary) -> TrackResource:
+ var blocs: Array[TrackObject] = []
+ for block in d.b:
+ blocs.append(TrackObject.from_d(block))
+ var obj := TrackResource.new(blocs)
+ obj.sun_x = d.x
+ obj.sun_y = d.y
+ obj.overview_height = d.h
+ obj.name = d.n
+ obj.offset = d.o
+ obj.laps = d.l
+ return obj
+
+## Creates a [TrackResource] from a file
+static func _load(path: String) -> TrackResource:
+ var res := GhostData._load_file(path)
+ if res.is_empty():
+ return null
+ return TrackResource.from_d(res)
+
+func to_d() -> Dictionary:
+ var b: Array[Dictionary] = [] # i know map() exists, but it didnt work
+ for i in blocks:
+ b.append(i.exprt())
+ return {
+ x = sun_x,
+ y = sun_y,
+ h = overview_height,
+ n = name,
+ o = offset,
+ l = laps,
+ b = b
+ }
+
+func save(path: String) -> void:
+ if builtin:
+ BuiltinTrackSelect.store_all()
+ else:
+ GhostData._save_file(path, to_d())
+ saved.emit()
+
+func get_aabb() -> AABB:
+ var box := AABB()
+ for block in blocks:
+ if block.live_node:
+ box = box.merge(block.live_node.get_aabb())
+ return box
+
+func dup() -> TrackResource:
+ var blocks_dup: Array[TrackObject] = []
+ for block in blocks:
+ blocks_dup.append(block.dup())
+ var o := TrackResource.new(blocks_dup)
+ o.sun_x = sun_x
+ o.sun_y = sun_y
+ o.overview_height = overview_height
+ o.name = name
+ o.offset = offset
+ o.laps = laps
+ return o
+
+func bytes() -> PackedByteArray:
+ return var_to_bytes(to_d())
diff --git a/classes/resources/track_obj.gd b/classes/resources/track_obj.gd
new file mode 100644
index 0000000..eed57a7
--- /dev/null
+++ b/classes/resources/track_obj.gd
@@ -0,0 +1,79 @@
+extends Resource
+class_name TrackObject
+
+var base_scene: int = -1
+var live_node: Block
+var material: int
+var walls: int
+var transform: Transform3D
+var link: WeakLink
+
+func _init(p_base: int, p_live: Node, p_link: WeakLink) -> void:
+ link = p_link
+ base_scene = p_base
+ set_live(p_live)
+
+func exprt() -> Dictionary:
+ save()
+ return {
+ m = material,
+ b = base_scene,
+ t = transform,
+ w = walls,
+ }
+
+static func from_d(d: Dictionary) -> TrackObject:
+ var o := TrackObject.new(d.b, null, null)
+ o.material = d.get("m", 0)
+ o.transform = d.t
+ o.walls = d.w
+ return o
+
+func save() -> void:
+ if is_instance_valid(live_node):
+ transform = live_node.transform
+ walls = live_node.has_walls()
+ material = live_node.mat
+
+func delete_live() -> void:
+ save()
+ live_node = null
+
+## [param p_live] may or may not be in the tree
+func set_live(p_live: Block):
+ live_node = p_live
+ # we dont need these: this information should be transfered to the live node.
+ # but i pass around my tracks too much, and build them, that this will be a problem.
+ # material = null
+ # transform = Transform3D()
+
+## @constant
+func create(is_editor := false) -> Node3D:
+ var node: Block = BlockMap.map[base_scene].instantiate()
+ node.editor = is_editor
+ node.global_transform = transform
+ node.ready.connect(node.make_walls.bind(walls))
+ if material != 0:
+ node.ready.connect(node.set_mat.bind(material))
+ return node
+
+## a more efficient [code]TrackObject.from_d(obj.exprt())[/code].
+func dup() -> TrackObject:
+ var tobj := TrackObject.new(base_scene, null, link)
+ save()
+ tobj.transform = transform
+ tobj.walls = walls
+ tobj.material = material
+ return tobj
+
+func name() -> String:
+ if link:
+ return link.resource_name
+ if is_instance_valid(live_node):
+ return live_node.name
+ if base_scene != -1:
+ return BlockMap.map[base_scene].resource_path.get_file().get_basename()
+ return "unnamed"
+
+func _to_string() -> String:
+ return "TrackObject<%s>" % name()
diff --git a/classes/start.gd b/classes/start.gd
index 4fca566..13ecb2d 100644
--- a/classes/start.gd
+++ b/classes/start.gd
@@ -1,4 +1,8 @@
-extends PathFollow3D
+extends Block
class_name Start
-@export var needs_collision := true \ No newline at end of file
+@export var mesh: MeshInstance3D
+
+func un_highlight(): mesh.set_surface_override_material(0, MatMap.map[mat])
+func highlight() -> void: mesh.set_surface_override_material(0, MatMap.get_highlight(mat))
+func default_mat(): return 32
diff --git a/classes/track.gd b/classes/track.gd
deleted file mode 100644
index 2e39193..0000000
--- a/classes/track.gd
+++ /dev/null
@@ -1,60 +0,0 @@
-extends Resource
-class_name TrackResource
-@export_group("Road")
-## Width of road
-@export var track_width := 40.0
-## Support base width
-@export var lower_support_width := 25.0
-## Height of supports
-@export var support_height := 8.0
-## Track curve
-@export var track: Curve3D = null
-@export_subgroup("Barriers")
-## Left barrier? (does not change collisions). see also [member right_barrier]
-@export var left_barrier := true
-## Right barrier? (does not change collisions). see also [member left_barrier]
-@export var right_barrier := true
-## Barrier width
-@export var barrier_width := 4.0
-@export_group("Sun position")
-## Sun x rotation
-@export_range(-360, 360) var sun_x := -90
-## Sun y rotation ( its a game, the sun rotates around us )
-@export_range(-360, 360) var sun_y := 0
-@export_group("", "")
-## The height of the overview cam
-@export var overview_height := 300.0
-## The name of this track
-@export var name: String = ""
-## Does the track loop around?
-@export var is_loop := true
-## Offset the entire track
-@export var offset := Vector3.UP
-@export_group("Race")
-## Num laps, 1 = go to finish and done
-@export var laps := 1
-@export_subgroup("Checkpoints")
-## Place the path offsets of checkpoint locations in this array
-@export var checkpoints: Array[float] = []
-## The checkpoint scene
-@export var checkpoint_scene: PackedScene = preload("res://scenes/ring_checkpoint.tscn")
-## How much to scale each checkpoint
-@export var checkpoint_scale := Vector3.ONE
-@export var checkpoint_needs_collision := false
-@export_subgroup("Finish")
-## Finish (or lap cp) location in path offset
-@export var finish_location: float = 0.0
-## The finish scene
-@export var finish_scene: PackedScene = preload("res://scenes/ring_finish.tscn")
-## How much to scale the finish
-@export var finish_scale := Vector3.ONE
-@export var finish_needs_collision := false
-@export_subgroup("Start")
-## Start location in path offset (unused if [member laps] > 1)
-@export var start_location: float = 0.0
-## Start scene (disregarded if [member laps] > 1)
-@export var start_scene: PackedScene = preload("res://scenes/ring_start.tscn")
-## How much to scale the start (see above)
-@export var start_scale := Vector3.ONE
-@export var start_needs_collision := false
-
diff --git a/classes/wall.gd b/classes/wall.gd
new file mode 100644
index 0000000..592e917
--- /dev/null
+++ b/classes/wall.gd
@@ -0,0 +1,4 @@
+extends StaticBody3D
+class_name Wall
+
+@export var mesh: MeshInstance3D
diff --git a/default_env.tres b/default_env.tres
index 747d8f4..26b6890 100644
--- a/default_env.tres
+++ b/default_env.tres
@@ -4,6 +4,7 @@
[sub_resource type="Sky" id="Sky_r1yiu"]
sky_material = ExtResource("1_jcf87")
+radiance_size = 1
[resource]
background_mode = 2
@@ -23,4 +24,4 @@ fog_height = -638.24
fog_height_density = 0.8369
adjustment_enabled = true
adjustment_contrast = 1.1
-adjustment_saturation = 1.1
+adjustment_saturation = 1.01
diff --git a/engine.gdextension b/engine.gdextension
index 8ab3a9c..0708a6f 100644
--- a/engine.gdextension
+++ b/engine.gdextension
@@ -1,5 +1,6 @@
[configuration]
-entry_symbol = "gdextension_rust_init"
+entry_symbol = "gdext_rust_init"
[libraries]
-linux.64 = "res://enginesound/target/release/libenginesound.so"
+linux.release.x86_64 = "res://addons/@bendn/enginesound/libenginesound.so"
+linux.debug.x86_64 = "res://addons/@bendn/enginesound/libenginesound.so"
diff --git a/enginesound b/enginesound
deleted file mode 160000
-Subproject 4c6f5674627a1a13d676cbef77abfc1ebfedbdb
diff --git a/export_presets.cfg b/export_presets.cfg
index ca67d22..3ebfebf 100644
--- a/export_presets.cfg
+++ b/export_presets.cfg
@@ -6,7 +6,7 @@ runnable=true
dedicated_server=false
custom_features="release"
export_filter="all_resources"
-include_filter=""
+include_filter="*.cfg"
exclude_filter=""
export_path="./tracer.x86_64"
encryption_include_filters=""
@@ -42,7 +42,7 @@ runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
-include_filter=""
+include_filter="*.cfg"
exclude_filter=""
export_path=""
encryption_include_filters=""
@@ -140,7 +140,7 @@ runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
-include_filter=""
+include_filter="*.cfg"
exclude_filter=""
export_path=""
encryption_include_filters=""
diff --git a/gizmo_test.tscn b/gizmo_test.tscn
new file mode 100644
index 0000000..b149ef3
--- /dev/null
+++ b/gizmo_test.tscn
@@ -0,0 +1,33 @@
+[gd_scene load_steps=6 format=3]
+
+[ext_resource type="PackedScene" uid="uid://cd4a5y0hi58ks" path="res://scenes/floor.tscn" id="1_1kys7"]
+[ext_resource type="PackedScene" uid="uid://crc02shshycvq" path="res://scenes/sun.tscn" id="2_qpxj4"]
+[ext_resource type="Environment" uid="uid://biwshm46yl62v" path="res://default_env.tres" id="3_2dhxm"]
+[ext_resource type="CameraAttributesPractical" uid="uid://nhsovwj5hjip" path="res://cam.tres" id="4_qhhmo"]
+[ext_resource type="PackedScene" uid="uid://d3enn4l4tqhe8" path="res://ui/editor/gizmos/translate/translate.tscn" id="5_rrfeo"]
+
+[node name="Node3D" type="Node3D"]
+
+[node name="Ground" parent="." instance=ExtResource("1_1kys7")]
+
+[node name="Sun" parent="." instance=ExtResource("2_qpxj4")]
+
+[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
+environment = ExtResource("3_2dhxm")
+camera_attributes = ExtResource("4_qhhmo")
+
+[node name="CSGBox3D" type="CSGBox3D" parent="."]
+transform = Transform3D(-0.135715, 0.93677, 0.322556, 0, 0.325568, -0.945519, -0.990748, -0.128321, -0.0441846, 0, 3.95683, 0)
+size = Vector3(10, 10, 10)
+
+[node name="RemoteTransform3D" type="RemoteTransform3D" parent="CSGBox3D"]
+remote_path = NodePath("../../translate")
+update_rotation = false
+update_scale = false
+
+[node name="translate" parent="." instance=ExtResource("5_rrfeo")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.95683, 0)
+path = NodePath("../CSGBox3D")
+
+[node name="Camera3D" type="Camera3D" parent="."]
+transform = Transform3D(0.877583, -0.229849, 0.420735, 0, 0.877583, 0.479426, -0.479426, -0.420736, 0.770151, 31.3445, 35.7169, 57.3757)
diff --git a/globals.gd b/globals.gd
index 43e9869..509bb07 100644
--- a/globals.gd
+++ b/globals.gd
@@ -1,5 +1,14 @@
extends Node
+class_name Utils
var playing: TrackResource
+var editing: TrackResource
var ghost: GhostData
-const SAVES := "user://%s.ghost"
+const SAVES := "user://ghosts/%s.ghost"
+const TRACKS := "user://player data/tracks/%s.track"
+const THUMBS := "user://thumbs/%s.thumb"
+const DEFAULT_EDITOR_LAYER := 0x80000000
+const GIZMO_LAYER := 0x40000000
+const GIZMO_LAYER_I := 31
+const SNAP := Vector3(10, 2.5, 10)
+var builtin_tracks: Array[TrackResource] = []
diff --git a/godot.lock b/godot.lock
index 0827a3a..07e9ad1 100644
--- a/godot.lock
+++ b/godot.lock
@@ -1,8 +1,13 @@
[
{
- "name": "@bendn/remap",
- "tarball": "https://registry.npmjs.org/@bendn/remap/-/remap-5.0.8.tgz",
- "version": "5.0.8"
+ "name": "@bendn/enginesound",
+ "tarball": "https://registry.npmjs.org/@bendn/enginesound/-/enginesound-1.0.0.tgz",
+ "version": "1.0.0"
+ },
+ {
+ "name": "@bendn/gizmo3d",
+ "tarball": "https://registry.npmjs.org/@bendn/gizmo3d/-/gizmo3d-1.0.4.tgz",
+ "version": "1.0.4"
},
{
"name": "@bendn/splitter",
diff --git a/godot.package b/godot.package
index 281549b..c14e444 100644
--- a/godot.package
+++ b/godot.package
@@ -1,3 +1,4 @@
[packages]
-"@bendn/remap" = '5.0.8'
+"@bendn/gizmo3d" = '1.0.4'
"@bendn/splitter" = '1.0.6'
+"@bendn/enginesound" = '1.0.0'
diff --git a/init_classes.py b/init_classes.py
index 29d1487..1010c12 100644
--- a/init_classes.py
+++ b/init_classes.py
@@ -7,7 +7,7 @@ classes = [] # { file, class name, base class name }
for file in glob("**/*.gd", recursive=True):
with open(file, "r") as f:
- text = f"{f.readline()}\n{f.readline()}\n{f.readline()}" # 3 lines: extend, class, tool
+ text = f"{f.readline()}\n{f.readline()}\n{f.readline()}\n{f.readline()}" # 4 lines: extend, class, tool, icon
m = find_class.search(text)
if not m:
continue
diff --git a/project.godot b/project.godot
index 47ca854..bce33e3 100644
--- a/project.godot
+++ b/project.godot
@@ -14,7 +14,7 @@ config/name="tracer"
run/main_scene="res://start.tscn"
config/use_custom_user_dir=true
config/custom_user_dir_name="tracer"
-config/features=PackedStringArray("4.0")
+config/features=PackedStringArray("4.1")
[autoload]
@@ -24,17 +24,28 @@ Globals="*res://globals.gd"
window/size/viewport_width=1920
window/size/viewport_height=1080
-window/vsync/vsync_mode=0
+window/subwindows/embed_subwindows=false
window/stretch/aspect="ignore"
+window/vsync/vsync_mode=0
+mouse_cursor/tooltip_position_offset=Vector2(25, 25)
[editor]
movie_writer/mix_rate=24000
movie_writer/mjpeg_quality=0.8
-movie_writer/movie_file="/home/bendn/Documents/tracer/movie.avi"
+movie_writer/movie_file="/home/bendn/Documents/tracer/movie/movie.png"
movie_writer/disable_vsync=true
movie_writer/fps=15
+[editor_plugins]
+
+enabled=PackedStringArray()
+
+[gui]
+
+theme/custom="res://ui/theme.tres"
+theme/custom_font="res://ui/ubuntu.tres"
+
[importer_defaults]
texture={
@@ -139,26 +150,50 @@ click={
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"pressed":false,"double_click":false,"script":null)
]
}
+ui_pan={
+"deadzone": 0.5,
+"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":3,"pressed":false,"double_click":false,"script":null)
+]
+}
+rotate_cw={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"echo":false,"script":null)
+]
+}
+rotate_ccw={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":82,"echo":false,"script":null)
+]
+}
[layer_names]
+2d_render/layer_1="platform"
+2d_render/layer_2="road"
+2d_render/layer_3="grass"
+2d_render/layer_4="checkpoint"
+2d_render/layer_5="finish"
+2d_render/layer_6="start"
3d_physics/layer_1="world"
3d_physics/layer_2="player"
+3d_physics/layer_31="gizmo"
+3d_physics/layer_32="editor"
[physics]
3d/run_on_separate_thread=true
+common/enable_object_picking=false
[rendering]
occlusion_culling/bvh_build_quality=0
+textures/canvas_textures/default_texture_filter=0
renderer/rendering_method="gl_compatibility"
lights_and_shadows/directional_shadow/size=2048
lights_and_shadows/directional_shadow/size.mobile=1024
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=1
reflections/sky_reflections/ggx_samples=16
reflections/sky_reflections/ggx_samples.mobile=8
-anti_aliasing/quality/msaa_2d=2
-anti_aliasing/quality/msaa_3d=2
+anti_aliasing/quality/msaa_2d=1
+anti_aliasing/quality/msaa_3d=1
anti_aliasing/quality/screen_space_aa=1
-textures/canvas_textures/default_texture_filter=0
diff --git a/race.gd b/race.gd
index 9007590..594579f 100644
--- a/race.gd
+++ b/race.gd
@@ -17,8 +17,6 @@ var current_lap := 0
var playing := false
var timer := GameTimer.new()
-const SaveLoad := preload("res://addons/@bendn/remap/private/SaveLoadUtils.gd")
-
signal next_lap
signal created_car(car: Car)
signal created_ghost(ghost: GhostCar)
@@ -42,18 +40,18 @@ func mkghost() -> void:
func reset_ghost() -> void:
if best_time_data:
ghost.update(best_time_data.load_snap(0), -1)
- ghost.engine.volume = .1
+ ghost.engine.volume = .2
else:
ghost.engine.volume = 0
- ghost.global_position = track.start_pos + Vector3(0, 2, 0) - (car.global_transform.basis.z * 2)
- ghost.rotation = track.start_rot + Vector3(0, PI, -PI/2)
+ ghost.global_position = track.start_transf.origin + Vector3(0, 1, 0)
+ ghost.rotation = track.start_transf.basis.get_euler()# + Vector3(0, PI, -PI/2)
ghost.reset()
ghost.hide()
func reset_car() -> void:
await get_tree().physics_frame
- car.rotation = track.start_rot + Vector3(0, PI, -PI/2)
- car.global_position = track.start_pos + Vector3(0, 2, 0) - (car.global_transform.basis.z * 2) # bump forward a teensy bit
+ car.rotation = track.start_transf.basis.get_euler()# + Vector3(0, PI, -PI/2)
+ car.global_position = track.start_transf.origin + Vector3(0, 1, 0)
car.linear_velocity = Vector3.ZERO
car.angular_velocity = Vector3.ZERO
car.current_gear = 0
@@ -70,7 +68,7 @@ func _ready() -> void:
track = track_loader_scene.instantiate()
track.track = track_res
add_child(track)
- data = GhostData.new(track_res.checkpoints.size(), track_res.laps)
+ data = GhostData.new(track.checkpoints.size(), track_res.laps)
mkcar()
mkghost()
connect_checkpoints()
@@ -106,18 +104,16 @@ func passed_finish() -> void:
return
collect(-1)
if track_res.laps - 1 == current_lap:
- print("finished")
playing = false
timer.stop()
car.reset()
if not best_time_data or data.time < best_time_data.time:
- print("new pb!")
finished.emit(data.time, best_time_data.time if best_time_data else -1.0)
data.save(Globals.SAVES % track_res.name)
best_time_data = data
else:
finished.emit(data.time, best_time_data.time)
- data = GhostData.new(track_res.checkpoints.size(), track_res.laps)
+ data = GhostData.new(track.checkpoints.size(), track_res.laps)
else:
current_lap += 1
next_lap.emit()
@@ -127,12 +123,12 @@ func _physics_process(delta: float) -> void:
if best_time_data:
if best_time_data.snap_count - 1 < Engine.get_physics_frames() - start_frame:
if ghost.visible:
- print("ran out of snaps, hiding ghost")
ghost.hide()
+ ghost.engine.volume = 0
return
ghost.update(best_time_data.load_snap(Engine.get_physics_frames() - start_frame), delta)
ghost.visible = (ghost.global_position.distance_squared_to(car.global_position) > 10)
- ghost.engine.volume = lerpf(ghost.engine.volume, .7, delta) if (ghost.global_position.distance_squared_to(car.global_position) > 20) else lerpf(ghost.engine.volume, .2, delta * 3)
+ ghost.engine.volume = lerpf(ghost.engine.volume, .7, delta * 3) if (ghost.global_position.distance_squared_to(car.global_position) > 20) else lerpf(ghost.engine.volume, .2, delta * 3)
func collect(cp: int) -> void:
if cp != -1:
diff --git a/scenes/floor.gd b/scenes/floor.gd
new file mode 100644
index 0000000..e8ef1a2
--- /dev/null
+++ b/scenes/floor.gd
@@ -0,0 +1,2 @@
+extends StaticBody3D
+class_name Floor
diff --git a/scenes/floor.tscn b/scenes/floor.tscn
index b000e39..b675204 100644
--- a/scenes/floor.tscn
+++ b/scenes/floor.tscn
@@ -1,14 +1,25 @@
-[gd_scene load_steps=4 format=3 uid="uid://cd4a5y0hi58ks"]
+[gd_scene load_steps=6 format=3 uid="uid://cd4a5y0hi58ks"]
-[ext_resource type="Material" uid="uid://bdyn312e6c3ll" path="res://assets/mats/grass.tres" id="1_g7360"]
+[ext_resource type="Script" path="res://scenes/floor.gd" id="1_yker8"]
+[ext_resource type="Texture2D" uid="uid://dyk71hogwv01g" path="res://assets/textures/grass.png" id="2_aug46"]
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_tkhh8"]
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6fb2t"]
+albedo_texture = ExtResource("2_aug46")
+emission = Color(0, 0.0745098, 0.219608, 1)
+emission_energy_multiplier = 16.0
+ao_light_affect = 0.33
+uv1_scale = Vector3(100, 100, 100)
+texture_filter = 0
+
[sub_resource type="PlaneMesh" id="PlaneMesh_ta0cd"]
-material = ExtResource("1_g7360")
+material = SubResource("StandardMaterial3D_6fb2t")
size = Vector2(5000, 5000)
[node name="Ground" type="StaticBody3D"]
+collision_mask = 0
+script = ExtResource("1_yker8")
metadata/_edit_lock_ = true
metadata/_edit_group_ = true
diff --git a/scenes/ghost_watcher.gd b/scenes/ghost_watcher.gd
index 3df6d7b..55f9f67 100644
--- a/scenes/ghost_watcher.gd
+++ b/scenes/ghost_watcher.gd
@@ -30,7 +30,7 @@ func _ready() -> void:
timer.start()
hud = hud_scene.instantiate()
- hud.assigned.emit(ghost, ghost, timer, track_loader)
+ hud.assigned.emit(ghost, timer, track_loader)
add_child(hud)
next_lap.connect(hud.laps.increment)
diff --git a/scenes/race_high.tscn b/scenes/race_high.tscn
index 64b8fcc..9e7e17e 100644
--- a/scenes/race_high.tscn
+++ b/scenes/race_high.tscn
@@ -5,7 +5,7 @@
[ext_resource type="PackedScene" uid="uid://c157wew5y33bo" path="res://assets/cars/kenney_sedan/sedan.tscn" id="4_0jpx1"]
[ext_resource type="PackedScene" uid="uid://cr1mgp6bgxh64" path="res://ui/finish.tscn" id="4_c1jl5"]
[ext_resource type="PackedScene" uid="uid://clpo7rt0vkudy" path="res://ui/countdown.tscn" id="4_llox4"]
-[ext_resource type="PackedScene" uid="uid://clw61td2wh84w" path="res://scenes/track.tscn" id="5_8mqbt"]
+[ext_resource type="PackedScene" uid="uid://ep3a5q3nkb7m" path="res://scenes/track.tscn" id="5_8mqbt"]
[ext_resource type="PackedScene" uid="uid://u8m366adrlqr" path="res://assets/cars/kenney_sedan/ghost.tscn" id="6_f37c2"]
[node name="race_high" type="Node"]
diff --git a/scenes/race_highlevel.gd b/scenes/race_highlevel.gd
index c9e44aa..2524f11 100644
--- a/scenes/race_highlevel.gd
+++ b/scenes/race_highlevel.gd
@@ -29,7 +29,7 @@ func add_player() -> void:
v.viewport.add_child(c_cam)
v.viewport.add_child(i_cam)
var hud = hud_scene.instantiate()
- hud.assigned.emit(race.car, race.ghost, race.timer, race.track)
+ hud.assigned.emit(race.car, race.timer, race.track)
v.add_child(hud)
race.split.connect(hud.splits.update)
race.next_lap.connect(hud.laps.increment)
@@ -53,3 +53,4 @@ func count_in():
var countdown := countdown_scene.instantiate()
huds[0].add_child(countdown)
countdown.finished.connect(race.start)
+ countdown.finished.connect(countdown.queue_free)
diff --git a/scenes/ring_checkpoint.gd b/scenes/ring_checkpoint.gd
deleted file mode 100644
index 7f67fc9..0000000
--- a/scenes/ring_checkpoint.gd
+++ /dev/null
@@ -1,5 +0,0 @@
-extends CheckPoint
-
-func _ready() -> void:
- if not needs_collision:
- $Ring/Collision.queue_free() \ No newline at end of file
diff --git a/scenes/ring_checkpoint.tscn b/scenes/ring_checkpoint.tscn
deleted file mode 100644
index afd0d47..0000000
--- a/scenes/ring_checkpoint.tscn
+++ /dev/null
@@ -1,39 +0,0 @@
-[gd_scene load_steps=5 format=3 uid="uid://d4a3e1w62m3ck"]
-
-[ext_resource type="Script" path="res://scenes/ring_checkpoint.gd" id="1_cmmpp"]
-[ext_resource type="TorusMesh" uid="uid://dlbpusye3e33p" path="res://assets/meshes/checkpoint.tres" id="2_xys6y"]
-
-[sub_resource type="TorusMesh" id="TorusMesh_mi087"]
-inner_radius = 25.0
-outer_radius = 40.0
-rings = 10
-ring_segments = 4
-
-[sub_resource type="BoxShape3D" id="BoxShape3D_k77jm"]
-size = Vector3(52, 52, 3)
-
-[node name="Checkpoint" type="PathFollow3D"]
-transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0)
-script = ExtResource("1_cmmpp")
-
-[node name="Ring" type="MeshInstance3D" parent="."]
-transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
-visibility_range_end_margin = 1000.0
-visibility_range_fade_mode = 1
-mesh = ExtResource("2_xys6y")
-
-[node name="Collision" type="CSGMesh3D" parent="Ring"]
-transform = Transform3D(1, 0, 0, 0, 1, -8.35187e-23, 0, -8.35187e-23, 1, 0, 0, 0)
-visible = false
-use_collision = true
-mesh = SubResource("TorusMesh_mi087")
-
-[node name="PlayerDetector" type="Area3D" parent="."]
-collision_layer = 0
-collision_mask = 2
-monitorable = false
-
-[node name="Area" type="CollisionShape3D" parent="PlayerDetector"]
-shape = SubResource("BoxShape3D_k77jm")
-
-[connection signal="body_entered" from="PlayerDetector" to="." method="enter" unbinds=1]
diff --git a/scenes/ring_collision.shape b/scenes/ring_collision.shape
new file mode 100644
index 0000000..e6b6819
--- /dev/null
+++ b/scenes/ring_collision.shape
Binary files differ
diff --git a/scenes/ring_finish.gd b/scenes/ring_finish.gd
deleted file mode 100644
index 05e36aa..0000000
--- a/scenes/ring_finish.gd
+++ /dev/null
@@ -1,5 +0,0 @@
-extends Finish
-
-func _ready() -> void:
- if not needs_collision:
- $Ring/Collision.queue_free()
diff --git a/scenes/ring_finish.tscn b/scenes/ring_finish.tscn
deleted file mode 100644
index bcefdb6..0000000
--- a/scenes/ring_finish.tscn
+++ /dev/null
@@ -1,36 +0,0 @@
-[gd_scene load_steps=5 format=3 uid="uid://t8ywjcjgw322"]
-
-[ext_resource type="Script" path="res://scenes/ring_finish.gd" id="1_oj823"]
-[ext_resource type="TorusMesh" uid="uid://bc8hyk8kfo4q1" path="res://assets/meshes/ring_finish.tres" id="2_hvrqd"]
-
-[sub_resource type="TorusMesh" id="TorusMesh_afdq1"]
-inner_radius = 25.0
-outer_radius = 40.0
-rings = 10
-ring_segments = 4
-
-[sub_resource type="BoxShape3D" id="BoxShape3D_bu8o6"]
-size = Vector3(52, 52, 3)
-
-[node name="RingFinish" type="PathFollow3D"]
-script = ExtResource("1_oj823")
-
-[node name="Ring" type="MeshInstance3D" parent="."]
-transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
-mesh = ExtResource("2_hvrqd")
-
-[node name="Collision" type="CSGMesh3D" parent="Ring"]
-transform = Transform3D(1, 0, 0, 0, 1, -8.35187e-23, 0, -8.35187e-23, 1, 0, 0, 0)
-visible = false
-use_collision = true
-mesh = SubResource("TorusMesh_afdq1")
-
-[node name="PlayerDetector" type="Area3D" parent="."]
-collision_layer = 0
-collision_mask = 2
-monitorable = false
-
-[node name="Area" type="CollisionShape3D" parent="PlayerDetector"]
-shape = SubResource("BoxShape3D_bu8o6")
-
-[connection signal="body_entered" from="PlayerDetector" to="." method="enter" unbinds=1]
diff --git a/scenes/ring_start.gd b/scenes/ring_start.gd
deleted file mode 100644
index a841f4d..0000000
--- a/scenes/ring_start.gd
+++ /dev/null
@@ -1,5 +0,0 @@
-extends Start
-
-func _ready() -> void:
- if not needs_collision:
- $Ring/Collision.queue_free()
diff --git a/scenes/ring_start.tscn b/scenes/ring_start.tscn
deleted file mode 100644
index 6320c32..0000000
--- a/scenes/ring_start.tscn
+++ /dev/null
@@ -1,23 +0,0 @@
-[gd_scene load_steps=4 format=3 uid="uid://bsftidvcmsha0"]
-
-[ext_resource type="TorusMesh" uid="uid://cwiqggu3nwbyh" path="res://assets/meshes/ring_start.tres" id="1_ksild"]
-[ext_resource type="Script" path="res://scenes/ring_start.gd" id="1_kvj6d"]
-
-[sub_resource type="TorusMesh" id="TorusMesh_e4fn4"]
-inner_radius = 25.0
-outer_radius = 40.0
-rings = 10
-ring_segments = 4
-
-[node name="ring_start" type="PathFollow3D"]
-script = ExtResource("1_kvj6d")
-
-[node name="Ring" type="MeshInstance3D" parent="."]
-transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
-mesh = ExtResource("1_ksild")
-
-[node name="Collision" type="CSGMesh3D" parent="Ring"]
-transform = Transform3D(1, 0, 0, 0, 1, -8.35187e-23, 0, -8.35187e-23, 1, 0, 0, 0)
-visible = false
-use_collision = true
-mesh = SubResource("TorusMesh_e4fn4")
diff --git a/scenes/sun.tscn b/scenes/sun.tscn
new file mode 100644
index 0000000..094d085
--- /dev/null
+++ b/scenes/sun.tscn
@@ -0,0 +1,10 @@
+[gd_scene format=3 uid="uid://crc02shshycvq"]
+
+[node name="Sun" type="DirectionalLight3D"]
+transform = Transform3D(1, 4.49013e-09, 0, -2.8862e-09, 0.642788, 0.766044, 3.43964e-09, -0.766044, 0.642788, 0, 0, 0)
+light_energy = 1.083
+light_volumetric_fog_energy = 0.0
+shadow_enabled = true
+shadow_blur = 1.5
+directional_shadow_mode = 0
+directional_shadow_max_distance = 300.0
diff --git a/scenes/track-base.gd b/scenes/track-base.gd
index 7ea90f0..0aec1f1 100644
--- a/scenes/track-base.gd
+++ b/scenes/track-base.gd
@@ -1,122 +1,31 @@
-@tool
-extends Path3D
+extends Node3D
class_name TrackLoader
-@export_group("Track")
-@export var track: TrackResource = null:
- set(new_track):
- if track != new_track:
- track = new_track
- is_dirty = true
- call_deferred("_update")
-@export var force_update: bool = false:
- set(update):
- if update == true && update != force_update:
- force_update = false
- is_dirty = true
- call_deferred("_update")
-
-@onready var road := $Road as CSGPolygon3D
-@onready var rail_l := $WallL as CSGPolygon3D
-@onready var rail_r := $WallR as CSGPolygon3D
-@onready var collision := $CollisionShape as CSGPolygon3D
+@export var track: TrackResource = null
@onready var sun := $Sun as DirectionalLight3D
@onready var ground := $Ground as StaticBody3D
var checkpoints: Array[CheckPoint]
var finish: Finish
-var start_rot: Vector3
-var start_pos: Vector3
-var is_dirty := true
-
-func vec(x := 0.0, y := 0.0) -> Vector2:
- return Vector2(x, y)
-
-func _update():
- if !is_dirty or !track or !track.track:
- # curve = null # editor freezes with this, idk why
- return
- curve = track.track
- curve.set_point_tilt(0, PI/2)
- curve.set_point_tilt(curve.get_point_count() - 1, 0.0)
-
- sun.rotation_degrees.x = (track.sun_x)
- sun.rotation_degrees.y = (track.sun_y)
-
-
- # update our track
- var thw := track.track_width * 0.5 # track half width
- road.polygon = PackedVector2Array([vec(-thw), vec(-thw), vec(thw), vec(thw)])
-
- # update our rails
- var outer := thw + track.barrier_width
- rail_l.polygon = PackedVector2Array([
- vec(outer, 2),
- vec(thw, 2), # widen
- vec(thw), # widen
- vec(outer)
- ])
- rail_l.visible = track.left_barrier
- rail_r.polygon = PackedVector2Array([
- vec(-outer, 2),
- vec(-thw, 2), # widen
- vec(-thw), # widen
- vec(-outer)
- ])
- rail_r.visible = track.right_barrier
+var start_transf: Transform3D
+var editor := false
- # update our collision
- collision.polygon = PackedVector2Array([
- vec(-thw), # widen
- vec(thw), # widen
- vec(thw, 5.0), # widen
- vec(outer, 5.0),
- vec(outer, -1.0),
- vec(-outer, -1.0),
- vec(-outer, 5.0),
- vec(-thw, 5.0), # widen
- ])
- # objects
- for child in get_children():
- if child is PathFollow3D:
- child.queue_free()
-
- for i in len(track.checkpoints):
- var c: CheckPoint = make_follower(track.checkpoint_scene, track.checkpoints[i], track.checkpoint_scale, track.checkpoint_needs_collision)
- if not Engine.is_editor_hint(): # godot tools are wierd
- checkpoints.append(c)
-
- finish = make_follower(track.finish_scene, track.finish_location, track.finish_scale, track.finish_needs_collision)
- if track.laps == 1:
- var s: Start = make_follower(track.start_scene, track.start_location, track.start_scale, track.start_needs_collision)
- start_pos = s.global_position
- start_rot = s.global_rotation
- else:
- start_pos = finish.global_position
- start_rot = finish.global_rotation
-
- # loopage
- rail_l.path_joined = track.is_loop
- rail_r.path_joined = track.is_loop
- collision.path_joined = track.is_loop
- road.path_joined = track.is_loop
-
- # offset
+func update():
+ sun.rotation_degrees.x = track.sun_x
+ sun.rotation_degrees.y = track.sun_y
ground.global_position = track.offset
-
- is_dirty = false
+ for block in track.blocks:
+ var node: Block = block.create(editor)
+ if editor:
+ block.set_live(node)
+ add_child(node)
+ if not editor:
+ if node is CheckPoint:
+ checkpoints.append(node)
+ elif node is Finish:
+ finish = node
+ elif node is Start:
+ start_transf = block.transform
func _ready():
- _update()
-
-func _on_curve_changed() -> void:
- is_dirty = true
- call_deferred("_update")
-
-func make_follower(scene: PackedScene, ratio: float, scl: Vector3, collide: bool) -> PathFollow3D:
- var follower: PathFollow3D = scene.instantiate()
- follower.needs_collision = collide
- add_child(follower)
- follower.scale = scl
- follower.progress_ratio = ratio # ratio set must be after add_child()
- return follower
+ update()
diff --git a/scenes/track.tscn b/scenes/track.tscn
index 4c47171..9f4fa7d 100644
--- a/scenes/track.tscn
+++ b/scenes/track.tscn
@@ -1,94 +1,20 @@
-[gd_scene load_steps=7 format=3 uid="uid://ep3a5q3nkb7m"]
+[gd_scene load_steps=6 format=3 uid="uid://ep3a5q3nkb7m"]
[ext_resource type="Script" path="res://scenes/track-base.gd" id="1_ke7nx"]
-[ext_resource type="Material" uid="uid://be8pta62kxd2j" path="res://assets/mats/road.tres" id="2_2nntu"]
-[ext_resource type="Material" path="res://assets/mats/wall.tres" id="5_8gm6o"]
+[ext_resource type="PackedScene" uid="uid://crc02shshycvq" path="res://scenes/sun.tscn" id="4_y5lth"]
[ext_resource type="PackedScene" uid="uid://cd4a5y0hi58ks" path="res://scenes/floor.tscn" id="7_fidh3"]
[ext_resource type="Environment" uid="uid://biwshm46yl62v" path="res://default_env.tres" id="8_2nyv3"]
[ext_resource type="CameraAttributesPractical" uid="uid://nhsovwj5hjip" path="res://cam.tres" id="9_6ooo5"]
-[node name="TrackLoader" type="Path3D"]
-transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00882721, 0, -0.103973)
+[node name="TrackLoader" type="Node3D"]
script = ExtResource("1_ke7nx")
metadata/_edit_group_ = true
-[node name="Road" type="CSGPolygon3D" parent="."]
-calculate_tangents = false
-polygon = PackedVector2Array(-12.5, 0, -12.5, 0, 12.5, 0, 12.5, 0)
-mode = 2
-path_node = NodePath("..")
-path_interval_type = 0
-path_interval = 1.0
-path_simplify_angle = 2.0
-path_rotation = 2
-path_local = false
-path_continuous_u = true
-path_u_distance = 0.0
-path_joined = true
-material = ExtResource("2_2nntu")
-
-[node name="WallL" type="CSGPolygon3D" parent="."]
-calculate_tangents = false
-polygon = PackedVector2Array(14.5, 2, 12.5, 2, 12.5, 0, 14.5, 0)
-mode = 2
-path_node = NodePath("..")
-path_interval_type = 0
-path_interval = 1.0
-path_simplify_angle = 3.0
-path_rotation = 2
-path_local = false
-path_continuous_u = true
-path_u_distance = 1.0
-path_joined = true
-material = ExtResource("5_8gm6o")
-
-[node name="WallR" type="CSGPolygon3D" parent="."]
-calculate_tangents = false
-polygon = PackedVector2Array(-14.5, 2, -12.5, 2, -12.5, 0, -14.5, 0)
-mode = 2
-path_node = NodePath("..")
-path_interval_type = 0
-path_interval = 1.0
-path_simplify_angle = 3.0
-path_rotation = 2
-path_local = false
-path_continuous_u = true
-path_u_distance = 1.0
-path_joined = true
-material = ExtResource("5_8gm6o")
-
-[node name="Sun" type="DirectionalLight3D" parent="."]
-transform = Transform3D(1, 4.49013e-09, 0, -2.8862e-09, 0.642788, 0.766044, 3.43964e-09, -0.766044, 0.642788, 0, 0, 0)
-light_energy = 1.083
-light_volumetric_fog_energy = 0.0
-shadow_enabled = true
-shadow_blur = 1.5
-directional_shadow_mode = 0
-directional_shadow_max_distance = 300.0
+[node name="Sun" parent="." instance=ExtResource("4_y5lth")]
+transform = Transform3D(0.992546, 0.0211625, 0.120018, 8.60946e-08, -0.984808, 0.173648, 0.121869, -0.172354, -0.977467, 0, 0, 0)
[node name="Env" type="WorldEnvironment" parent="."]
environment = ExtResource("8_2nyv3")
camera_attributes = ExtResource("9_6ooo5")
-[node name="CollisionShape" type="CSGPolygon3D" parent="."]
-transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.165113, 0)
-visible = false
-calculate_tangents = false
-use_collision = true
-collision_mask = 0
-polygon = PackedVector2Array(-12.5, 0, 12.5, 0, 12.5, 5, 14.5, 5, 14.5, -1, -14.5, -1, -14.5, 5, -12.5, 5)
-mode = 2
-path_node = NodePath("..")
-path_interval_type = 0
-path_interval = 1.0
-path_simplify_angle = 3.0
-path_rotation = 2
-path_local = false
-path_continuous_u = true
-path_u_distance = 1.0
-path_joined = true
-
[node name="Ground" parent="." instance=ExtResource("7_fidh3")]
-transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00882721, -2, 0.103973)
-
-[connection signal="curve_changed" from="." to="." method="_on_curve_changed"]
diff --git a/start.tscn b/start.tscn
index f0cc06b..44a7f81 100644
--- a/start.tscn
+++ b/start.tscn
@@ -1,15 +1,18 @@
-[gd_scene load_steps=10 format=3 uid="uid://bvfqaoqjsxj73"]
+[gd_scene load_steps=9 format=3 uid="uid://co11ood2nmady"]
-[ext_resource type="Theme" uid="uid://cru1d7n2ftrfm" path="res://ui/theme.tres" id="1_gm0ws"]
+[ext_resource type="Theme" uid="uid://d3ywcokn5ddy8" path="res://ui/theme.tres" id="1_gm0ws"]
[ext_resource type="Script" path="res://ui/tracks.gd" id="2_po2ce"]
-[ext_resource type="Resource" uid="uid://dwojilpcrv8me" path="res://tracks/multilap_test.tres" id="3_0yjp1"]
-[ext_resource type="Resource" path="res://tracks/test.tres" id="4_3xqvr"]
-[ext_resource type="PackedScene" uid="uid://dhiei0g5tr74s" path="res://scenes/race_high.tscn" id="5_m5kci"]
-[ext_resource type="Resource" path="res://tracks/the fallen tramps.tres" id="5_qwie6"]
-[ext_resource type="PackedScene" uid="uid://demunxvqkmtwa" path="res://scenes/ghost_watcher.tscn" id="7_6ph7w"]
-[ext_resource type="PackedScene" uid="uid://dfvtugujgcjcw" path="res://ui/track_button.tscn" id="7_pchkj"]
+[ext_resource type="Theme" uid="uid://bds815vxta4ma" path="res://ui/editor/bar_button.tres" id="6_e1quy"]
+[ext_resource type="Script" path="res://ui/multi_button.gd" id="7_rhu6g"]
+[ext_resource type="Script" path="res://ui/editor/import.gd" id="8_1f3ce"]
+[ext_resource type="Script" path="res://ui/editor/track_select.gd" id="8_v6p1s"]
[ext_resource type="AudioStream" uid="uid://bwiyphl31lwu6" path="res://assets/sounds/music.ogg" id="9_ma7kx"]
+[sub_resource type="LabelSettings" id="LabelSettings_8ohli"]
+font_size = 24
+outline_size = 12
+outline_color = Color(0, 0.168627, 0.211765, 1)
+
[node name="start" type="Control"]
layout_mode = 3
anchors_preset = 15
@@ -19,7 +22,7 @@ grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("1_gm0ws")
-[node name="MarginContainer" type="MarginContainer" parent="."]
+[node name="margin" type="MarginContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@@ -31,24 +34,76 @@ theme_override_constants/margin_top = 50
theme_override_constants/margin_right = 50
theme_override_constants/margin_bottom = 50
-[node name="TabContainer" type="TabContainer" parent="MarginContainer"]
+[node name="tabs" type="TabContainer" parent="margin"]
layout_mode = 2
+tab_alignment = 1
-[node name="play" type="VBoxContainer" parent="MarginContainer/TabContainer"]
+[node name="play" type="VBoxContainer" parent="margin/tabs"]
layout_mode = 2
-[node name="tracks" type="GridContainer" parent="MarginContainer/TabContainer/play"]
+[node name="tracks" type="GridContainer" parent="margin/tabs/play"]
layout_mode = 2
theme_override_constants/h_separation = 15
theme_override_constants/v_separation = 15
columns = 5
script = ExtResource("2_po2ce")
-tracks = Array[Resource("res://classes/track.gd")]([ExtResource("3_0yjp1"), ExtResource("4_3xqvr"), ExtResource("5_qwie6")])
-race = ExtResource("5_m5kci")
-ghost_watch = ExtResource("7_6ph7w")
-trackbutton = ExtResource("7_pchkj")
+editable = false
+metadata/_edit_pinned_properties_ = [&"editable"]
+
+[node name="create" type="VBoxContainer" parent="margin/tabs"]
+visible = false
+layout_mode = 2
+
+[node name="buttons" type="HFlowContainer" parent="margin/tabs/create"]
+layout_mode = 2
+theme = ExtResource("6_e1quy")
+
+[node name="new" type="Button" parent="margin/tabs/create/buttons" node_paths=PackedStringArray("secondary")]
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_font_sizes/font_size = 52
+action_mode = 0
+text = "󰈔"
+script = ExtResource("7_rhu6g")
+secondary = NodePath("plus")
+
+[node name="plus" type="Label" parent="margin/tabs/create/buttons/new"]
+layout_mode = 1
+anchors_preset = 3
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -9.0
+offset_top = -24.0
+offset_right = 4.0
+offset_bottom = 4.0
+grow_horizontal = 0
+grow_vertical = 0
+text = ""
+label_settings = SubResource("LabelSettings_8ohli")
+
+[node name="import" type="Button" parent="margin/tabs/create/buttons"]
+custom_minimum_size = Vector2(50, 0)
+layout_mode = 2
+theme_override_font_sizes/font_size = 52
+disabled = true
+action_mode = 0
+text = "󰳸"
+script = ExtResource("8_1f3ce")
+
+[node name="tracks_owned" type="GridContainer" parent="margin/tabs/create" node_paths=PackedStringArray("other")]
+layout_mode = 2
+script = ExtResource("8_v6p1s")
+other = NodePath("../../play/tracks")
+editable = true
+metadata/_edit_pinned_properties_ = [&"editable"]
[node name="music" type="AudioStreamPlayer" parent="."]
stream = ExtResource("9_ma7kx")
+volume_db = -25.0
autoplay = true
bus = &"music"
+
+[connection signal="pressed" from="margin/tabs/create/buttons/new" to="margin/tabs/create/tracks_owned" method="_on_new_pressed"]
+[connection signal="import" from="margin/tabs/create/buttons/import" to="margin/tabs/create/tracks_owned" method="_on_import_import"]
diff --git a/tracks.cfg b/tracks.cfg
new file mode 100644
index 0000000..1512d26
--- /dev/null
+++ b/tracks.cfg
@@ -0,0 +1,194 @@
+[{
+"b": Array[Dictionary]([{
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 250, 20),
+"w": 14
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 250, 10),
+"w": 12
+}, {
+"b": 0,
+"m": 1,
+"t": Transform3D(-2.8213e-07, 0, 1, 0, 1, 0, -1, 0, -2.8213e-07, -10, 250, 0),
+"w": 3
+}, {
+"b": 3,
+"m": 1,
+"t": Transform3D(1.94707e-07, 0, -1, 0, 1, 0, 1, 0, 1.94707e-07, -10, 252.5, -10),
+"w": 3
+}, {
+"b": 10,
+"m": 1,
+"t": Transform3D(-5.20549e-07, 0, 1, 0, 1, 0, -1, 0, -5.20549e-07, 10, 252.5, -100),
+"w": 8
+}, {
+"b": 9,
+"m": 1,
+"t": Transform3D(-5.20549e-07, 0, 1, 0, 1, 0, -1, 0, -5.20549e-07, 10, 252.5, -90),
+"w": 4
+}, {
+"b": 1,
+"m": 1,
+"t": Transform3D(1.94707e-07, 0, -1, 0, 1, 0, 1, 0, 1.94707e-07, 20, 252.5, -90),
+"w": 1
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 252.5, -100),
+"w": 1
+}, {
+"b": 0,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 252.5, -100),
+"w": 3
+}, {
+"b": 6,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 40, 252.5, -100),
+"w": 3
+}, {
+"b": 14,
+"m": 32,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 255, 20),
+"w": 0
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 252.5, -40),
+"w": 8
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 252.5, -40),
+"w": 4
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 252.5, -50),
+"w": 8
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 252.5, -50),
+"w": 4
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 252.5, -60),
+"w": 8
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 252.5, -60),
+"w": 4
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 252.5, -70),
+"w": 8
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 252.5, -70),
+"w": 4
+}, {
+"b": 12,
+"m": 8,
+"t": Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 50, 265, -100),
+"w": 0
+}, {
+"b": 7,
+"m": 4,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 250, -80),
+"w": 10
+}, {
+"b": 15,
+"m": 0,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.1242, 252.5, -78.0318),
+"w": 0
+}, {
+"b": 10,
+"m": 1,
+"t": Transform3D(1, 0, 6.51683e-07, 0, 1, 0, -6.51683e-07, 0, 1, 140, 250, -80),
+"w": 8
+}, {
+"b": 9,
+"m": 1,
+"t": Transform3D(1, 0, 6.51683e-07, 0, 1, 0, -6.51683e-07, 0, 1, 130, 250, -80),
+"w": 4
+}, {
+"b": 1,
+"m": 1,
+"t": Transform3D(-1, 0, -3.25841e-07, 0, 1, 0, 3.25841e-07, 0, -1, 130, 250, -70),
+"w": 1
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 140, 250, -70),
+"w": 1
+}, {
+"b": 0,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 140, 250, -60),
+"w": 3
+}, {
+"b": 6,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 140, 250, -50),
+"w": 3
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 80, 250, -90),
+"w": 8
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 80, 250, -100),
+"w": 4
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 90, 250, -90),
+"w": 8
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 90, 250, -100),
+"w": 4
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 100, 250, -90),
+"w": 8
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 100, 250, -100),
+"w": 4
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 110, 250, -90),
+"w": 8
+}, {
+"b": 7,
+"m": 1,
+"t": Transform3D(1.31134e-07, 0, -1, 0, 1, 0, 1, 0, 1.31134e-07, 110, 250, -100),
+"w": 4
+}, {
+"b": 13,
+"m": 16,
+"t": Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 140, 260, -40),
+"w": 0
+}]),
+"h": 400.0,
+"l": 1,
+"n": "swonk",
+"o": Vector3(0, 1, 0),
+"x": -45,
+"y": 0
+}]
diff --git a/tracks/multilap_test.tres b/tracks/multilap_test.tres
deleted file mode 100644
index de08868..0000000
--- a/tracks/multilap_test.tres
+++ /dev/null
@@ -1,37 +0,0 @@
-[gd_resource type="Resource" script_class="TrackResource" load_steps=6 format=3 uid="uid://dwojilpcrv8me"]
-
-[ext_resource type="Script" path="res://classes/track.gd" id="1_c5h3o"]
-[ext_resource type="PackedScene" uid="uid://d4a3e1w62m3ck" path="res://scenes/ring_checkpoint.tscn" id="1_ehf5p"]
-[ext_resource type="Curve3D" uid="uid://u2f56xx8h2re" path="res://tracks/multilap_test_curve.tres" id="2_33qpi"]
-[ext_resource type="PackedScene" uid="uid://t8ywjcjgw322" path="res://scenes/ring_finish.tscn" id="2_lfdrw"]
-[ext_resource type="PackedScene" uid="uid://bsftidvcmsha0" path="res://scenes/ring_start.tscn" id="4_awtsk"]
-
-[resource]
-resource_local_to_scene = true
-script = ExtResource("1_c5h3o")
-track_width = 25.0
-lower_support_width = 25.0
-support_height = 2.0
-track = ExtResource("2_33qpi")
-left_barrier = true
-right_barrier = true
-barrier_width = 2.0
-sun_x = -50
-sun_y = 0
-overview_height = 250.0
-name = "multilap test"
-is_loop = true
-offset = Vector3(0, -2, 0)
-laps = 3
-checkpoints = Array[float]([0.2, 0.6])
-checkpoint_scene = ExtResource("1_ehf5p")
-checkpoint_scale = Vector3(1, 1, 1)
-checkpoint_needs_collision = true
-finish_location = 0.0
-finish_scene = ExtResource("2_lfdrw")
-finish_scale = Vector3(1, 1, 1)
-finish_needs_collision = true
-start_location = 0.0
-start_scene = ExtResource("4_awtsk")
-start_scale = Vector3(1, 1, 1)
-start_needs_collision = true
diff --git a/tracks/multilap_test_curve.tres b/tracks/multilap_test_curve.tres
deleted file mode 100644
index 2523886..0000000
--- a/tracks/multilap_test_curve.tres
+++ /dev/null
@@ -1,9 +0,0 @@
-[gd_resource type="Curve3D" format=3 uid="uid://u2f56xx8h2re"]
-
-[resource]
-bake_interval = 10.0
-_data = {
-"points": PackedVector3Array(110.965, 0, -2.66191, -100, 0, 0, -200, 0, 100, -100, 0, 0, 0, 0, 0, -200, 0, -100, 0, 0, 0, 100, 0, 0, 200, 0, -100, 100, 0, 0, 0, 0, 0, 200, 0, 100, 200, 0, 0, 0, 0, 0, -200, 0, 100),
-"tilts": PackedFloat32Array(1.5708, 0, 0, 0, 0)
-}
-point_count = 5
diff --git a/tracks/test.tres b/tracks/test.tres
deleted file mode 100644
index a22f705..0000000
--- a/tracks/test.tres
+++ /dev/null
@@ -1,36 +0,0 @@
-[gd_resource type="Resource" script_class="TrackResource" load_steps=6 format=3]
-
-[ext_resource type="PackedScene" uid="uid://d4a3e1w62m3ck" path="res://scenes/ring_checkpoint.tscn" id="1_ra7ed"]
-[ext_resource type="PackedScene" uid="uid://t8ywjcjgw322" path="res://scenes/ring_finish.tscn" id="2_e22em"]
-[ext_resource type="Script" path="res://classes/track.gd" id="3_o0ql2"]
-[ext_resource type="PackedScene" uid="uid://bsftidvcmsha0" path="res://scenes/ring_start.tscn" id="4_8biam"]
-[ext_resource type="Curve3D" uid="uid://cuonflkcdybj0" path="res://tracks/test_curve.tres" id="5_35ahq"]
-
-[resource]
-script = ExtResource("3_o0ql2")
-track_width = 15.0
-rail_distance = 3.0
-lower_support_width = 23.0
-support_height = 12.0
-track = ExtResource("5_35ahq")
-left_barrier = true
-right_barrier = true
-sun_x = -90
-sun_y = 0
-overview_height = 200.0
-name = "test"
-is_loop = false
-offset = Vector3(0, -2, 0)
-laps = 1
-checkpoints = Array[float]([0.5])
-checkpoint_scene = ExtResource("1_ra7ed")
-checkpoint_scale = Vector3(0.4, 0.4, 0.4)
-checkpoint_needs_collision = true
-finish_location = 1.0
-finish_scene = ExtResource("2_e22em")
-finish_scale = Vector3(0.4, 0.4, 0.4)
-finish_needs_collision = true
-start_location = 0.0
-start_scene = ExtResource("4_8biam")
-start_scale = Vector3(0.4, 0.4, 0.4)
-start_needs_collision = true
diff --git a/tracks/test_curve.tres b/tracks/test_curve.tres
deleted file mode 100644
index dfed068..0000000
--- a/tracks/test_curve.tres
+++ /dev/null
@@ -1,9 +0,0 @@
-[gd_resource type="Curve3D" format=3 uid="uid://cuonflkcdybj0"]
-
-[resource]
-bake_interval = 10.0
-_data = {
-"points": PackedVector3Array(110.965, 0, -2.66191, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
-"tilts": PackedFloat32Array(1.5708, 0)
-}
-point_count = 2
diff --git a/tracks/the fallen tramps.tres b/tracks/the fallen tramps.tres
deleted file mode 100644
index e87daa0..0000000
--- a/tracks/the fallen tramps.tres
+++ /dev/null
@@ -1,36 +0,0 @@
-[gd_resource type="Resource" script_class="TrackResource" load_steps=6 format=3]
-
-[ext_resource type="PackedScene" uid="uid://d4a3e1w62m3ck" path="res://scenes/ring_checkpoint.tscn" id="1_i8s2b"]
-[ext_resource type="PackedScene" uid="uid://t8ywjcjgw322" path="res://scenes/ring_finish.tscn" id="2_107h2"]
-[ext_resource type="Script" path="res://classes/track.gd" id="3_8gwjo"]
-[ext_resource type="PackedScene" uid="uid://bsftidvcmsha0" path="res://scenes/ring_start.tscn" id="4_7opiu"]
-[ext_resource type="Curve3D" uid="uid://2d8xnh5nyjq8" path="res://tracks/the fallen tramps_curve.tres" id="5_r5vwn"]
-
-[resource]
-script = ExtResource("3_8gwjo")
-track_width = 40.0
-rail_distance = 3.0
-lower_support_width = 25.0
-support_height = 2.0
-track = ExtResource("5_r5vwn")
-left_barrier = true
-right_barrier = true
-sun_x = -10
-sun_y = 173
-overview_height = 500.0
-name = "the fallen tramps"
-is_loop = false
-offset = Vector3(0, -200, 0)
-laps = 1
-checkpoints = Array[float]([0.3, 0.65])
-checkpoint_scene = ExtResource("1_i8s2b")
-checkpoint_scale = Vector3(1, 1, 1)
-checkpoint_needs_collision = true
-finish_location = 1.0
-finish_scene = ExtResource("2_107h2")
-finish_scale = Vector3(3, 3, 3)
-finish_needs_collision = true
-start_location = 0.02
-start_scene = ExtResource("4_7opiu")
-start_scale = Vector3(1, 1, 1)
-start_needs_collision = true
diff --git a/tracks/the fallen tramps_curve.tres b/tracks/the fallen tramps_curve.tres
deleted file mode 100644
index 19d7255..0000000
--- a/tracks/the fallen tramps_curve.tres
+++ /dev/null
@@ -1,8 +0,0 @@
-[gd_resource type="Curve3D" format=3 uid="uid://2d8xnh5nyjq8"]
-
-[resource]
-_data = {
-"points": PackedVector3Array(71.7111, -7.30142, 40.9033, -71.7111, 7.30142, -40.9033, 364.527, 34.2145, -58.2419, 80.0429, -4.87809, -46.8782, -80.0429, 4.87809, 46.8782, 111.976, 8.1174, 38.3802, 126.492, -39.8907, 104.311, -126.492, 39.8907, -104.311, -131.577, 4, 139.526, 1.75706, -40.5922, 55.4782, -1.75706, 40.5922, -55.4782, -70.4745, -12.0589, -102.896, 9.32288, 2.08416, 54.7418, 0, 0, 0, -45.7354, -31.2662, -198.668),
-"tilts": PackedFloat32Array(1.5708, 0, 0, 0, 0)
-}
-point_count = 5
diff --git a/transform_tester.tscn b/transform_tester.tscn
new file mode 100644
index 0000000..1cb4005
--- /dev/null
+++ b/transform_tester.tscn
@@ -0,0 +1,15 @@
+[gd_scene load_steps=2 format=3 uid="uid://43gqs1ukside"]
+
+[sub_resource type="GDScript" id="GDScript_bs64t"]
+script/source = "@tool
+extends Node3D
+var last_transform: Transform3D
+func _physics_process(delta: float) -> void:
+ if global_transform != last_transform:
+ last_transform = global_transform
+ print(global_transform)
+"
+
+[node name="Node3D" type="Node3D"]
+transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0)
+script = SubResource("GDScript_bs64t")
diff --git a/ui/assets/arrow.png b/ui/assets/arrow.png
new file mode 100644
index 0000000..567c636
--- /dev/null
+++ b/ui/assets/arrow.png
Binary files differ
diff --git a/ui/assets/arrow.png.import b/ui/assets/arrow.png.import
new file mode 100644
index 0000000..1229473
--- /dev/null
+++ b/ui/assets/arrow.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://vck01c83m1x3"
+path="res://.godot/imported/arrow.png-c1a859010ab81c39044cf6b8ad7e674f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/arrow.png"
+dest_files=["res://.godot/imported/arrow.png-c1a859010ab81c39044cf6b8ad7e674f.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=0
diff --git a/ui/assets/arrow_collapsed.png b/ui/assets/arrow_collapsed.png
new file mode 100644
index 0000000..86e8439
--- /dev/null
+++ b/ui/assets/arrow_collapsed.png
Binary files differ
diff --git a/ui/assets/arrow_collapsed.png.import b/ui/assets/arrow_collapsed.png.import
new file mode 100644
index 0000000..7e8a466
--- /dev/null
+++ b/ui/assets/arrow_collapsed.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://buwxt5g5y761m"
+path="res://.godot/imported/arrow_collapsed.png-c700805c6915187216de9e3d9553be50.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/arrow_collapsed.png"
+dest_files=["res://.godot/imported/arrow_collapsed.png-c700805c6915187216de9e3d9553be50.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=0
diff --git a/ui/assets/block.png b/ui/assets/block.png
new file mode 100644
index 0000000..780f003
--- /dev/null
+++ b/ui/assets/block.png
Binary files differ
diff --git a/ui/assets/block.png.import b/ui/assets/block.png.import
new file mode 100644
index 0000000..63068a6
--- /dev/null
+++ b/ui/assets/block.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cdig3xghpif81"
+path="res://.godot/imported/block.png-34c82de584421da5250c71ec6902cce5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/block.png"
+dest_files=["res://.godot/imported/block.png-34c82de584421da5250c71ec6902cce5.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=0
diff --git a/ui/assets/brush_brush.png b/ui/assets/brush_brush.png
new file mode 100644
index 0000000..2fe718a
--- /dev/null
+++ b/ui/assets/brush_brush.png
Binary files differ
diff --git a/ui/assets/brush_brush.png.import b/ui/assets/brush_brush.png.import
new file mode 100644
index 0000000..6f2b4c9
--- /dev/null
+++ b/ui/assets/brush_brush.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bn83ygj5y3d8q"
+path="res://.godot/imported/brush_brush.png-c9d496cd17c024fcddc00ab252254621.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/brush_brush.png"
+dest_files=["res://.godot/imported/brush_brush.png-c9d496cd17c024fcddc00ab252254621.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=0
diff --git a/ui/assets/brush_cursor.png b/ui/assets/brush_cursor.png
new file mode 100644
index 0000000..8391866
--- /dev/null
+++ b/ui/assets/brush_cursor.png
Binary files differ
diff --git a/ui/assets/brush_cursor.png.import b/ui/assets/brush_cursor.png.import
new file mode 100644
index 0000000..f570533
--- /dev/null
+++ b/ui/assets/brush_cursor.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dmxtfr7xfkpyf"
+path="res://.godot/imported/brush_cursor.png-fa8eac23002aee43b964d7cf8dc58331.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/brush_cursor.png"
+dest_files=["res://.godot/imported/brush_cursor.png-fa8eac23002aee43b964d7cf8dc58331.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=0
diff --git a/ui/assets/brush_handle.png b/ui/assets/brush_handle.png
new file mode 100644
index 0000000..8311e67
--- /dev/null
+++ b/ui/assets/brush_handle.png
Binary files differ
diff --git a/ui/assets/brush_handle.png.import b/ui/assets/brush_handle.png.import
new file mode 100644
index 0000000..935d73b
--- /dev/null
+++ b/ui/assets/brush_handle.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dfmcv080xpxdl"
+path="res://.godot/imported/brush_handle.png-0f6067ed24cfe8f5e83a3faa087436a7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/brush_handle.png"
+dest_files=["res://.godot/imported/brush_handle.png-0f6067ed24cfe8f5e83a3faa087436a7.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=0
diff --git a/ui/assets/brush_outline.png b/ui/assets/brush_outline.png
new file mode 100644
index 0000000..c04e76f
--- /dev/null
+++ b/ui/assets/brush_outline.png
Binary files differ
diff --git a/ui/assets/brush_outline.png.import b/ui/assets/brush_outline.png.import
new file mode 100644
index 0000000..8a7a406
--- /dev/null
+++ b/ui/assets/brush_outline.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ce5kkd4bg17wl"
+path="res://.godot/imported/brush_outline.png-49f7984e288c9bc5681701dee450b830.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/brush_outline.png"
+dest_files=["res://.godot/imported/brush_outline.png-49f7984e288c9bc5681701dee450b830.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=0
diff --git a/ui/assets/button_focus.stylebox b/ui/assets/button_focus.stylebox
index eb4aa4f..4387fd7 100644
--- a/ui/assets/button_focus.stylebox
+++ b/ui/assets/button_focus.stylebox
Binary files differ
diff --git a/ui/assets/checkbox.png b/ui/assets/checkbox.png
new file mode 100644
index 0000000..fe0547e
--- /dev/null
+++ b/ui/assets/checkbox.png
Binary files differ
diff --git a/ui/assets/checkbox.png.import b/ui/assets/checkbox.png.import
new file mode 100644
index 0000000..2bf89bb
--- /dev/null
+++ b/ui/assets/checkbox.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ch6jipulckgt"
+path="res://.godot/imported/checkbox.png-c14cb06d9c3286d63a27db855cb89069.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/checkbox.png"
+dest_files=["res://.godot/imported/checkbox.png-c14cb06d9c3286d63a27db855cb89069.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=0
diff --git a/ui/assets/checkbox_disabled.png b/ui/assets/checkbox_disabled.png
new file mode 100644
index 0000000..b031121
--- /dev/null
+++ b/ui/assets/checkbox_disabled.png
Binary files differ
diff --git a/ui/assets/checkbox_disabled.png.import b/ui/assets/checkbox_disabled.png.import
new file mode 100644
index 0000000..b2a63d4
--- /dev/null
+++ b/ui/assets/checkbox_disabled.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cvhkgqjcmjhjf"
+path="res://.godot/imported/checkbox_disabled.png-08d27cd74e99582f759969689f4a2fd7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/checkbox_disabled.png"
+dest_files=["res://.godot/imported/checkbox_disabled.png-08d27cd74e99582f759969689f4a2fd7.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=0
diff --git a/ui/assets/checkedbox.png b/ui/assets/checkedbox.png
new file mode 100644
index 0000000..dad30f9
--- /dev/null
+++ b/ui/assets/checkedbox.png
Binary files differ
diff --git a/ui/assets/checkedbox.png.import b/ui/assets/checkedbox.png.import
new file mode 100644
index 0000000..f494516
--- /dev/null
+++ b/ui/assets/checkedbox.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bi5378730g7ag"
+path="res://.godot/imported/checkedbox.png-c7ced4ce87805f0381d0e4a7130348e4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/checkedbox.png"
+dest_files=["res://.godot/imported/checkedbox.png-c7ced4ce87805f0381d0e4a7130348e4.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=0
diff --git a/ui/assets/clip.png b/ui/assets/clip.png
new file mode 100644
index 0000000..e960ed2
--- /dev/null
+++ b/ui/assets/clip.png
Binary files differ
diff --git a/ui/assets/clip.png.import b/ui/assets/clip.png.import
new file mode 100644
index 0000000..c3bf052
--- /dev/null
+++ b/ui/assets/clip.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cvivkif8cfior"
+path="res://.godot/imported/clip.png-0e862b6381da7e371d0a70f0286b6bce.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/clip.png"
+dest_files=["res://.godot/imported/clip.png-0e862b6381da7e371d0a70f0286b6bce.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=0
diff --git a/ui/assets/folder.png b/ui/assets/folder.png
new file mode 100644
index 0000000..5ac3436
--- /dev/null
+++ b/ui/assets/folder.png
Binary files differ
diff --git a/ui/assets/folder.png.import b/ui/assets/folder.png.import
new file mode 100644
index 0000000..6451cb9
--- /dev/null
+++ b/ui/assets/folder.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dnme45d0b1fdc"
+path="res://.godot/imported/folder.png-8ad84da84d6c4a86f78724bb7715cc62.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/folder.png"
+dest_files=["res://.godot/imported/folder.png-8ad84da84d6c4a86f78724bb7715cc62.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=0
diff --git a/ui/assets/material.png b/ui/assets/material.png
new file mode 100644
index 0000000..bd6fe66
--- /dev/null
+++ b/ui/assets/material.png
Binary files differ
diff --git a/ui/assets/material.png.import b/ui/assets/material.png.import
new file mode 100644
index 0000000..ded0455
--- /dev/null
+++ b/ui/assets/material.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bn8rio453wjy7"
+path="res://.godot/imported/material.png-68b53141bfb99e62143e3d80ab0e8f57.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ui/assets/material.png"
+dest_files=["res://.godot/imported/material.png-68b53141bfb99e62143e3d80ab0e8f57.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=0
diff --git a/ui/boldsans.tres b/ui/boldsans.tres
index c8d6596..5e2a6d1 100644
--- a/ui/boldsans.tres
+++ b/ui/boldsans.tres
@@ -1,4 +1,8 @@
-[gd_resource type="FontVariation" format=3 uid="uid://ba8ab6dti2fvo"]
+[gd_resource type="FontVariation" load_steps=2 format=3 uid="uid://ba8ab6dti2fvo"]
+
+[sub_resource type="SystemFont" id="SystemFont_nttbt"]
+font_names = PackedStringArray("Sans-Serif")
[resource]
+base_font = SubResource("SystemFont_nttbt")
variation_embolden = 1.5
diff --git a/ui/editor/back_button.gd b/ui/editor/back_button.gd
new file mode 100644
index 0000000..e684ac6
--- /dev/null
+++ b/ui/editor/back_button.gd
@@ -0,0 +1,29 @@
+extends Button
+
+signal back
+
+func _on_pressed() -> void:
+ if %save.unsaved:
+ var dialog := ConfirmationDialog.new()
+ dialog.min_size = Vector2(350, 100)
+ dialog.exclusive = true
+ dialog.title = "Are you sure!"
+ dialog.dialog_text = "You have unsaved changes!\nConsider saving first."
+ dialog.cancel_button_text = "wait no"
+ dialog.ok_button_text = "go ahead"
+ dialog.dialog_hide_on_ok = false
+ dialog.dialog_close_on_escape = false
+ dialog.unresizable = true
+ dialog.popup_window = true
+ dialog.initial_position = Window.WINDOW_INITIAL_POSITION_CENTER_MAIN_WINDOW_SCREEN
+ dialog.add_theme_stylebox_override("panel", preload("res://ui/panel_dark.stylebox"))
+ add_child(dialog)
+ dialog.show()
+ dialog.confirmed.connect(emit_signal.bind(&"back"))
+ dialog.canceled.connect(dialog.queue_free)
+ dialog.confirmed.connect(dialog.queue_free)
+ else:
+ back.emit()
+
+
+
diff --git a/ui/editor/bar_button.tres b/ui/editor/bar_button.tres
new file mode 100644
index 0000000..be76a10
--- /dev/null
+++ b/ui/editor/bar_button.tres
@@ -0,0 +1,15 @@
+[gd_resource type="Theme" load_steps=2 format=3 uid="uid://bds815vxta4ma"]
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rrkw8"]
+
+[resource]
+Button/colors/font_color = Color(0.870588, 0.831373, 0.698039, 1)
+Button/colors/font_focus_color = Color(0.992157, 0.964706, 0.890196, 1)
+Button/colors/font_hover_color = Color(0.992157, 0.964706, 0.890196, 1)
+Button/colors/font_hover_pressed_color = Color(0.992157, 0.964706, 0.890196, 1)
+Button/colors/font_pressed_color = Color(0.14902, 0.545098, 0.823529, 1)
+Button/styles/disabled = SubResource("StyleBoxEmpty_rrkw8")
+Button/styles/focus = SubResource("StyleBoxEmpty_rrkw8")
+Button/styles/hover = SubResource("StyleBoxEmpty_rrkw8")
+Button/styles/normal = SubResource("StyleBoxEmpty_rrkw8")
+Button/styles/pressed = SubResource("StyleBoxEmpty_rrkw8")
diff --git a/ui/editor/block_dragdrop_preview.gd b/ui/editor/block_dragdrop_preview.gd
new file mode 100644
index 0000000..05a21f2
--- /dev/null
+++ b/ui/editor/block_dragdrop_preview.gd
@@ -0,0 +1,78 @@
+extends Control
+class_name DragDropPreview
+
+var blocks: Array[Block] = []
+var objects: Array[Block]
+var offsets: PackedVector3Array = []
+var offsets_unset := false
+var cam: Camera3D
+var previews: Node3D
+
+func get_columns(x: int) -> int:
+ return floori(sqrt(x))
+
+func init(textures: Array[Texture2D], p_cam: Camera3D):
+ cam = p_cam
+ var columns := get_columns(textures.size())
+ %grid.columns = columns
+ for i in columns * columns:
+ var t_rect := TextureRect.new()
+ t_rect.size_flags_horizontal = SIZE_EXPAND
+ t_rect.size_flags_vertical = SIZE_EXPAND
+ t_rect.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
+ t_rect.texture = textures[i]
+ @warning_ignore("integer_division")
+ t_rect.custom_minimum_size = Vector2(64/columns, 64/columns)
+ %grid.add_child(t_rect)
+ return self
+
+func _ready() -> void:
+ await get_tree().physics_frame
+ var data = get_viewport().gui_get_drag_data()
+ if (
+ data is Array
+ and data.size() == 2
+ and data[0] is Array[TrackObject]
+ and data[1] is PackedVector3Array
+ and data[0].size() == data[1].size()
+ ):
+ mkobjs(data[0])
+ offsets = data[1]
+ elif data is Array[TrackObject]:
+ mkobjs(data)
+ offsets_unset = true
+ tree_exiting.connect(cleanup)
+
+func cleanup() -> void:
+ for block in blocks: block.queue_free()
+
+func mkobjs(objs: Array[TrackObject]):
+ for obj in objs:
+ var block: Block = obj.create(true)
+ add_child(block)
+ block.hide()
+ blocks.append(block)
+
+func over_viewport():
+ if blocks.is_empty():
+ return
+ %panel.hide()
+ for block in blocks: block.show()
+
+func viewport_event(e: InputEvent) -> void:
+ if e is InputEventMouse:
+ position_blocks(e.position)
+
+func position_blocks(mp: Vector2):
+ var at_position := cam.project_position(mp, 50)
+ for i in len(blocks):
+ blocks[i].global_position = (
+ (offsets[i] + at_position)
+ if not offsets_unset
+ else at_position
+ ).snapped(Globals.SNAP)
+
+func exit_viewport() -> void:
+ %panel.show()
+ for block in blocks:
+ block.hide()
diff --git a/ui/editor/block_dragdrop_preview.tscn b/ui/editor/block_dragdrop_preview.tscn
new file mode 100644
index 0000000..28aca7e
--- /dev/null
+++ b/ui/editor/block_dragdrop_preview.tscn
@@ -0,0 +1,49 @@
+[gd_scene load_steps=4 format=3 uid="uid://br4clathh5ppo"]
+
+[ext_resource type="Script" path="res://ui/editor/block_dragdrop_preview.gd" id="1_svugf"]
+[ext_resource type="Texture2D" uid="uid://cvivkif8cfior" path="res://ui/assets/clip.png" id="2_hvrcj"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_p80jk"]
+content_margin_left = 4.0
+content_margin_top = 4.0
+content_margin_right = 4.0
+content_margin_bottom = 4.0
+bg_color = Color(0.027451, 0.211765, 0.258824, 1)
+corner_radius_top_left = 15
+corner_radius_top_right = 15
+corner_radius_bottom_right = 15
+corner_radius_bottom_left = 15
+
+[node name="preview" type="Control"]
+layout_mode = 3
+anchors_preset = 0
+offset_left = 4.0
+offset_top = 4.0
+offset_right = 68.0
+offset_bottom = 68.0
+script = ExtResource("1_svugf")
+
+[node name="panel" type="PanelContainer" parent="."]
+unique_name_in_owner = true
+clip_children = 2
+layout_mode = 0
+offset_right = 72.0
+offset_bottom = 72.0
+theme_override_styles/panel = SubResource("StyleBoxFlat_p80jk")
+
+[node name="clip" type="TextureRect" parent="panel"]
+clip_children = 1
+layout_mode = 2
+texture = ExtResource("2_hvrcj")
+expand_mode = 1
+
+[node name="grid" type="GridContainer" parent="panel/clip"]
+unique_name_in_owner = true
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_constants/h_separation = 0
+theme_override_constants/v_separation = 0
diff --git a/ui/editor/brush.gd b/ui/editor/brush.gd
new file mode 100644
index 0000000..0270b38
--- /dev/null
+++ b/ui/editor/brush.gd
@@ -0,0 +1,39 @@
+extends MultiButton
+class_name Brush
+
+@onready var brush: TextureRect = $brush
+@onready var outline: TextureRect = $outline
+@export var cursor: Texture
+
+func set_c(c: Color) -> void:
+ if disabled:
+ brush.modulate = c
+ if not button_pressed:
+ secondary.modulate = c
+ outline.visible = button_pressed
+
+var mat: int = 0
+
+func _can_drop_data(_at_position: Vector2, data: Variant) -> bool:
+ return data is WeakLink and data.type == WeakLink.Type.Material
+
+func _drop_data(_at_position: Vector2, data: Variant) -> void:
+ mat = data.material
+ brush.modulate = data.material_color
+ disabled = false
+
+func _gui_input(event: InputEvent) -> void:
+ if event is InputEventMouseButton and event.is_pressed() and event.button_index == MOUSE_BUTTON_RIGHT:
+ mat = 0
+ reset()
+
+func reset() -> void:
+ button_pressed = false
+ disabled = true
+
+func _toggled(on: bool) -> void:
+ Input.set_custom_mouse_cursor(cursor if on else null, Input.CURSOR_ARROW)
+
+func _on_mousecast_hit(colls: Array) -> void:
+ if colls.is_empty():
+ button_pressed = false
diff --git a/ui/editor/cam.gd b/ui/editor/cam.gd
new file mode 100644
index 0000000..88c9ba8
--- /dev/null
+++ b/ui/editor/cam.gd
@@ -0,0 +1,48 @@
+extends Camera3D
+
+var freelook := false;
+var panning := false;
+var mp_before_freelook := Vector2.ZERO;
+const MOUSE_SENSITIVTY = 0.02;
+const PAN_SENSITIVITY = 0.5;
+const SCROLL_SENS = 2;
+const CAMERA_MAX_ROTATION_ANGLE = deg_to_rad(70);
+
+var m_vel := Vector2.ZERO
+@onready var last_m_pos := get_viewport().get_mouse_position()
+
+func _process(_delta):
+ m_vel = get_viewport().get_mouse_position() - last_m_pos
+ last_m_pos = get_viewport().get_mouse_position()
+ if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
+ if Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED:
+ mp_before_freelook = get_viewport().get_mouse_position()
+ Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED);
+ freelook = true;
+ elif Input.is_action_pressed("ui_pan"):
+ var vel := m_vel * PAN_SENSITIVITY
+ position -= (transform.basis.x * vel.x)
+ position += (transform.basis.y * vel.y)
+ panning = true
+ else:
+ if Input.get_mouse_mode() != Input.MOUSE_MODE_VISIBLE:
+ Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE);
+ freelook = false;
+ get_viewport().warp_mouse(mp_before_freelook)
+ panning = false
+
+func _input(event: InputEvent):
+ if freelook and event is InputEventMouseMotion:
+ rotation.x = clamp(rotation.x + (-event.relative.y * MOUSE_SENSITIVTY), -CAMERA_MAX_ROTATION_ANGLE, CAMERA_MAX_ROTATION_ANGLE);
+ rotation.y += -event.relative.x * MOUSE_SENSITIVTY;
+ elif event is InputEventMouseButton:
+ match event.button_index:
+ # camera zoom
+ MOUSE_BUTTON_WHEEL_UP: global_position -= global_transform.basis.z * SCROLL_SENS
+ MOUSE_BUTTON_WHEEL_DOWN: global_position += global_transform.basis.z * SCROLL_SENS
+ elif event is InputEventMouseMotion and panning:
+ var v := get_viewport()
+ var mp := v.get_mouse_position()
+ if not Rect2(Vector2(), v.size).grow(-15).has_point(mp):
+ v.warp_mouse(mp.posmodv(v.size))
+ last_m_pos = mp.posmodv(v.size)
diff --git a/ui/editor/cameras/right_slant_cam.tscn b/ui/editor/cameras/right_slant_cam.tscn
new file mode 100644
index 0000000..a335c13
--- /dev/null
+++ b/ui/editor/cameras/right_slant_cam.tscn
@@ -0,0 +1,4 @@
+[gd_scene format=3 uid="uid://cs057imd63df0"]
+
+[node name="camera" type="Camera3D"]
+transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, 0, 4, 12)
diff --git a/ui/editor/cameras/side_far_cam.tscn b/ui/editor/cameras/side_far_cam.tscn
new file mode 100644
index 0000000..055fb1b
--- /dev/null
+++ b/ui/editor/cameras/side_far_cam.tscn
@@ -0,0 +1,4 @@
+[gd_scene format=3 uid="uid://bb56nmgmi1i74"]
+
+[node name="camera" type="Camera3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30)
diff --git a/ui/editor/cameras/side_slant_cam.tscn b/ui/editor/cameras/side_slant_cam.tscn
new file mode 100644
index 0000000..bbe3500
--- /dev/null
+++ b/ui/editor/cameras/side_slant_cam.tscn
@@ -0,0 +1,4 @@
+[gd_scene format=3 uid="uid://cb46aartkefse"]
+
+[node name="camera" type="Camera3D"]
+transform = Transform3D(-1, 3.69465e-08, -7.92319e-08, 0, 0.906308, 0.422618, 8.74228e-08, 0.422618, -0.906308, 0, 4, -12)
diff --git a/ui/editor/cameras/tall_right_slant_cam.tscn b/ui/editor/cameras/tall_right_slant_cam.tscn
new file mode 100644
index 0000000..1b4324f
--- /dev/null
+++ b/ui/editor/cameras/tall_right_slant_cam.tscn
@@ -0,0 +1,4 @@
+[gd_scene format=3 uid="uid://opcnps6psy07"]
+
+[node name="camera" type="Camera3D"]
+transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, 0, 6, 12)
diff --git a/ui/editor/cameras/tall_side_slant_cam.tscn b/ui/editor/cameras/tall_side_slant_cam.tscn
new file mode 100644
index 0000000..388736f
--- /dev/null
+++ b/ui/editor/cameras/tall_side_slant_cam.tscn
@@ -0,0 +1,4 @@
+[gd_scene format=3 uid="uid://ccfnlmu6xnhxg"]
+
+[node name="camera" type="Camera3D"]
+transform = Transform3D(-1, 3.69465e-08, -7.92319e-08, 0, 0.906308, 0.422618, 8.74228e-08, 0.422618, -0.906308, 0, 6, -12)
diff --git a/ui/editor/cameras/topdown_cam.tscn b/ui/editor/cameras/topdown_cam.tscn
new file mode 100644
index 0000000..780bb8e
--- /dev/null
+++ b/ui/editor/cameras/topdown_cam.tscn
@@ -0,0 +1,4 @@
+[gd_scene format=3 uid="uid://urgqw6yoy4f5"]
+
+[node name="camera" type="Camera3D"]
+transform = Transform3D(-4.37114e-08, 1, 4.37114e-08, 0, -4.37114e-08, 1, 1, 4.37114e-08, 1.91069e-15, 0, 10, 0)
diff --git a/ui/editor/delete.gd b/ui/editor/delete.gd
new file mode 100644
index 0000000..689bbc9
--- /dev/null
+++ b/ui/editor/delete.gd
@@ -0,0 +1,17 @@
+extends Button
+
+@onready var hist: UndoRedo = owner.history
+@onready var editor: TrackEditor = owner
+
+func _on_selection_changed(nodes: Array[TrackObject]):
+ disabled = nodes.size() == 0
+
+func _pressed() -> void:
+ hist.create_action("delete %d nodes" % editor.selected.size())
+ for tobj in editor.selected:
+ var node := tobj.live_node
+ hist.add_do_method(%view.remove_obj.bind(tobj))
+ hist.add_undo_reference(node)
+ hist.add_undo_method(%view.add_obj.bind(tobj))
+ hist.commit_action()
+ disabled = true
diff --git a/ui/editor/duplicate.gd b/ui/editor/duplicate.gd
new file mode 100644
index 0000000..142d0f9
--- /dev/null
+++ b/ui/editor/duplicate.gd
@@ -0,0 +1,23 @@
+extends Button
+
+@onready var editor: TrackEditor = owner
+
+func _on_selection_changed(nodes: Array[TrackObject]):
+ disabled = nodes.size() == 0
+
+func _pressed() -> void:
+ var links: Array[FileItem] = [] # map doesnt work with typed arrays
+ var selected_dup: Array[TrackObject] = []
+ var positions: PackedVector3Array = []
+ selected_dup.resize(len(editor.selected))
+ positions.resize(len(editor.selected))
+ links.resize(len(editor.selected))
+ var first_p := editor.selected[0].live_node.global_position
+ for i in len(editor.selected):
+ positions[i] = editor.selected[i].live_node.global_position - first_p
+ links[i] = editor.selected[i].link
+ selected_dup[i] = editor.selected[i].dup()
+ force_drag(
+ [selected_dup, positions],
+ %items.make_drag_preview(Items.get_thumbs(links))
+ )
diff --git a/ui/editor/editor_fs.tres b/ui/editor/editor_fs.tres
new file mode 100644
index 0000000..210d261
--- /dev/null
+++ b/ui/editor/editor_fs.tres
@@ -0,0 +1,218 @@
+[gd_resource type="Resource" script_class="DirRes" load_steps=45 format=3 uid="uid://qxacdpu7fkgb"]
+
+[ext_resource type="PackedScene" uid="uid://cy2ialm17md6c" path="res://assets/blocks/ring_start.tscn" id="1_obh5s"]
+[ext_resource type="Script" path="res://classes/resources/link.gd" id="2_vbck3"]
+[ext_resource type="Script" path="res://classes/resources/dir.gd" id="3_5we13"]
+[ext_resource type="PackedScene" uid="uid://behu0a0iegwov" path="res://assets/blocks/ring_checkpoint.tscn" id="4_t7omt"]
+[ext_resource type="PackedScene" uid="uid://bm7dvglsg6cxo" path="res://assets/blocks/ring_finish.tscn" id="5_wj8by"]
+[ext_resource type="PackedScene" uid="uid://bpve5rga4f5ts" path="res://assets/blocks/platform_corner.tscn" id="6_rprvw"]
+[ext_resource type="PackedScene" uid="uid://d0bnqhv1caak3" path="res://assets/blocks/platform_depression.tscn" id="7_2mb8w"]
+[ext_resource type="PackedScene" uid="uid://ceo1o8kfhqnxy" path="res://assets/blocks/platform_diagonal.tscn" id="8_2o3rf"]
+[ext_resource type="PackedScene" uid="uid://cb70byabne8d" path="res://assets/blocks/platform_poke.tscn" id="9_lc43u"]
+[ext_resource type="PackedScene" uid="uid://ci24eqfa38cy4" path="res://assets/blocks/platform_ramp.tscn" id="10_f1l1g"]
+[ext_resource type="PackedScene" uid="uid://cotdon210bw6c" path="res://assets/blocks/platform_square.tscn" id="12_aumqd"]
+[ext_resource type="PackedScene" uid="uid://dtmmpkwtlvovq" path="res://assets/blocks/platform_turn_1x1.tscn" id="13_niuro"]
+[ext_resource type="PackedScene" uid="uid://c7xxrp8ml2ku1" path="res://assets/blocks/platform_x.tscn" id="14_nfuay"]
+[ext_resource type="PackedScene" uid="uid://bs7iubbwrs78d" path="res://assets/blocks/platform_poke_corner.tscn" id="15_5g7y2"]
+[ext_resource type="PackedScene" uid="uid://ct733wlw6osxl" path="res://assets/blocks/platform_booster.tscn" id="15_22aj3"]
+[ext_resource type="PackedScene" uid="uid://bawi544gebahm" path="res://assets/blocks/platform_turn_3x3.tscn" id="16_sarxg"]
+[ext_resource type="PackedScene" uid="uid://dqxgxdxibvabe" path="res://assets/blocks/platform_turn_2x2.tscn" id="17_3cq3g"]
+[ext_resource type="PackedScene" uid="uid://d2nwkpdn3gnx3" path="res://assets/blocks/tree.tscn" id="19_vck13"]
+
+[sub_resource type="Resource" id="Resource_8f0v1"]
+resource_name = "ring start"
+script = ExtResource("2_vbck3")
+scene = ExtResource("1_obh5s")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "A torus shaped start"
+
+[sub_resource type="Resource" id="Resource_fmplp"]
+resource_name = "starts"
+script = ExtResource("3_5we13")
+files = Array[Resource("res://classes/resources/file_item.gd")]([SubResource("Resource_8f0v1")])
+description = "Start (you need one of these)"
+
+[sub_resource type="Resource" id="Resource_r3xn4"]
+resource_name = "ring checkpoint"
+script = ExtResource("2_vbck3")
+scene = ExtResource("4_t7omt")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "A torus shaped checkpoint"
+
+[sub_resource type="Resource" id="Resource_0yv1r"]
+resource_name = "checkpoints"
+script = ExtResource("3_5we13")
+files = Array[Resource("res://classes/resources/file_item.gd")]([SubResource("Resource_r3xn4")])
+description = "Checkpoints"
+
+[sub_resource type="Resource" id="Resource_kvgvy"]
+resource_name = "ring finish"
+script = ExtResource("2_vbck3")
+scene = ExtResource("5_wj8by")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "A torus shaped finish"
+
+[sub_resource type="Resource" id="Resource_kak46"]
+resource_name = "finishes"
+script = ExtResource("3_5we13")
+files = Array[Resource("res://classes/resources/file_item.gd")]([SubResource("Resource_kvgvy")])
+description = "Finishes (you need one of these)"
+
+[sub_resource type="Resource" id="Resource_4d15v"]
+resource_name = "square"
+script = ExtResource("2_vbck3")
+scene = ExtResource("12_aumqd")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "Square, flat platform"
+
+[sub_resource type="Resource" id="Resource_wrtlo"]
+resource_name = "corner"
+script = ExtResource("2_vbck3")
+scene = ExtResource("6_rprvw")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "A sharp corner piece, very poky"
+
+[sub_resource type="Resource" id="Resource_oxmos"]
+resource_name = "depression"
+script = ExtResource("2_vbck3")
+scene = ExtResource("7_2mb8w")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "Lowers a corner down a level"
+
+[sub_resource type="Resource" id="Resource_l3v8g"]
+resource_name = "diagonal"
+script = ExtResource("2_vbck3")
+scene = ExtResource("8_2o3rf")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "A slanted block"
+
+[sub_resource type="Resource" id="Resource_ub3e2"]
+resource_name = "poke"
+script = ExtResource("2_vbck3")
+scene = ExtResource("9_lc43u")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "The opposite of the depression; Raises a corner up a level"
+
+[sub_resource type="Resource" id="Resource_ycvki"]
+resource_name = "poke corner"
+script = ExtResource("2_vbck3")
+scene = ExtResource("15_5g7y2")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "A poky corner"
+
+[sub_resource type="Resource" id="Resource_1w0pw"]
+resource_name = "ramp"
+script = ExtResource("2_vbck3")
+scene = ExtResource("10_f1l1g")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "Like the diagonal piece, but with a base."
+
+[sub_resource type="Resource" id="Resource_5ko53"]
+resource_name = "1x1 turn"
+script = ExtResource("2_vbck3")
+scene = ExtResource("13_niuro")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "Smooth turn"
+
+[sub_resource type="Resource" id="Resource_hk5rh"]
+resource_name = "x"
+script = ExtResource("2_vbck3")
+scene = ExtResource("14_nfuay")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "X shaped block"
+
+[sub_resource type="Resource" id="Resource_l415k"]
+resource_name = "booster"
+script = ExtResource("2_vbck3")
+scene = ExtResource("15_22aj3")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "Forces the car in a direction with moderate force"
+
+[sub_resource type="Resource" id="Resource_avoux"]
+resource_name = "3x3 turn"
+script = ExtResource("2_vbck3")
+scene = ExtResource("16_sarxg")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "A wide turn."
+
+[sub_resource type="Resource" id="Resource_lc4fe"]
+resource_name = "2x2 turn"
+script = ExtResource("2_vbck3")
+scene = ExtResource("17_3cq3g")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = "A slightly wide turn."
+
+[sub_resource type="Resource" id="Resource_xovbr"]
+resource_name = "platform"
+script = ExtResource("3_5we13")
+files = Array[Resource("res://classes/resources/file_item.gd")]([SubResource("Resource_4d15v"), SubResource("Resource_wrtlo"), SubResource("Resource_oxmos"), SubResource("Resource_l3v8g"), SubResource("Resource_ub3e2"), SubResource("Resource_ycvki"), SubResource("Resource_1w0pw"), SubResource("Resource_5ko53"), SubResource("Resource_hk5rh"), SubResource("Resource_l415k"), SubResource("Resource_avoux"), SubResource("Resource_lc4fe")])
+description = "Platforms (you can add barriers with the wall tool)"
+
+[sub_resource type="Resource" id="Resource_ax7gx"]
+resource_name = "road"
+script = ExtResource("3_5we13")
+files = Array[Resource("res://classes/resources/file_item.gd")]([SubResource("Resource_xovbr")])
+description = "Road building blocks"
+
+[sub_resource type="Resource" id="Resource_x8ami"]
+resource_name = "platform"
+script = ExtResource("2_vbck3")
+material = 1
+material_color = Color(0.392157, 0.392157, 0.392157, 1)
+description = "platform material.
+very sturdy."
+
+[sub_resource type="Resource" id="Resource_y68us"]
+resource_name = "road"
+script = ExtResource("2_vbck3")
+material = 2
+material_color = Color(0.266667, 0.364706, 0.372549, 1)
+description = "Platform with a road texture."
+
+[sub_resource type="Resource" id="Resource_jyrtx"]
+resource_name = "grass"
+script = ExtResource("2_vbck3")
+material = 4
+material_color = Color(0.439216, 0.760784, 0.439216, 1)
+description = "Touch it."
+
+[sub_resource type="Resource" id="Resource_sbgew"]
+resource_name = "materials"
+script = ExtResource("3_5we13")
+files = Array[Resource("res://classes/resources/file_item.gd")]([SubResource("Resource_x8ami"), SubResource("Resource_y68us"), SubResource("Resource_jyrtx")])
+description = "Materials"
+
+[sub_resource type="Resource" id="Resource_vtfgn"]
+resource_name = "tree"
+script = ExtResource("2_vbck3")
+scene = ExtResource("19_vck13")
+material = 0
+material_color = Color(0, 0, 0, 1)
+description = ""
+
+[sub_resource type="Resource" id="Resource_77r1h"]
+resource_name = "decoration"
+script = ExtResource("3_5we13")
+files = Array[Resource("res://classes/resources/file_item.gd")]([SubResource("Resource_vtfgn")])
+description = "Decorations"
+
+[resource]
+resource_name = "editor filesystem"
+script = ExtResource("3_5we13")
+files = Array[Resource("res://classes/resources/file_item.gd")]([SubResource("Resource_fmplp"), SubResource("Resource_0yv1r"), SubResource("Resource_kak46"), SubResource("Resource_ax7gx"), SubResource("Resource_sbgew"), SubResource("Resource_77r1h")])
+description = "Blocks"
diff --git a/ui/editor/export.gd b/ui/editor/export.gd
new file mode 100644
index 0000000..d62aaaa
--- /dev/null
+++ b/ui/editor/export.gd
@@ -0,0 +1,33 @@
+extends Button
+class_name EditorMarshalling
+
+@onready var editor: TrackEditor = owner
+
+func _pressed() -> void:
+ var enc := EditorMarshalling.td2s(editor.to_trackdata())
+ print_rich("exporting to `[code]%s[/code]`" % enc) # for funny clipboard shenanigans
+ DisplayServer.clipboard_set(enc)
+
+static func td2s(td: TrackResource) -> String:
+ var buf := var_to_bytes(td.to_d())
+ var buf_c := buf.compress(FileAccess.COMPRESSION_DEFLATE)
+ return "%s|%s" % [Marshalls.raw_to_base64(buf_c), String.num_uint64(buf.size(), 16)]
+
+static func s2td(s: String) -> TrackResource:
+ var split := s.lstrip('`').rstrip('`').strip_edges().split("|", false, 1)
+ if not split.size() || split[0].length() < 100:
+ return null
+ var buf := Marshalls.base64_to_raw(split[0])
+ if buf.size() < 100:
+ return
+ var decompressed: PackedByteArray = []
+ if split.size() > 1 and split[1].length() < 20 and split[1].hex_to_int() > 0:
+ decompressed = buf.decompress(split[1].hex_to_int(), FileAccess.COMPRESSION_DEFLATE)
+ else: # size unknown!
+ decompressed = buf.decompress_dynamic(51200, FileAccess.COMPRESSION_DEFLATE)
+ if decompressed.size() < 4:
+ return null
+ var d = bytes_to_var(decompressed)
+ if d is Dictionary:
+ return TrackResource.from_d(d)
+ return null
diff --git a/ui/editor/group.tres b/ui/editor/group.tres
new file mode 100644
index 0000000..ec18dad
--- /dev/null
+++ b/ui/editor/group.tres
@@ -0,0 +1,3 @@
+[gd_resource type="ButtonGroup" format=3 uid="uid://oio3aly7aeny"]
+
+[resource]
diff --git a/ui/editor/hatch.gd b/ui/editor/hatch.gd
new file mode 100644
index 0000000..28bafeb
--- /dev/null
+++ b/ui/editor/hatch.gd
@@ -0,0 +1,54 @@
+extends SubViewportContainer
+
+@onready var history: UndoRedo = owner.history
+
+signal created(object: TrackObject)
+signal remove_tobj(tobj: TrackObject)
+
+func _can_drop_data(_at_position: Vector2, data) -> bool:
+ return (
+ data is Array
+ and data.size() == 2
+ and data[0] is Array[TrackObject]
+ and data[1] is PackedVector3Array
+ and data[0].size() == data[1].size()
+ ) or data is Array[TrackObject]
+
+
+func _drop_data(at_position: Vector2, data) -> void:
+ var objs: Array[TrackObject]
+ var offsets: PackedVector3Array = []
+ var offsets_unset := false
+ if (
+ data is Array
+ and data.size() == 2
+ and data[0] is Array[TrackObject]
+ and data[1] is PackedVector3Array
+ and data[0].size() == data[1].size()
+ ):
+ objs = data[0]
+ offsets = data[1]
+ elif data is Array[TrackObject]:
+ objs = data
+ offsets_unset = true
+ history.create_action("add blocks");
+ for i in len(objs):
+ var obj := objs[i]
+ var node: Block = obj.create(true)
+ var projected: Vector3 = %cam.project_position(at_position, 50)
+ var pos := (projected + offsets[i] if not offsets_unset else projected).snapped(Globals.SNAP)
+ obj.set_live(node)
+ history.add_do_method(add_obj.bind(obj, pos))
+ history.add_undo_method(remove_obj.bind(obj))
+ history.add_do_reference(node)
+ history.commit_action()
+
+func add_obj(o: TrackObject, pos = null):
+ %port.add_child(o.live_node)
+ if pos is Vector3:
+ o.live_node.global_position = pos
+ created.emit(o)
+
+func remove_obj(o: TrackObject):
+ remove_tobj.emit(o)
+ %port.remove_child(o.live_node)
diff --git a/ui/editor/import.gd b/ui/editor/import.gd
new file mode 100644
index 0000000..d184847
--- /dev/null
+++ b/ui/editor/import.gd
@@ -0,0 +1,16 @@
+extends Button
+
+signal import(trck: TrackResource)
+
+var trck: TrackResource = null
+var last_checked: String
+
+func _process(_delta: float) -> void:
+ if last_checked != DisplayServer.clipboard_get():
+ trck = EditorMarshalling.s2td(DisplayServer.clipboard_get())
+ disabled = trck == null
+ last_checked = DisplayServer.clipboard_get()
+
+func _pressed() -> void:
+ import.emit(trck)
+
diff --git a/ui/editor/items.gd b/ui/editor/items.gd
new file mode 100644
index 0000000..bc42636
--- /dev/null
+++ b/ui/editor/items.gd
@@ -0,0 +1,112 @@
+extends ItemList
+class_name Items
+
+var selected: DirRes
+
+signal dir_selected(i: int)
+
+const icon_table = {
+ WeakLink.Type.Scene: preload("res://ui/assets/block.png"),
+ WeakLink.Type.Material: preload("res://ui/assets/material.png"),
+ -1: preload("res://ui/assets/folder.png")
+}
+
+var thread: Thread = Thread.new()
+
+static func get_thumb(f: FileItem) -> Array:
+ var thumb: Texture2D = icon_table[-1]
+ if f is WeakLink:
+ thumb = icon_table[f.type]
+ if f.type == WeakLink.Type.Scene:
+ var hsh: PackedByteArray = f.hash_s()
+ var img := Thumbnail._load(Globals.THUMBS % f.resource_name, hsh)
+ if img:
+ return [ImageTexture.create_from_image(img)]
+ else:
+ return [thumb, hsh]
+ return [thumb]
+
+## doesnt care about failures & processes multiple files.
+## the size of the output may not equal the size of the input,
+## as it tries to not create duplicates.
+static func get_thumbs(files: Array[FileItem]) -> Array[Texture2D]:
+ var files_uniq := []
+ for file in files:
+ if not files_uniq.has(file):
+ files_uniq.append(file)
+ var output: Array[Texture2D] = []
+ output.resize(len(files_uniq))
+ for i in len(files_uniq):
+ var thumb: Texture2D = icon_table[-1]
+ if files_uniq[i] is WeakLink:
+ thumb = icon_table[files_uniq[i].type]
+ if files[i].type == WeakLink.Type.Scene:
+ var hsh: PackedByteArray = files_uniq[i].hash_s()
+ var img := Thumbnail._load(Globals.THUMBS % files_uniq[i].resource_name, hsh)
+ if img:
+ thumb = ImageTexture.create_from_image(img)
+ output[i] = thumb
+ return output
+
+func open_dir(dir: DirRes):
+ clear()
+ selected = dir
+ var needing_thumbs := []
+ for i in dir.files.size():
+ var file := dir.files[i]
+ var thumb := Items.get_thumb(file)
+ if thumb.size() > 1:
+ needing_thumbs.append([i, file, thumb[-1]])
+ set_item_tooltip(add_item(file.resource_name, thumb[0]), file.description)
+ if thread.is_started():
+ thread.wait_to_finish()
+ thread.start(func():
+ for need in needing_thumbs:
+ var file: WeakLink = need[1]
+ match file.type:
+ WeakLink.Type.Scene:
+ var n: Block = file.scene.instantiate()
+ n.making_thumbnail = true
+ n.add_child(preload("res://scenes/sun.tscn").instantiate())
+ var ground := preload("res://scenes/floor.tscn").instantiate()
+ ground.position.y -= 5
+ n.add_child(ground)
+ var world := World3D.new()
+ world.environment = preload("res://default_env.tres")
+ var t := await Thumbnail.create_thumb(self, n, Vector2(64,64), world)
+ var e := Thumbnail.save(t, Globals.THUMBS % file.resource_name, need[2])
+ if e != OK:
+ push_error("err when thumbnailing %s: %d" % [file.resource_name, e])
+ if item_count > need[0]: # may have switched dirs
+ set_item_icon(need[0], ImageTexture.create_from_image(t))
+ , Thread.PRIORITY_LOW)
+
+func _get_drag_data(at_position: Vector2) -> Variant:
+ var index := get_item_at_position(at_position)
+ var f := selected.files[index]
+ if not f is WeakLink:
+ return null
+ set_drag_preview(make_drag_preview([get_item_icon(index)]))
+ match f.type:
+ WeakLink.Type.Scene:
+ var objects: Array[TrackObject] = [TrackObject.new(BlockMap.find(f.scene), null, f)]
+ return objects
+ WeakLink.Type.Material:
+ return f
+ return null
+
+func make_drag_preview(textures: Array[Texture2D]) -> Control:
+ var preview: DragDropPreview = preload("res://ui/editor/block_dragdrop_preview.tscn").instantiate().init(textures, %cam)
+ %view.gui_input.connect(preview.viewport_event)
+ %view.mouse_entered.connect(preview.over_viewport)
+ %view.mouse_exited.connect(preview.exit_viewport)
+ if Rect2(Vector2.ZERO, %port.size).has_point(%port.get_mouse_position()):
+ get_tree().physics_frame.connect(func():
+ preview.over_viewport()
+ , CONNECT_ONE_SHOT | CONNECT_DEFERRED)
+ return preview
+
+
+func _on_tree_exiting() -> void:
+ if thread.is_started():
+ thread.wait_to_finish()
diff --git a/ui/editor/mousecast.gd b/ui/editor/mousecast.gd
new file mode 100644
index 0000000..a1faed6
--- /dev/null
+++ b/ui/editor/mousecast.gd
@@ -0,0 +1,65 @@
+extends RayCast3D
+class_name MouseCast
+
+@onready var v := get_viewport()
+@onready var drag_area: ColorRect = $area
+@onready var c := v.get_camera_3d()
+@onready var editor: TrackEditor = owner
+var gizmo_just_hit := false
+var viewport_just_dropped := false
+var cast_ray := false
+var start = null
+const depth := 4000.0
+
+signal hit(colls: Array[Block])
+
+func position_to(p: Vector2):
+ global_position = c.project_ray_origin(p)
+ target_position = c.project_ray_normal(p) * depth
+
+func _physics_process(_delta: float) -> void:
+ if gizmo_just_hit || viewport_just_dropped:
+ gizmo_just_hit = false
+ viewport_just_dropped = false
+ start = null
+ drag_area.hide()
+ drag_area.size = Vector2.ZERO
+ return
+ if (
+ start == null # not already dragging
+ and Input.is_action_just_pressed("click") # just clicked
+ and Rect2(Vector2.ZERO, get_viewport().size).has_point(get_viewport().get_mouse_position()) # mouse is over viewport
+ ):
+ start = get_viewport().get_mouse_position()
+ drag_area.show()
+ elif Input.is_action_just_released("click") and start != null:
+ var selection: Array[Block] = []
+ var r := Rect2(start, Vector2.ZERO).expand(get_viewport().get_mouse_position())
+ start = null
+ drag_area.hide()
+ drag_area.size = Vector2.ZERO
+ if r.size.length_squared() < 1000:
+ position_to(r.get_center())
+ force_raycast_update()
+ if is_colliding() and get_collider() != null:
+ selection.append(get_collider())
+ hit.emit(selection)
+ return
+ for obj in editor.objects:
+ var origin := obj.live_node.transform.origin
+ if c.is_position_behind(origin) || c.global_position.distance_squared_to(origin) > 40000:
+ continue
+ var point := c.unproject_position(origin)
+ if r.has_point(point):
+ selection.append(obj.live_node)
+ hit.emit(selection)
+ if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) and start != null:
+ var r := Rect2(start, Vector2.ZERO).expand(get_viewport().get_mouse_position())
+ drag_area.position = r.position
+ drag_area.size = r.size
+
+func gizmo_clicked() -> void:
+ gizmo_just_hit = true
+
+func _on_view_created() -> void:
+ viewport_just_dropped = true
diff --git a/ui/editor/outline.gdshader b/ui/editor/outline.gdshader
new file mode 100644
index 0000000..4a75622
--- /dev/null
+++ b/ui/editor/outline.gdshader
@@ -0,0 +1,21 @@
+shader_type canvas_item;
+
+uniform vec4 line_color : source_color = vec4(1);
+uniform float line_thickness : hint_range(0, 10) = 1.0;
+
+void fragment() {
+ vec2 size = TEXTURE_PIXEL_SIZE * line_thickness;
+
+ float outline = texture(TEXTURE, UV + vec2(-size.x, 0)).a;
+ outline += texture(TEXTURE, UV + vec2(0, size.y)).a;
+ outline += texture(TEXTURE, UV + vec2(size.x, 0)).a;
+ outline += texture(TEXTURE, UV + vec2(0, -size.y)).a;
+ outline += texture(TEXTURE, UV + vec2(-size.x, size.y)).a;
+ outline += texture(TEXTURE, UV + vec2(size.x, size.y)).a;
+ outline += texture(TEXTURE, UV + vec2(-size.x, -size.y)).a;
+ outline += texture(TEXTURE, UV + vec2(size.x, -size.y)).a;
+ outline = min(outline, 1.0);
+
+ vec4 color = texture(TEXTURE, UV);
+ COLOR = mix(color, line_color, outline - color.a);
+} \ No newline at end of file
diff --git a/ui/editor/outline.material b/ui/editor/outline.material
new file mode 100644
index 0000000..c6bc44f
--- /dev/null
+++ b/ui/editor/outline.material
Binary files differ
diff --git a/ui/editor/port.gd b/ui/editor/port.gd
new file mode 100644
index 0000000..24ae3ff
--- /dev/null
+++ b/ui/editor/port.gd
@@ -0,0 +1,108 @@
+extends SubViewport
+class_name EditorViewport
+
+@onready var editor: TrackEditor = owner
+
+const map = {
+ TrackEditor.Mode.Select: preload("res://addons/@bendn/gizmo3d/selection_marker.tscn"),
+ TrackEditor.Mode.Move: preload("res://addons/@bendn/gizmo3d/translate/translate.tscn"),
+ TrackEditor.Mode.Scale: preload("res://addons/@bendn/gizmo3d/scale/scale.tscn"),
+ TrackEditor.Mode.Rotate: preload("res://addons/@bendn/gizmo3d/rotation/rotation.tscn"),
+}
+
+var current: Gizmo
+var gizmo_holder := Node3D.new()
+
+var original_gh_p: Vector3
+var original_scales: PackedVector3Array = []
+var original_transforms: Array[Transform3D] = []
+
+func _ready() -> void:
+ add_child(gizmo_holder)
+
+func _position_gizmo_holder() -> void:
+ var sum := Vector3.ZERO
+ for block in editor.selected:
+ sum += block.live_node.global_position
+ gizmo_holder.global_position = sum / len(editor.selected)
+
+func _setup_originals() -> void:
+ original_transforms.resize(len(editor.selected))
+ original_scales.resize(len(editor.selected))
+ for i in len(editor.selected):
+ var n := editor.selected[i].live_node
+ original_transforms[i] = n.global_transform
+ original_scales[i] = n.scale
+ original_gh_p = gizmo_holder.global_position
+
+func update_gizmo(mode: TrackEditor.Mode) -> void:
+ if current != null:
+ current.queue_free()
+ current = null
+ original_transforms.clear()
+ original_scales.clear()
+ match mode:
+ _:
+ if editor.selected.size() == 0:
+ return
+ current = map[mode].instantiate()
+ _position_gizmo_holder()
+ gizmo_holder.add_child(current)
+ _setup_originals()
+ current.finalize.connect(_gizmo_finalize)
+ current.displaced.connect(_gizmo_displace)
+ current.scaled.connect(_gizmo_scale)
+ current.rotated.connect(_gizmo_rotate)
+ current.clicked.connect(%mousecast.gizmo_clicked)
+
+func snap(v: Vector3, step: Vector3 = Globals.SNAP) -> Vector3:
+ return v.snapped(step) if editor.snapping else v
+
+func _gizmo_displace(offset: Vector3):
+ const prop := &"global_position"
+ editor.history.create_action("move %d nodes" % editor.selected.size(), UndoRedo.MERGE_ENDS)
+ for i in len(editor.selected):
+ var n := editor.selected[i].live_node
+ editor.history.add_do_property(n, prop, snap(original_transforms[i].origin + offset))
+ editor.history.add_undo_property(n, prop, original_transforms[i].origin)
+ editor.history.add_do_property(gizmo_holder, prop, original_gh_p + snap(offset))
+ editor.history.add_undo_property(gizmo_holder, prop, original_gh_p)
+ editor.history.commit_action()
+
+func _gizmo_scale(change: Vector3):
+ const prop := &"scale"
+ editor.history.create_action("scale %d nodes" % editor.selected.size(), UndoRedo.MERGE_ENDS)
+ for i in len(editor.selected):
+ var n := editor.selected[i].live_node
+ var scl := snap(original_scales[i] + change, Vector3.ONE)
+ if scl.x <= 0 || scl.y <= 0: # pls no flip
+ scl = Vector3.ONE
+ editor.history.add_do_property(n, prop, scl)
+ editor.history.add_undo_property(n, prop, original_scales[i])
+ editor.history.commit_action()
+
+func _gizmo_rotate(change: Vector3):
+ const prop := &"global_transform"
+ editor.history.create_action("rotate %d nodes" % editor.selected.size(), UndoRedo.MERGE_ENDS)
+ for i in len(editor.selected):
+ var n := editor.selected[i].live_node
+ var rotation := Transform3D(Basis.from_euler(change), Vector3())
+ editor.history.add_do_property(
+ n,
+ prop,
+ (rotation * original_transforms[i].translated(-original_gh_p)).translated(original_gh_p)
+ )
+ editor.history.add_undo_property(n, prop, original_transforms[i])
+ editor.history.commit_action()
+
+func _gizmo_finalize():
+ for i in len(editor.selected):
+ var n := editor.selected[i].live_node
+ original_scales[i] = n.scale
+ original_transforms[i] = n.global_transform
+ original_gh_p = gizmo_holder.global_position
+
+func _on_remove_tobj() -> void:
+ if current != null:
+ current.queue_free()
+ current = null
diff --git a/ui/editor/propertys.gd b/ui/editor/propertys.gd
new file mode 100644
index 0000000..30bb352
--- /dev/null
+++ b/ui/editor/propertys.gd
@@ -0,0 +1,4 @@
+extends VBoxContainer
+
+@onready var name_: LineEdit = %name
+@onready var laps_: SpinBox = %laps
diff --git a/ui/editor/propertys.tscn b/ui/editor/propertys.tscn
new file mode 100644
index 0000000..185a780
--- /dev/null
+++ b/ui/editor/propertys.tscn
@@ -0,0 +1,53 @@
+[gd_scene load_steps=3 format=3 uid="uid://c4h850namjrn2"]
+
+[ext_resource type="Script" path="res://ui/editor/propertys.gd" id="1_0vjdc"]
+
+[sub_resource type="GDScript" id="GDScript_ly6xd"]
+resource_name = "laps"
+script/source = "extends SpinBox
+
+func _on_value_changed(val: float) -> void:
+ suffix = \"laps\" if val > 1 else \"lap\"
+"
+
+[node name="propertys" type="VBoxContainer"]
+size_flags_vertical = 3
+script = ExtResource("1_0vjdc")
+
+[node name="name" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="label" type="Label" parent="name"]
+custom_minimum_size = Vector2(150, 0)
+layout_mode = 2
+text = "name"
+
+[node name="name" type="LineEdit" parent="name"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+placeholder_text = "fluffy gizmo"
+max_length = 50
+caret_blink = true
+
+[node name="laps" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="label" type="Label" parent="laps"]
+custom_minimum_size = Vector2(150, 0)
+layout_mode = 2
+text = "laps"
+
+[node name="laps" type="SpinBox" parent="laps"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(120, 0)
+layout_mode = 2
+size_flags_horizontal = 3
+min_value = 1.0
+max_value = 50.0
+value = 1.0
+rounded = true
+suffix = "lap"
+script = SubResource("GDScript_ly6xd")
+
+[connection signal="value_changed" from="laps/laps" to="laps/laps" method="_on_value_changed"]
diff --git a/ui/editor/redo.gd b/ui/editor/redo.gd
new file mode 100644
index 0000000..46a86e1
--- /dev/null
+++ b/ui/editor/redo.gd
@@ -0,0 +1,13 @@
+extends Button
+
+@onready var hist: UndoRedo = owner.history
+
+func _pressed() -> void:
+ owner.reset_selected()
+ hist.redo()
+
+func _ready() -> void:
+ hist.version_changed.connect(
+ func():
+ disabled = !hist.has_redo()
+ )
diff --git a/ui/editor/save.gd b/ui/editor/save.gd
new file mode 100644
index 0000000..c77ea48
--- /dev/null
+++ b/ui/editor/save.gd
@@ -0,0 +1,19 @@
+extends Button
+
+@onready var hist: UndoRedo = owner.history
+
+const icons: PackedStringArray = ['󰆓', '󰽂', '󱣪']
+var unsaved := false:
+ set(un):
+ unsaved = un
+ text = icons[int(un)]
+
+func _on_pressed() -> void:
+ var data := (owner as TrackEditor).get_trackdata()
+ if FileAccess.file_exists(Globals.TRACKS % data.name):
+ pass
+ data.save(Globals.TRACKS % data.name)
+ unsaved = false
+
+func _ready() -> void:
+ hist.version_changed.connect(func(): unsaved = true)
diff --git a/ui/editor/selection.gdshader b/ui/editor/selection.gdshader
new file mode 100644
index 0000000..b2f8b9f
--- /dev/null
+++ b/ui/editor/selection.gdshader
@@ -0,0 +1,21 @@
+shader_type canvas_item;
+
+//shadertoy 4lKXWD
+
+uniform vec4 bg_color: source_color = vec4(0,0,0,0.1);
+uniform float dash_color: hint_range(0.0, 1.0, 0.1) = 1;
+uniform float empty_color: hint_range(0.0, 1.0, 0.1) = 0;
+
+const vec2 center = vec2(0.5, 0.5);
+
+void fragment() {
+ vec2 fw = fwidth(UV);
+ vec2 dist = abs(UV - center);
+ if (all(lessThan(dist, center)) && any(greaterThan(dist, center - fw))) {
+ float dir = (dist.x > dist.y) ? -sign(UV.x - center.x) : sign(UV.y - center.y);
+ float dash = step(0.5, fract((FRAGCOORD.x + FRAGCOORD.y) * dir / 10.0 + TIME));
+ float col = mix(dash_color, empty_color, dash);
+ COLOR = vec4(col, col, col, 1);
+ } else { COLOR = bg_color; }
+}
+
diff --git a/ui/editor/track_editor.gd b/ui/editor/track_editor.gd
new file mode 100644
index 0000000..9b2a499
--- /dev/null
+++ b/ui/editor/track_editor.gd
@@ -0,0 +1,122 @@
+extends PanelContainer
+class_name TrackEditor
+
+@export var group: ButtonGroup
+@onready var brush := %brush
+
+enum Mode { Select, Move, Rotate, Scale }
+var mode: Mode
+var selected: Array[TrackObject]:
+ set(s):
+ if s != selected:
+ for b in selected: # easier than finding the items that are not in selected but are in s
+ b.live_node.un_highlight()
+ selected = s
+ for b in selected:
+ b.live_node.highlight()
+ make_gizmo.emit(mode)
+ selection_changed.emit(selected)
+var snapping := true
+var objects: Array[TrackObject] = []
+var history := UndoRedo.new()
+var track: TrackResource
+signal make_gizmo(mode: Mode)
+signal selection_changed(objects: Array[TrackObject])
+
+const loader := preload("res://scenes/track.tscn")
+
+func _ready() -> void:
+ track = Globals.editing if Globals.editing else TrackResource.new([])
+ var l: TrackLoader = loader.instantiate()
+ l.editor = true
+ l.track = track
+ add_child(l)
+ # move over the loaders children
+ for c in l.get_children():
+ l.remove_child(c)
+ %port.add_child(c)
+ # the loader has loaded, get rid of it
+ l.queue_free()
+ objects = track.blocks.duplicate() # duplicate: if not saved, will be lost
+ %propertys.name_.text = track.name
+ %propertys.laps_.value = track.laps
+ %cam.global_transform = IntroCam.get_origin(track) # put the camera up high, looking straight down
+
+ if not FileAccess.file_exists(Globals.TRACKS % track.name) and not track.builtin:
+ %save.unsaved = true
+
+ group.pressed.connect(pressed)
+ tree_exiting.connect(
+ func():
+ for obj in objects:
+ obj.delete_live()
+ )
+
+func pressed(b: Button) -> void:
+ mode = Mode[b.name.to_pascal_case()]
+ make_gizmo.emit(mode)
+
+func reset_selected() -> void:
+ var new: Array[TrackObject] = []
+ selected = new
+
+func _on_mousecast_hit(colls: Array[Block]) -> void:
+ var new_selected: Array[TrackObject] = []
+ new_selected.resize(colls.size())
+ var painting: bool = brush.button_pressed and not colls.is_empty()
+ if painting:
+ history.create_action("paint")
+ for i in len(colls):
+ new_selected[i] = tobj_from_node(colls[i])
+ if painting and colls[i].materials_allowed() & brush.mat:
+ history.add_do_method(colls[i].set_mat.bind(brush.mat))
+ history.add_undo_method(colls[i].set_mat.bind(colls[i].mat))
+ assert(new_selected[i]!=null, "%s was not found" % [colls[i]])
+ if not brush.button_pressed:
+ selected = new_selected
+ if painting:
+ history.commit_action()
+
+func _on_snapping_toggled(button_pressed: bool) -> void:
+ snapping = button_pressed
+
+func get_trackdata() -> TrackResource:
+ objects = objects.filter(func(o: TrackObject): return is_instance_valid(o.live_node))
+ track.blocks = objects.duplicate()
+ track.name = %propertys.name_.text
+ track.laps = %propertys.laps_.value
+ return track
+
+func _on_item_created(object: TrackObject) -> void:
+ objects.append(object)
+ if object.live_node is Booster:
+ for block in objects:
+ if block.live_node is Booster:
+ block.live_node.sync()
+ %thonk.pitch_scale = randf_range(.9, 1.2)
+ %thonk.play()
+
+func tobj_from_node(node: Block) -> TrackObject:
+ for o in objects:
+ if o.live_node == node:
+ return o
+ return null
+
+func _on_delete_pressed() -> void:
+ selected = []
+
+func _on_remove_tobj(tobj: TrackObject) -> void:
+ objects.erase(tobj)
+
+func _on_brush_toggled(on: bool) -> void:
+ if on:
+ var painting: bool = brush.button_pressed and not selected.is_empty()
+ if painting:
+ history.create_action("paint")
+ for o in selected:
+ if painting and o.live_node.materials_allowed() & brush.mat:
+ history.add_do_method(o.live_node.set_mat.bind(brush.mat))
+ history.add_undo_method(o.live_node.set_mat.bind(o.live_node.mat))
+ if painting:
+ history.commit_action()
+ reset_selected()
diff --git a/ui/editor/track_editor.gdshader b/ui/editor/track_editor.gdshader
new file mode 100644
index 0000000..afc349d
--- /dev/null
+++ b/ui/editor/track_editor.gdshader
@@ -0,0 +1,32 @@
+shader_type canvas_item;
+
+void fragment() {
+
+ // rect boundaries
+ vec2 rectMin = vec2(0.4, 0.2);
+ vec2 rectMax = vec2(0.8, 0.8);
+
+ vec2 center = (rectMin + rectMax) / 2.0;
+ vec2 halfSize = center - rectMin;
+ vec2 fw = fwidth(UV);
+
+ vec2 dist = abs(UV - center);
+
+ float col = 0.0;
+ if (all(lessThan(dist, halfSize)) && any(greaterThan(dist, halfSize - fw))) {
+ // for pixel here I could use fragCoord.xy, but on textures you don't have it
+ // using fwidth is a tricky way to operate in screenspace sizes on all surfaces
+ // of course it's an approximation, but it's a pretty good one, here, uncomment this
+ // line to try fragCoord, it gives almost the same result:
+ //vec2 pixel = fragCoord.xy;
+ vec2 pixel = UV / fw;
+ float aspect = halfSize.y / halfSize.x;
+ float dir = (dist.x * aspect > dist.y) ?
+ -sign(UV.x - center.x) : sign(UV.y - center.y);
+ float dash = step(0.5, fract((pixel.x + pixel.y) * dir / 10.0 + TIME));
+ col = mix(1.0, 0.0, dash);
+ }
+
+ COLOR = vec4(col, col, col, 1.0);
+}
+
diff --git a/ui/editor/track_editor.tscn b/ui/editor/track_editor.tscn
new file mode 100644
index 0000000..74b0399
--- /dev/null
+++ b/ui/editor/track_editor.tscn
@@ -0,0 +1,557 @@
+[gd_scene load_steps=62 format=3 uid="uid://0x720q7tnsj0"]
+
+[ext_resource type="Script" path="res://ui/editor/tree.gd" id="1_65spq"]
+[ext_resource type="Theme" uid="uid://d3ywcokn5ddy8" path="res://ui/theme.tres" id="1_cc7dd"]
+[ext_resource type="StyleBox" uid="uid://dxtsrhgnyr80k" path="res://ui/panel_dark.stylebox" id="2_l1cwd"]
+[ext_resource type="Script" path="res://ui/editor/items.gd" id="2_q16oo"]
+[ext_resource type="Script" path="res://ui/editor/track_editor.gd" id="3_50gj4"]
+[ext_resource type="Script" path="res://ui/editor/cam.gd" id="6_o7q05"]
+[ext_resource type="ButtonGroup" uid="uid://oio3aly7aeny" path="res://ui/editor/group.tres" id="6_vgj8v"]
+[ext_resource type="Script" path="res://ui/editor/port.gd" id="7_ftio3"]
+[ext_resource type="Script" path="res://ui/editor/back_button.gd" id="7_r0vjt"]
+[ext_resource type="Script" path="res://ui/editor/save.gd" id="7_saajs"]
+[ext_resource type="Script" path="res://ui/editor/export.gd" id="9_nra4c"]
+[ext_resource type="Theme" uid="uid://bds815vxta4ma" path="res://ui/editor/bar_button.tres" id="9_x2saf"]
+[ext_resource type="PackedScene" uid="uid://c4h850namjrn2" path="res://ui/editor/propertys.tscn" id="10_kqvab"]
+[ext_resource type="Resource" uid="uid://qxacdpu7fkgb" path="res://ui/editor/editor_fs.tres" id="11_ijop2"]
+[ext_resource type="Script" path="res://ui/multi_button.gd" id="11_nar81"]
+[ext_resource type="Script" path="res://ui/editor/delete.gd" id="13_agg2r"]
+[ext_resource type="Script" path="res://ui/editor/undo.gd" id="13_bgr8w"]
+[ext_resource type="StyleBox" uid="uid://bg21fak47r0np" path="res://ui/panel_light.stylebox" id="13_cyvq7"]
+[ext_resource type="Script" path="res://ui/editor/redo.gd" id="14_2ypjq"]
+[ext_resource type="Texture2D" uid="uid://dfmcv080xpxdl" path="res://ui/assets/brush_handle.png" id="15_0xrjt"]
+[ext_resource type="Script" path="res://ui/editor/brush.gd" id="15_vvkyy"]
+[ext_resource type="Texture2D" uid="uid://bn83ygj5y3d8q" path="res://ui/assets/brush_brush.png" id="16_0ntdi"]
+[ext_resource type="Texture2D" uid="uid://dmxtfr7xfkpyf" path="res://ui/assets/brush_cursor.png" id="16_5gj5o"]
+[ext_resource type="PackedScene" uid="uid://cvs6pj6a5w5t" path="res://ui/editor/wall_tool.tscn" id="16_6ojvx"]
+[ext_resource type="Script" path="res://ui/editor/duplicate.gd" id="17_7y8ae"]
+[ext_resource type="Script" path="res://ui/editor/hatch.gd" id="17_ugqw3"]
+[ext_resource type="Texture2D" uid="uid://ce5kkd4bg17wl" path="res://ui/assets/brush_outline.png" id="18_cvlsk"]
+[ext_resource type="Script" path="res://ui/editor/mousecast.gd" id="19_hmpi3"]
+[ext_resource type="Shader" path="res://ui/editor/selection.gdshader" id="22_sij02"]
+[ext_resource type="AudioStream" uid="uid://bvtxqrhkbai7x" path="res://assets/sounds/plonk.ogg" id="25_hegbs"]
+
+[sub_resource type="InputEventKey" id="InputEventKey_8ix4j"]
+device = -1
+ctrl_pressed = true
+keycode = 83
+unicode = 115
+
+[sub_resource type="Shortcut" id="Shortcut_3gcv0"]
+events = [SubResource("InputEventKey_8ix4j")]
+
+[sub_resource type="InputEventKey" id="InputEventKey_tmkac"]
+device = -1
+ctrl_pressed = true
+keycode = 69
+unicode = 101
+
+[sub_resource type="Shortcut" id="Shortcut_uhpqg"]
+events = [SubResource("InputEventKey_tmkac")]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1bugq"]
+bg_color = Color(0.027451, 0.211765, 0.258824, 1)
+corner_radius_top_left = 15
+corner_radius_top_right = 15
+
+[sub_resource type="InputEventKey" id="InputEventKey_w2y01"]
+device = -1
+keycode = 81
+unicode = 113
+
+[sub_resource type="Shortcut" id="Shortcut_5skl8"]
+events = [SubResource("InputEventKey_w2y01")]
+
+[sub_resource type="InputEventKey" id="InputEventKey_yfrw1"]
+device = -1
+keycode = 87
+unicode = 119
+
+[sub_resource type="Shortcut" id="Shortcut_njwdg"]
+events = [SubResource("InputEventKey_yfrw1")]
+
+[sub_resource type="InputEventKey" id="InputEventKey_wcb2q"]
+device = -1
+keycode = 69
+unicode = 101
+
+[sub_resource type="Shortcut" id="Shortcut_tekm2"]
+events = [SubResource("InputEventKey_wcb2q")]
+
+[sub_resource type="InputEventKey" id="InputEventKey_xodsd"]
+device = -1
+keycode = 83
+unicode = 115
+
+[sub_resource type="Shortcut" id="Shortcut_p3vb8"]
+events = [SubResource("InputEventKey_xodsd")]
+
+[sub_resource type="InputEventKey" id="InputEventKey_nyu56"]
+device = -1
+shift_pressed = true
+keycode = 71
+unicode = 71
+
+[sub_resource type="Shortcut" id="Shortcut_tet3e"]
+events = [SubResource("InputEventKey_nyu56")]
+
+[sub_resource type="LabelSettings" id="LabelSettings_6nqim"]
+font_size = 12
+font_color = Color(0.14902, 0.545098, 0.823529, 1)
+outline_size = 10
+outline_color = Color(0.027451, 0.211765, 0.258824, 1)
+
+[sub_resource type="InputEventKey" id="InputEventKey_vl62h"]
+device = -1
+keycode = 80
+unicode = 112
+
+[sub_resource type="Shortcut" id="Shortcut_uthi5"]
+events = [SubResource("InputEventKey_vl62h")]
+
+[sub_resource type="InputEventKey" id="InputEventKey_eddoh"]
+device = -1
+ctrl_pressed = true
+keycode = 90
+unicode = 122
+
+[sub_resource type="Shortcut" id="Shortcut_kampb"]
+events = [SubResource("InputEventKey_eddoh")]
+
+[sub_resource type="InputEventKey" id="InputEventKey_r2b0g"]
+device = -1
+ctrl_pressed = true
+keycode = 89
+unicode = 121
+
+[sub_resource type="InputEventKey" id="InputEventKey_m7yhl"]
+device = -1
+shift_pressed = true
+ctrl_pressed = true
+keycode = 90
+unicode = 90
+
+[sub_resource type="Shortcut" id="Shortcut_6jonl"]
+events = [SubResource("InputEventKey_r2b0g"), SubResource("InputEventKey_m7yhl")]
+
+[sub_resource type="InputEventKey" id="InputEventKey_53uh0"]
+device = -1
+keycode = 4194308
+
+[sub_resource type="InputEventKey" id="InputEventKey_uh7no"]
+device = -1
+keycode = 4194312
+
+[sub_resource type="Shortcut" id="Shortcut_4byk3"]
+events = [SubResource("InputEventKey_53uh0"), SubResource("InputEventKey_uh7no")]
+
+[sub_resource type="InputEventKey" id="InputEventKey_hnh1d"]
+device = -1
+ctrl_pressed = true
+keycode = 68
+unicode = 100
+
+[sub_resource type="Shortcut" id="Shortcut_5hxvg"]
+events = [SubResource("InputEventKey_hnh1d")]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7qcnf"]
+bg_color = Color(0, 0, 0, 1)
+corner_radius_bottom_right = 15
+corner_radius_bottom_left = 15
+corner_detail = 12
+anti_aliasing_size = 0.397
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_y3yf4"]
+shader = ExtResource("22_sij02")
+shader_parameter/bg_color = Color(0, 0, 0, 0.1)
+shader_parameter/dash_color = 1.0
+shader_parameter/empty_color = 0.0
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vunt4"]
+content_margin_left = 10.0
+content_margin_top = 10.0
+content_margin_right = 10.0
+content_margin_bottom = 10.0
+bg_color = Color(0, 0.168627, 0.211765, 1)
+corner_radius_top_left = 15
+corner_radius_top_right = 15
+corner_radius_bottom_right = 15
+corner_radius_bottom_left = 15
+
+[node name="TrackEditor" type="PanelContainer"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme = ExtResource("1_cc7dd")
+theme_override_styles/panel = ExtResource("2_l1cwd")
+script = ExtResource("3_50gj4")
+group = ExtResource("6_vgj8v")
+
+[node name="split" type="HSplitContainer" parent="."]
+layout_mode = 2
+
+[node name="left dock" type="VSplitContainer" parent="split"]
+custom_minimum_size = Vector2(100, 0)
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="data" type="PanelContainer" parent="split/left dock"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = ExtResource("13_cyvq7")
+
+[node name="container" type="VBoxContainer" parent="split/left dock/data"]
+layout_mode = 2
+
+[node name="buttons" type="HFlowContainer" parent="split/left dock/data/container"]
+layout_mode = 2
+theme = ExtResource("9_x2saf")
+
+[node name="back" type="Button" parent="split/left dock/data/container/buttons"]
+custom_minimum_size = Vector2(30, 0)
+layout_mode = 2
+text = " "
+script = ExtResource("7_r0vjt")
+
+[node name="vsep" type="VSeparator" parent="split/left dock/data/container/buttons"]
+layout_mode = 2
+
+[node name="save" type="Button" parent="split/left dock/data/container/buttons"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(40, 50)
+layout_mode = 2
+tooltip_text = "Save track (Ctrl+S)"
+shortcut = SubResource("Shortcut_3gcv0")
+shortcut_in_tooltip = false
+text = "󰆓
+"
+script = ExtResource("7_saajs")
+
+[node name="export" type="Button" parent="split/left dock/data/container/buttons"]
+custom_minimum_size = Vector2(20, 50)
+layout_mode = 2
+tooltip_text = "Export track to clipboard (Ctrl+E)"
+shortcut = SubResource("Shortcut_uhpqg")
+shortcut_in_tooltip = false
+text = "󰈝"
+script = ExtResource("9_nra4c")
+
+[node name="propertys" parent="split/left dock/data/container" instance=ExtResource("10_kqvab")]
+unique_name_in_owner = true
+layout_mode = 2
+
+[node name="fs" type="VSplitContainer" parent="split/left dock"]
+layout_mode = 2
+size_flags_vertical = 3
+size_flags_stretch_ratio = 2.29
+
+[node name="fs tree" type="Tree" parent="split/left dock/fs"]
+layout_mode = 2
+size_flags_vertical = 3
+hide_root = true
+scroll_horizontal_enabled = false
+script = ExtResource("1_65spq")
+root_fs = ExtResource("11_ijop2")
+
+[node name="items" type="ItemList" parent="split/left dock/fs"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_font_sizes/font_size = 24
+max_columns = 3
+icon_mode = 0
+fixed_icon_size = Vector2i(64, 64)
+script = ExtResource("2_q16oo")
+
+[node name="split2" type="HSplitContainer" parent="split"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_stretch_ratio = 3.45
+
+[node name="middle dock" type="VBoxContainer" parent="split/split2"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_stretch_ratio = 2.72
+mouse_filter = 2
+theme_override_constants/separation = 0
+
+[node name="buttons" type="PanelContainer" parent="split/split2/middle dock"]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_1bugq")
+
+[node name="container" type="HFlowContainer" parent="split/split2/middle dock/buttons"]
+custom_minimum_size = Vector2(0, 50)
+layout_mode = 2
+theme = ExtResource("9_x2saf")
+theme_override_constants/h_separation = 0
+
+[node name="select" type="Button" parent="split/split2/middle dock/buttons/container"]
+custom_minimum_size = Vector2(40, 50)
+layout_mode = 2
+tooltip_text = "Select mode (Q)"
+theme = ExtResource("9_x2saf")
+toggle_mode = true
+button_pressed = true
+button_group = ExtResource("6_vgj8v")
+shortcut = SubResource("Shortcut_5skl8")
+shortcut_in_tooltip = false
+text = "󰇀"
+
+[node name="sep" type="VSeparator" parent="split/split2/middle dock/buttons/container"]
+layout_mode = 2
+
+[node name="move" type="Button" parent="split/split2/middle dock/buttons/container"]
+custom_minimum_size = Vector2(40, 50)
+layout_mode = 2
+tooltip_text = "Move Mode (W)"
+theme = ExtResource("9_x2saf")
+toggle_mode = true
+button_group = ExtResource("6_vgj8v")
+shortcut = SubResource("Shortcut_njwdg")
+shortcut_in_tooltip = false
+text = "󰆾"
+
+[node name="rotate" type="Button" parent="split/split2/middle dock/buttons/container"]
+custom_minimum_size = Vector2(40, 50)
+layout_mode = 2
+tooltip_text = "Rotate Mode (E)"
+theme = ExtResource("9_x2saf")
+toggle_mode = true
+button_group = ExtResource("6_vgj8v")
+shortcut = SubResource("Shortcut_tekm2")
+shortcut_in_tooltip = false
+text = "󰶘"
+
+[node name="scale" type="Button" parent="split/split2/middle dock/buttons/container"]
+custom_minimum_size = Vector2(40, 50)
+layout_mode = 2
+tooltip_text = "Scale Mode (C)"
+theme = ExtResource("9_x2saf")
+toggle_mode = true
+button_group = ExtResource("6_vgj8v")
+shortcut = SubResource("Shortcut_p3vb8")
+shortcut_in_tooltip = false
+text = "󰘖"
+
+[node name="spacer" type="Control" parent="split/split2/middle dock/buttons/container"]
+custom_minimum_size = Vector2(4, 0)
+layout_mode = 2
+
+[node name="sep2" type="VSeparator" parent="split/split2/middle dock/buttons/container"]
+layout_mode = 2
+
+[node name="snapping" type="Button" parent="split/split2/middle dock/buttons/container" node_paths=PackedStringArray("secondary")]
+custom_minimum_size = Vector2(40, 50)
+layout_mode = 2
+tooltip_text = "Use Grid Snap (Shift+G)"
+theme = ExtResource("9_x2saf")
+toggle_mode = true
+button_pressed = true
+action_mode = 0
+shortcut = SubResource("Shortcut_tet3e")
+shortcut_in_tooltip = false
+text = " 󰋁 "
+script = ExtResource("11_nar81")
+secondary = NodePath("magnet")
+
+[node name="magnet" type="Label" parent="split/split2/middle dock/buttons/container/snapping"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 30.0
+offset_top = 38.0
+offset_right = 30.0
+offset_bottom = 38.0
+grow_horizontal = 2
+grow_vertical = 2
+rotation = 3.14159
+text = "󰍇"
+label_settings = SubResource("LabelSettings_6nqim")
+
+[node name="sep4" type="VSeparator" parent="split/split2/middle dock/buttons/container"]
+layout_mode = 2
+
+[node name="brush" type="Button" parent="split/split2/middle dock/buttons/container" node_paths=PackedStringArray("secondary")]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(40, 50)
+layout_mode = 2
+tooltip_text = "Paintbrush Tool (P)"
+theme = ExtResource("9_x2saf")
+theme_override_font_sizes/font_size = 21
+disabled = true
+toggle_mode = true
+shortcut = SubResource("Shortcut_uthi5")
+shortcut_in_tooltip = false
+script = ExtResource("15_vvkyy")
+cursor = ExtResource("16_5gj5o")
+secondary = NodePath("handle")
+
+[node name="handle" type="TextureRect" parent="split/split2/middle dock/buttons/container/brush"]
+modulate = Color(0.870588, 0.831373, 0.698039, 1)
+layout_mode = 0
+offset_left = 11.0
+offset_top = 10.0
+offset_right = 33.0
+offset_bottom = 23.0
+texture = ExtResource("15_0xrjt")
+expand_mode = 1
+stretch_mode = 4
+
+[node name="brush" type="TextureRect" parent="split/split2/middle dock/buttons/container/brush"]
+modulate = Color(0.870588, 0.831373, 0.698039, 1)
+layout_mode = 0
+offset_left = 11.0
+offset_top = 24.0
+offset_right = 33.0
+offset_bottom = 39.0
+texture = ExtResource("16_0ntdi")
+expand_mode = 1
+stretch_mode = 4
+
+[node name="outline" type="TextureRect" parent="split/split2/middle dock/buttons/container/brush"]
+visible = false
+modulate = Color(0.14902, 0.545098, 0.823529, 1)
+layout_mode = 0
+offset_left = 10.0
+offset_top = 9.0
+offset_right = 34.0
+offset_bottom = 47.0
+texture = ExtResource("18_cvlsk")
+expand_mode = 1
+stretch_mode = 4
+
+[node name="spacer2" type="Control" parent="split/split2/middle dock/buttons/container"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="undo" type="Button" parent="split/split2/middle dock/buttons/container"]
+custom_minimum_size = Vector2(40, 0)
+layout_mode = 2
+tooltip_text = "Undo (Ctrl + Z)"
+disabled = true
+shortcut = SubResource("Shortcut_kampb")
+shortcut_in_tooltip = false
+text = "󰕌"
+script = ExtResource("13_bgr8w")
+
+[node name="redo" type="Button" parent="split/split2/middle dock/buttons/container"]
+custom_minimum_size = Vector2(40, 0)
+layout_mode = 2
+tooltip_text = "Redo (Ctrl + Y | Ctrl + Shift + Z)"
+disabled = true
+shortcut = SubResource("Shortcut_6jonl")
+shortcut_in_tooltip = false
+text = "󰑎 "
+script = ExtResource("14_2ypjq")
+
+[node name="sep3" type="VSeparator" parent="split/split2/middle dock/buttons/container"]
+layout_mode = 2
+
+[node name="delete" type="Button" parent="split/split2/middle dock/buttons/container"]
+custom_minimum_size = Vector2(40, 0)
+layout_mode = 2
+tooltip_text = "Delete selected object (Backspace | Delete)"
+disabled = true
+shortcut = SubResource("Shortcut_4byk3")
+shortcut_in_tooltip = false
+text = "  "
+script = ExtResource("13_agg2r")
+
+[node name="duplicate" type="Button" parent="split/split2/middle dock/buttons/container"]
+custom_minimum_size = Vector2(40, 0)
+layout_mode = 2
+tooltip_text = "Duplicate (Ctrl + D)"
+disabled = true
+shortcut = SubResource("Shortcut_5hxvg")
+text = "󰆏 "
+script = ExtResource("17_7y8ae")
+
+[node name="viewport" type="PanelContainer" parent="split/split2/middle dock"]
+clip_children = 1
+layout_mode = 2
+size_flags_vertical = 3
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_7qcnf")
+
+[node name="view" type="SubViewportContainer" parent="split/split2/middle dock/viewport"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(250, 250)
+layout_mode = 2
+stretch = true
+script = ExtResource("17_ugqw3")
+
+[node name="port" type="SubViewport" parent="split/split2/middle dock/viewport/view"]
+unique_name_in_owner = true
+handle_input_locally = false
+physics_object_picking = true
+size = Vector2i(1067, 1010)
+render_target_update_mode = 4
+script = ExtResource("7_ftio3")
+
+[node name="mousecast" type="RayCast3D" parent="split/split2/middle dock/viewport/view/port"]
+unique_name_in_owner = true
+enabled = false
+collision_mask = 2147483648
+script = ExtResource("19_hmpi3")
+
+[node name="area" type="ColorRect" parent="split/split2/middle dock/viewport/view/port/mousecast"]
+visible = false
+material = SubResource("ShaderMaterial_y3yf4")
+
+[node name="cam" type="Camera3D" parent="split/split2/middle dock/viewport/view/port"]
+unique_name_in_owner = true
+script = ExtResource("6_o7q05")
+
+[node name="right dock" type="VBoxContainer" parent="split/split2"]
+custom_minimum_size = Vector2(150, 0)
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="panel" type="PanelContainer" parent="split/split2/right dock"]
+layout_mode = 2
+size_flags_vertical = 3
+theme_override_styles/panel = ExtResource("13_cyvq7")
+
+[node name="panelinner" type="PanelContainer" parent="split/split2/right dock/panel"]
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_vunt4")
+
+[node name="inspector" type="VBoxContainer" parent="split/split2/right dock/panel/panelinner"]
+layout_mode = 2
+
+[node name="wall" parent="split/split2/right dock/panel/panelinner/inspector" node_paths=PackedStringArray("editor") instance=ExtResource("16_6ojvx")]
+layout_mode = 2
+editor = NodePath("../../../../../../..")
+
+[node name="thonk" type="AudioStreamPlayer" parent="."]
+unique_name_in_owner = true
+stream = ExtResource("25_hegbs")
+volume_db = -14.0
+max_polyphony = 2
+
+[connection signal="make_gizmo" from="." to="split/split2/middle dock/viewport/view/port" method="update_gizmo"]
+[connection signal="selection_changed" from="." to="split/split2/middle dock/buttons/container/delete" method="_on_selection_changed"]
+[connection signal="selection_changed" from="." to="split/split2/middle dock/buttons/container/duplicate" method="_on_selection_changed"]
+[connection signal="selection_changed" from="." to="split/split2/right dock/panel/panelinner/inspector/wall" method="_on_track_editor_selection_changed"]
+[connection signal="back" from="split/left dock/data/container/buttons/back" to="." method="queue_free"]
+[connection signal="pressed" from="split/left dock/data/container/buttons/back" to="split/left dock/data/container/buttons/back" method="_on_pressed"]
+[connection signal="pressed" from="split/left dock/data/container/buttons/save" to="split/left dock/data/container/buttons/save" method="_on_pressed"]
+[connection signal="cell_selected" from="split/left dock/fs/fs tree" to="split/left dock/fs/fs tree" method="_on_cell_selected"]
+[connection signal="cell_selected" from="split/left dock/fs/fs tree" to="split/left dock/fs/fs tree" method="expand_selected"]
+[connection signal="selected_dir" from="split/left dock/fs/fs tree" to="split/left dock/fs/items" method="open_dir"]
+[connection signal="dir_selected" from="split/left dock/fs/items" to="split/left dock/fs/fs tree" method="_on_items_dir_selected"]
+[connection signal="dir_selected" from="split/left dock/fs/items" to="split/left dock/fs/fs tree" method="expand_selected" unbinds=1]
+[connection signal="tree_exiting" from="split/left dock/fs/items" to="split/left dock/fs/items" method="_on_tree_exiting"]
+[connection signal="toggled" from="split/split2/middle dock/buttons/container/snapping" to="." method="_on_snapping_toggled"]
+[connection signal="toggled" from="split/split2/middle dock/buttons/container/brush" to="." method="_on_brush_toggled"]
+[connection signal="pressed" from="split/split2/middle dock/buttons/container/delete" to="." method="_on_delete_pressed"]
+[connection signal="created" from="split/split2/middle dock/viewport/view" to="." method="_on_item_created"]
+[connection signal="created" from="split/split2/middle dock/viewport/view" to="split/split2/middle dock/viewport/view/port/mousecast" method="_on_view_created" unbinds=1]
+[connection signal="remove_tobj" from="split/split2/middle dock/viewport/view" to="." method="_on_remove_tobj"]
+[connection signal="remove_tobj" from="split/split2/middle dock/viewport/view" to="split/split2/middle dock/viewport/view/port" method="_on_remove_tobj" unbinds=1]
+[connection signal="hit" from="split/split2/middle dock/viewport/view/port/mousecast" to="." method="_on_mousecast_hit"]
+[connection signal="hit" from="split/split2/middle dock/viewport/view/port/mousecast" to="split/split2/middle dock/buttons/container/brush" method="_on_mousecast_hit"]
diff --git a/ui/editor/track_select.gd b/ui/editor/track_select.gd
new file mode 100644
index 0000000..e7ed050
--- /dev/null
+++ b/ui/editor/track_select.gd
@@ -0,0 +1,39 @@
+extends TrackSelect
+class_name TrackEditorList
+
+@export var other: BuiltinTrackSelect
+var tracks: Array[TrackResource] = []
+
+func _ready() -> void:
+ if not DirAccess.dir_exists_absolute(Globals.TRACKS.get_base_dir()):
+ DirAccess.make_dir_recursive_absolute(Globals.TRACKS.get_base_dir())
+ var d := DirAccess.open(Globals.TRACKS.get_base_dir())
+ d.list_dir_begin()
+ var item := d.get_next()
+ while !item.is_empty():
+ tracks.append(TrackResource._load(Globals.TRACKS.get_base_dir().path_join(item)))
+ item = d.get_next()
+ mkbuttons(tracks)
+ super()
+
+func _on_mkbutton(b: TrackButton, t: TrackResource) -> void:
+ @warning_ignore("static_called_on_instance")
+ b.include.connect(func(): other.add(t); BuiltinTrackSelect.delete(t); b.queue_free())
+
+func _on_new_pressed() -> void:
+ var res := TrackResource.new([])
+ var n := 0
+ while FileAccess.file_exists(Globals.TRACKS % ("untitled track %d" % n if n != 0 else "untitled track")):
+ n+=1
+ var nam := "untitled track %d" % n if n != 0 else "untitled track"
+ res.name = nam
+ edit(res)
+ tracks.append(res)
+ mkbutton(res)
+
+func _on_import_import(p_track: TrackResource) -> void:
+ for track in tracks:
+ if track.name == p_track.name:
+ return
+ p_track.save(Globals.TRACKS % p_track.name)
+ mkbutton(p_track)
diff --git a/ui/editor/tree.gd b/ui/editor/tree.gd
new file mode 100644
index 0000000..df1f0ab
--- /dev/null
+++ b/ui/editor/tree.gd
@@ -0,0 +1,34 @@
+@tool
+extends Tree
+
+@export var root_fs: DirRes
+var selected: DirRes
+
+signal selected_dir(d: DirRes)
+
+func _ready() -> void:
+ var root := create_item();
+ populate(root_fs, root)
+
+func populate(fs: DirRes, parent: TreeItem):
+ for file in fs.files:
+ if file is DirRes:
+ var item := create_item(parent)
+ item.set_icon(0, preload("res://ui/assets/folder.png"))
+ item.set_icon_max_width(0, 24)
+ item.set_text(0, file.resource_name)
+ item.set_meta(&"res", file)
+ item.set_tooltip_text(0, file.description)
+ item.collapsed = true
+ populate(file, item)
+ else: pass # we dont do files here (that responsibility goes to items)
+
+func expand_selected() -> void:
+ get_selected().collapsed = false
+
+func _on_cell_selected() -> void:
+ selected = get_selected().get_meta(&"res")
+ selected_dir.emit(selected)
+
+func _on_items_dir_selected(i: int) -> void:
+ get_selected().get_child(i).select(0)
diff --git a/ui/editor/undo.gd b/ui/editor/undo.gd
new file mode 100644
index 0000000..c66186b
--- /dev/null
+++ b/ui/editor/undo.gd
@@ -0,0 +1,13 @@
+extends Button
+
+@onready var hist: UndoRedo = owner.history
+
+func _pressed() -> void:
+ owner.reset_selected()
+ hist.undo()
+
+func _ready() -> void:
+ hist.version_changed.connect(
+ func():
+ disabled = !hist.has_undo()
+ )
diff --git a/ui/editor/wall_tool.gd b/ui/editor/wall_tool.gd
new file mode 100644
index 0000000..5172fd1
--- /dev/null
+++ b/ui/editor/wall_tool.gd
@@ -0,0 +1,55 @@
+extends Control
+class_name WallTool
+
+var initializing := false
+var blocks: Array[Block]
+@export var editor: TrackEditor
+@onready var hist: UndoRedo = editor.history
+@onready var buttons := {
+ Block.WALL_W: %west,
+ Block.WALL_E: %east,
+ Block.WALL_S: %south,
+ Block.WALL_N: %north,
+}
+
+func _ready() -> void:
+ reset()
+
+func toggle(on: bool, wall: int) -> void:
+ if initializing: return
+ hist.create_action("set %s wall on %d nodes" % [Block.STRING[wall], len(blocks)])
+ for block in blocks:
+ if block.get_wall_mode() & wall:
+ if on and not block.has_wall(wall):
+ hist.add_do_method(block.make_wall.bind(wall))
+ hist.add_undo_method(block.make_wall.bind(wall))
+ elif block.has_wall(wall):
+ hist.add_do_method(block.remove_wall.bind(wall))
+ hist.add_undo_method(block.make_wall.bind(wall))
+ hist.commit_action()
+
+func reset():
+ visible = false
+ for button in buttons.values():
+ button.disabled = true
+ blocks.clear()
+
+func _on_track_editor_selection_changed(p_nodes: Array[TrackObject]) -> void:
+ reset()
+ initializing = true
+ var has_map := { Block.WALL_W: 0, Block.WALL_E: 0, Block.WALL_N: 0, Block.WALL_S: 0 }
+ for node in p_nodes:
+ var wm := node.live_node.get_wall_mode()
+ if wm == 0:
+ continue
+ for wall in buttons:
+ if wm & wall:
+ buttons[wall].disabled = false
+ visible = true
+ if node.live_node.has_wall(wall):
+ has_map[wall] += 1
+ blocks.append(node.live_node)
+ var half_or_none := roundi(blocks.size()/2.0) if blocks.size()>1 else 0
+ for wall in buttons:
+ buttons[wall].button_pressed = has_map[wall] > half_or_none
+ initializing = false
diff --git a/ui/editor/wall_tool.tscn b/ui/editor/wall_tool.tscn
new file mode 100644
index 0000000..1ed8507
--- /dev/null
+++ b/ui/editor/wall_tool.tscn
@@ -0,0 +1,66 @@
+[gd_scene load_steps=3 format=3 uid="uid://cvs6pj6a5w5t"]
+
+[ext_resource type="Script" path="res://ui/editor/wall_tool.gd" id="1_35bl1"]
+[ext_resource type="StyleBox" uid="uid://bg21fak47r0np" path="res://ui/panel_light.stylebox" id="2_326xw"]
+
+[node name="wall" type="VBoxContainer"]
+script = ExtResource("1_35bl1")
+
+[node name="label" type="Label" parent="."]
+layout_mode = 2
+theme_override_styles/normal = ExtResource("2_326xw")
+text = "󰟾 walls"
+horizontal_alignment = 1
+
+[node name="west" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="label" type="Label" parent="west"]
+custom_minimum_size = Vector2(200, 0)
+layout_mode = 2
+text = " wall"
+
+[node name="west" type="CheckBox" parent="west"]
+unique_name_in_owner = true
+layout_mode = 2
+
+[node name="east" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="label" type="Label" parent="east"]
+custom_minimum_size = Vector2(200, 0)
+layout_mode = 2
+text = " wall"
+
+[node name="east" type="CheckBox" parent="east"]
+unique_name_in_owner = true
+layout_mode = 2
+
+[node name="north" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="label" type="Label" parent="north"]
+custom_minimum_size = Vector2(200, 0)
+layout_mode = 2
+text = " wall"
+
+[node name="north" type="CheckBox" parent="north"]
+unique_name_in_owner = true
+layout_mode = 2
+
+[node name="south" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="label" type="Label" parent="south"]
+custom_minimum_size = Vector2(200, 0)
+layout_mode = 2
+text = " wall"
+
+[node name="south" type="CheckBox" parent="south"]
+unique_name_in_owner = true
+layout_mode = 2
+
+[connection signal="toggled" from="west/west" to="." method="toggle" binds= [1]]
+[connection signal="toggled" from="east/east" to="." method="toggle" binds= [2]]
+[connection signal="toggled" from="north/north" to="." method="toggle" binds= [8]]
+[connection signal="toggled" from="south/south" to="." method="toggle" binds= [4]]
diff --git a/ui/finish.tscn b/ui/finish.tscn
index d87c7a3..85a462d 100644
--- a/ui/finish.tscn
+++ b/ui/finish.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=16 format=3 uid="uid://cr1mgp6bgxh64"]
-[ext_resource type="Theme" uid="uid://cru1d7n2ftrfm" path="res://ui/theme.tres" id="1_aykd4"]
+[ext_resource type="Theme" uid="uid://d3ywcokn5ddy8" path="res://ui/theme.tres" id="1_aykd4"]
[ext_resource type="Script" path="res://ui/finish.gd" id="1_crs2w"]
[ext_resource type="Script" path="res://ui/diff.gd" id="2_gtres"]
[ext_resource type="SystemFont" uid="uid://d2klp6vxh5l2d" path="res://ui/cascadiabold.tres" id="3_qktla"]
@@ -8,7 +8,7 @@
[ext_resource type="SystemFont" uid="uid://bkjqtc5i64r3j" path="res://ui/ubuntu.tres" id="5_llemr"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bgqa0"]
-bg_color = Color(0.027451, 0.211765, 0.258824, 1)
+bg_color = Color(0, 0.168627, 0.211765, 1)
corner_radius_top_left = 100
corner_radius_top_right = 100
corner_radius_bottom_right = 100
diff --git a/ui/hud.gd b/ui/hud.gd
index 064ac6b..e8a453a 100644
--- a/ui/hud.gd
+++ b/ui/hud.gd
@@ -1,7 +1,7 @@
extends Node
class_name HUD
-signal assigned(car, ghost: GhostCar, timer: GameTimer, track: TrackLoader)
+signal assigned(car, timer: GameTimer, track: TrackLoader)
signal next_lap
@export var splits: Splits
diff --git a/ui/hud.tscn b/ui/hud.tscn
index 8ac3f5b..5f1d25e 100644
--- a/ui/hud.tscn
+++ b/ui/hud.tscn
@@ -1,17 +1,13 @@
-[gd_scene load_steps=18 format=3 uid="uid://vok7fdcyec68"]
+[gd_scene load_steps=13 format=3 uid="uid://vok7fdcyec68"]
-[ext_resource type="Theme" uid="uid://cru1d7n2ftrfm" path="res://ui/theme.tres" id="1_ie2j2"]
+[ext_resource type="Theme" uid="uid://d3ywcokn5ddy8" path="res://ui/theme.tres" id="1_ie2j2"]
[ext_resource type="Script" path="res://ui/hud.gd" id="1_sfhpc"]
[ext_resource type="Script" path="res://ui/speedometer.gd" id="2_cvi37"]
[ext_resource type="Script" path="res://ui/timer.gd" id="3_poksb"]
-[ext_resource type="Texture2D" uid="uid://bfe4ytl0vjosb" path="res://ui/assets/line.png" id="4_o0swd"]
[ext_resource type="SystemFont" uid="uid://bkjqtc5i64r3j" path="res://ui/ubuntu.tres" id="4_sh4bn"]
-[ext_resource type="Script" path="res://ui/map.gd" id="5_blxcm"]
[ext_resource type="Script" path="res://ui/gears.gd" id="5_g6cg4"]
[ext_resource type="StyleBox" uid="uid://cly1aqudpku5j" path="res://ui/panel_skew_r.tres" id="6_g2n2l"]
-[ext_resource type="Texture2D" uid="uid://b3nmp7eyu0hjk" path="res://ui/assets/flag.png" id="6_ho2g6"]
-[ext_resource type="Texture2D" uid="uid://b6ad1yrgtg6qk" path="res://ui/assets/player_indicator.png" id="7_wv12s"]
-[ext_resource type="Texture2D" uid="uid://dkbrx7rpa8dvc" path="res://ui/assets/ghost.png" id="8_yfv7r"]
+[ext_resource type="FontVariation" uid="uid://ba8ab6dti2fvo" path="res://ui/boldsans.tres" id="8_mupi7"]
[ext_resource type="PackedScene" uid="uid://nkh2xi7tnumc" path="res://ui/splits/splits.tscn" id="9_gtkqi"]
[ext_resource type="Script" path="res://ui/laps.gd" id="10_78pxt"]
@@ -29,10 +25,6 @@ corner_radius_bottom_right = 20
corner_radius_bottom_left = 20
corner_detail = 12
-[sub_resource type="Gradient" id="Gradient_2kvil"]
-offsets = PackedFloat32Array(0, 0.178744, 0.454106, 0.719807, 1)
-colors = PackedColorArray(0.85098, 0.85098, 0.85098, 1, 0.942823, 0.942823, 0.942822, 1, 0.868985, 0.868985, 0.868985, 1, 0.838897, 0.838897, 0.838897, 1, 0.85098, 0.85098, 0.85098, 1)
-
[node name="HUD" type="Control" node_paths=PackedStringArray("splits", "laps")]
layout_mode = 3
anchors_preset = 15
@@ -93,6 +85,7 @@ custom_minimum_size = Vector2(0, 105)
layout_mode = 2
size_flags_horizontal = 4
theme_override_colors/font_color = Color(0.992157, 0.964706, 0.890196, 1)
+theme_override_font_sizes/font_size = 76
text = "龍 0km/h"
horizontal_alignment = 1
vertical_alignment = 1
@@ -123,40 +116,18 @@ custom_minimum_size = Vector2(200, 105)
layout_mode = 2
size_flags_horizontal = 4
theme_override_colors/default_color = Color(0.992157, 0.964706, 0.890196, 1)
+theme_override_fonts/bold_font = ExtResource("8_mupi7")
bbcode_enabled = true
text = "[center] [b][color=#4682b4]N[/color][/b][/center]"
script = ExtResource("5_g6cg4")
-[node name="MiniMapContainer" type="MarginContainer" parent="."]
-custom_minimum_size = Vector2(500, 500)
-layout_mode = 1
-offset_left = 25.0
-offset_top = 25.0
-offset_right = 525.0
-offset_bottom = 525.0
-
-[node name="MiniMap" type="Line2D" parent="MiniMapContainer"]
-texture_repeat = 2
-width = 40.0
-default_color = Color(0.854902, 0.854902, 0.854902, 1)
-gradient = SubResource("Gradient_2kvil")
-texture = ExtResource("4_o0swd")
-texture_mode = 1
-antialiased = true
-script = ExtResource("5_blxcm")
-player_color = Color(1, 0.388235, 0.321569, 1)
-finish_indicator = ExtResource("6_ho2g6")
-player_indicator = ExtResource("7_wv12s")
-ghost_indicator = ExtResource("8_yfv7r")
-
[node name="Splits" parent="." instance=ExtResource("9_gtkqi")]
layout_mode = 1
offset_top = -403.0
offset_bottom = -303.0
[connection signal="assigned" from="." to="Dashboard/laps" method="assigned"]
-[connection signal="assigned" from="." to="MiniMapContainer/MiniMap" method="assigned"]
-[connection signal="assigned" from="." to="Dashboard/speed/speed" method="car_assigned" unbinds=3]
+[connection signal="assigned" from="." to="Dashboard/speed/speed" method="car_assigned" unbinds=2]
[connection signal="assigned" from="." to="Dashboard/timer/time" method="assigned" unbinds=1]
-[connection signal="assigned" from="." to="Dashboard/gears/gears" method="assigned" unbinds=3]
+[connection signal="assigned" from="." to="Dashboard/gears/gears" method="assigned" unbinds=2]
[connection signal="next_lap" from="." to="Dashboard/laps" method="increment"]
diff --git a/ui/intro_cam.gd b/ui/intro_cam.gd
index ee2d7f5..0f7d919 100644
--- a/ui/intro_cam.gd
+++ b/ui/intro_cam.gd
@@ -14,15 +14,15 @@ func _init(_track: TrackResource, _main_cam: Camera3D):
main_cam = _main_cam
attributes = CameraAttributesPractical.new()
+static func get_origin(t: TrackResource) -> Transform3D:
+ var box := t.get_aabb()
+ var box_center := box.get_center()
+ var top_center := Vector3(box_center.x, t.overview_height, box_center.z)
+ return Transform3D(Basis.from_euler(Vector3(-PI/2, 0, 0)), top_center)
+
func _ready() -> void:
make_current()
- var box := AABB()
- for i in track.track.point_count:
- box = box.expand(track.track.get_point_position(i))
- var box_center := box.get_center()
- var top_center := Vector3(box_center.x, track.overview_height, box_center.z)
- global_position = top_center
- global_rotation_degrees.x = -90
+ transform = IntroCam.get_origin(track)
if is_instance_valid(main_cam):
await get_tree().create_timer(2).timeout
var tween := get_tree().create_tween().set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
diff --git a/ui/laps.gd b/ui/laps.gd
index df4fa5d..f3b7da7 100644
--- a/ui/laps.gd
+++ b/ui/laps.gd
@@ -4,13 +4,15 @@ class_name LapCounter
var track: TrackLoader
@export var label: Label
-var lap := 0
+var lap := 0:
+ set(l):
+ lap = l
+ label.text = " %d/%d" % [lap, track.track.laps]
func increment() -> void:
lap += 1
- label.text = " %d/%d" % [lap, track.track.laps]
-func assigned(_car, _ghost, _timer, _track: TrackLoader) -> void:
+func assigned(_car, _timer, _track: TrackLoader) -> void:
track = _track
visible = track.track.laps > 1
increment()
diff --git a/ui/map.gd b/ui/map.gd
deleted file mode 100644
index 2b48db3..0000000
--- a/ui/map.gd
+++ /dev/null
@@ -1,71 +0,0 @@
-extends Line2D
-class_name MiniMap
-
-var path := Path2D.new()
-var track: TrackLoader
-
-@export var player_color: Color
-@export var finish_indicator: Texture
-@export var player_indicator: Texture
-@export var ghost_indicator: Texture
-
-var followers: Array = [] # Array[[PathFollow2D, Sprite2D, Node3D]]
-
-func _ready() -> void:
- clear_points()
- width = track.track.track_width
- if !track.track.is_loop:
- end_cap_mode = LINE_CAP_ROUND
- begin_cap_mode = LINE_CAP_ROUND
-
- var curve := Curve2D.new()
- curve.bake_interval = 200 # already baked
- var box := Rect2()
- for point_3d in track.curve.get_baked_points():
- var p := flatten(point_3d)
- curve.add_point(p)
- box = box.expand(p)
- add_point(p)
- path.curve = curve
- add_child(path)
- position = -box.position
- scale = vec((add((get_parent() as Container).get_rect().size) / add(box.size))/2)
- mkfollower(track.finish, finish_indicator, Color.WHITE, false, true)
-
-func _process(_delta: float) -> void:
- for follower in followers:
- if is_instance_valid(follower[2]):
- (follower[0] as PathFollow2D).progress = track.curve.get_closest_offset((follower[2] as Node3D).global_position)
- if !follower[0].rotates:
- (follower[1] as Sprite2D).global_rotation = -follower[2].global_rotation.y - PI/2
-
-func mkfollower(node: Node3D, tex: Texture, mod := Color.WHITE, back := false, rotates := false):
- if !is_instance_valid(node):
- push_warning("invalid follower")
- return
- var follower := PathFollow2D.new()
- follower.rotates = rotates
- path.add_child(follower)
- var sprite := Sprite2D.new()
- sprite.modulate = mod
- sprite.texture = tex
- follower.add_child(sprite)
- if back:
- followers.push_front([follower, sprite, node])
- else:
- followers.push_back([follower,sprite, node])
-
-func vec(f: float) -> Vector2:
- return Vector2(f, f)
-
-func add(v: Vector2) -> float:
- return v.x + v.y
-
-func flatten(v: Vector3) -> Vector2:
- return Vector2(v.x, v.z)
-
-func assigned(car, ghost: GhostCar, _timer, _track: TrackLoader) -> void:
- mkfollower(ghost, ghost_indicator, Color(1,1,1,.5), true)
- if car != ghost:
- mkfollower(car, player_indicator, player_color)
- track = _track
diff --git a/ui/multi_button.gd b/ui/multi_button.gd
new file mode 100644
index 0000000..3db2b39
--- /dev/null
+++ b/ui/multi_button.gd
@@ -0,0 +1,31 @@
+extends Button
+class_name MultiButton
+
+@export var secondary: Control
+
+func update(_var = null): # cant unbind when connecting signals in code
+ var color: StringName = &"font_color"
+ if disabled:
+ color = &"font_disabled_color"
+ elif button_pressed:
+ color = &"font_pressed_color"
+ elif (is_hovered() if _var == null else _var) || has_focus():
+ color = &"font_hover_color"
+ set_c(get_theme_color(color))
+
+func set_c(c: Color) -> void:
+ if secondary is Label:
+ secondary.label_settings.font_color = c
+ elif secondary is TextureRect:
+ secondary.modulate = c
+
+func _ready() -> void:
+ update()
+ toggled.connect(update)
+ focus_entered.connect(update)
+ focus_exited.connect(update)
+ mouse_entered.connect(update.bind(true))
+ mouse_exited.connect(update.bind(false))
+ pressed.connect(update)
+ button_up.connect(update)
+ button_down.connect(update)
diff --git a/ui/panel_dark.stylebox b/ui/panel_dark.stylebox
new file mode 100644
index 0000000..d8af703
--- /dev/null
+++ b/ui/panel_dark.stylebox
Binary files differ
diff --git a/ui/panel_light.stylebox b/ui/panel_light.stylebox
new file mode 100644
index 0000000..b2ffa85
--- /dev/null
+++ b/ui/panel_light.stylebox
Binary files differ
diff --git a/ui/theme.tres b/ui/theme.tres
index a672edf..a545b32 100644
--- a/ui/theme.tres
+++ b/ui/theme.tres
@@ -1,24 +1,189 @@
-[gd_resource type="Theme" load_steps=5 format=3 uid="uid://cru1d7n2ftrfm"]
+[gd_resource type="Theme" load_steps=23 format=3 uid="uid://d3ywcokn5ddy8"]
[ext_resource type="SystemFont" uid="uid://xriuk0v4f6wj" path="res://ui/ubuntu_mononf.tres" id="1_37cf0"]
[ext_resource type="StyleBox" uid="uid://cdth5nc7lbx1v" path="res://ui/panel_skewed.tres" id="1_g8q83"]
[ext_resource type="StyleBox" uid="uid://bkxlhm4hc5lco" path="res://ui/assets/button_focus.stylebox" id="1_t7nt0"]
+[ext_resource type="StyleBox" uid="uid://bg21fak47r0np" path="res://ui/panel_light.stylebox" id="2_0o40a"]
+[ext_resource type="Texture2D" uid="uid://bi5378730g7ag" path="res://ui/assets/checkedbox.png" id="2_7t4t0"]
+[ext_resource type="Texture2D" uid="uid://cvhkgqjcmjhjf" path="res://ui/assets/checkbox_disabled.png" id="3_6k4vd"]
[ext_resource type="FontVariation" uid="uid://ba8ab6dti2fvo" path="res://ui/boldsans.tres" id="3_fpgf0"]
+[ext_resource type="Texture2D" uid="uid://ch6jipulckgt" path="res://ui/assets/checkbox.png" id="3_xehpy"]
+[ext_resource type="StyleBox" uid="uid://dxtsrhgnyr80k" path="res://ui/panel_dark.stylebox" id="4_mx083"]
+[ext_resource type="Texture2D" uid="uid://vck01c83m1x3" path="res://ui/assets/arrow.png" id="6_uqp3t"]
+[ext_resource type="Texture2D" uid="uid://buwxt5g5y761m" path="res://ui/assets/arrow_collapsed.png" id="7_raqbt"]
+[ext_resource type="SystemFont" uid="uid://bkjqtc5i64r3j" path="res://ui/ubuntu.tres" id="10_1rhih"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_o4qbo"]
+content_margin_left = 5.0
+content_margin_top = 5.0
+content_margin_right = 5.0
+content_margin_bottom = 5.0
+bg_color = Color(0.0156863, 0.152941, 0.188235, 1)
+corner_radius_top_left = 9
+corner_radius_top_right = 9
+corner_radius_bottom_right = 9
+corner_radius_bottom_left = 9
+corner_detail = 12
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pmkpt"]
+content_margin_left = 5.0
+content_margin_top = 5.0
+content_margin_right = 5.0
+content_margin_bottom = 5.0
+bg_color = Color(0.0431373, 0.270588, 0.32549, 1)
+border_width_left = 4
+border_width_top = 4
+border_width_right = 4
+border_width_bottom = 4
+border_color = Color(0.396078, 0.482353, 0.513726, 1)
+corner_radius_top_left = 9
+corner_radius_top_right = 9
+corner_radius_bottom_right = 9
+corner_radius_bottom_left = 9
+corner_detail = 12
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2erjs"]
+content_margin_left = 5.0
+content_margin_top = 5.0
+content_margin_right = 5.0
+content_margin_bottom = 5.0
+bg_color = Color(0.0431373, 0.270588, 0.32549, 1)
+corner_radius_top_left = 9
+corner_radius_top_right = 9
+corner_radius_bottom_right = 9
+corner_radius_bottom_left = 9
+corner_detail = 12
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vcupl"]
+bg_color = Color(0.345098, 0.431373, 0.458824, 1)
+border_width_left = 4
+border_width_top = 4
+border_width_right = 4
+border_width_bottom = 4
+border_color = Color(0.14902, 0.545098, 0.823529, 1)
+corner_radius_top_left = 9
+corner_radius_top_right = 9
+corner_radius_bottom_right = 9
+corner_radius_bottom_left = 9
+corner_detail = 12
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_1onps"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ki0ve"]
+content_margin_left = 10.0
+content_margin_top = 10.0
+content_margin_right = 10.0
+content_margin_bottom = 10.0
+bg_color = Color(0, 0.168627, 0.211765, 1)
+corner_radius_bottom_right = 10
+corner_radius_bottom_left = 10
+corner_detail = 12
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_y04f3"]
+content_margin_left = 5.0
+content_margin_top = 5.0
+content_margin_right = 5.0
+content_margin_bottom = 5.0
+bg_color = Color(0.027451, 0.211765, 0.258824, 1)
+border_width_top = 2
+border_color = Color(0.14902, 0.545098, 0.823529, 1)
+corner_radius_top_left = 1
+corner_radius_top_right = 1
+corner_detail = 1
+expand_margin_top = 3.0
+anti_aliasing = false
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_m0gry"]
+content_margin_left = 10.0
+content_margin_top = 10.0
+content_margin_right = 10.0
+content_margin_bottom = 10.0
+bg_color = Color(0, 0.109804, 0.145098, 1)
+corner_radius_top_left = 53
+corner_radius_top_right = 53
+corner_detail = 1
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_b8jmu"]
+content_margin_left = 5.0
+content_margin_top = 5.0
+content_margin_right = 5.0
+content_margin_bottom = 5.0
+bg_color = Color(0.0431373, 0.270588, 0.32549, 1)
+corner_radius_top_left = 15
+corner_radius_top_right = 15
+corner_radius_bottom_right = 15
+corner_radius_bottom_left = 15
+
+[sub_resource type="StyleBoxLine" id="StyleBoxLine_vr8fs"]
+color = Color(0.345098, 0.431373, 0.458824, 1)
+grow_begin = -10.0
+grow_end = -10.0
+vertical = true
[resource]
default_font = ExtResource("1_37cf0")
-default_font_size = 76
+default_font_size = 25
Button/colors/font_color = Color(0.933333, 0.909804, 0.835294, 1)
+Button/colors/font_disabled_color = Color(0.396078, 0.482353, 0.513726, 1)
Button/colors/font_focus_color = Color(0.992157, 0.964706, 0.890196, 1)
Button/colors/font_hover_color = Color(0.992157, 0.964706, 0.890196, 1)
Button/colors/font_hover_pressed_color = Color(0.992157, 0.964706, 0.890196, 1)
-Button/colors/font_pressed_color = Color(0.576471, 0.631373, 0.631373, 1)
+Button/colors/font_pressed_color = Color(0.992157, 0.964706, 0.890196, 1)
+Button/styles/disabled = SubResource("StyleBoxFlat_o4qbo")
Button/styles/focus = ExtResource("1_t7nt0")
+Button/styles/hover = SubResource("StyleBoxFlat_pmkpt")
+Button/styles/normal = SubResource("StyleBoxFlat_2erjs")
+Button/styles/pressed = SubResource("StyleBoxFlat_vcupl")
+CheckBox/icons/checked = ExtResource("2_7t4t0")
+CheckBox/icons/checked_disabled = ExtResource("3_6k4vd")
+CheckBox/icons/unchecked = ExtResource("3_xehpy")
+CheckBox/styles/disabled = SubResource("StyleBoxEmpty_1onps")
+CheckBox/styles/focus = SubResource("StyleBoxEmpty_1onps")
+CheckBox/styles/hover = SubResource("StyleBoxEmpty_1onps")
+CheckBox/styles/hover_pressed = SubResource("StyleBoxEmpty_1onps")
+CheckBox/styles/normal = SubResource("StyleBoxEmpty_1onps")
+CheckBox/styles/pressed = SubResource("StyleBoxEmpty_1onps")
+ItemList/colors/guide_color = Color(0, 0, 0, 0)
+ItemList/constants/line_separation = 0
+ItemList/styles/panel = ExtResource("2_0o40a")
Label/colors/font_color = Color(0.933333, 0.909804, 0.835294, 1)
-Label/font_sizes/font_size = 76
+Label/font_sizes/font_size = 25
Label/fonts/font = ExtResource("1_37cf0")
+LineEdit/colors/font_color = Color(0.933333, 0.909804, 0.835294, 1)
+LineEdit/colors/font_placeholder_color = Color(0.396078, 0.482353, 0.513726, 1)
+LineEdit/colors/font_selected_color = Color(0.992157, 0.964706, 0.890196, 1)
+LineEdit/colors/selection_color = Color(0.513726, 0.580392, 0.588235, 1)
+LineEdit/styles/normal = ExtResource("4_mx083")
+Panel/styles/panel = ExtResource("2_0o40a")
PanelContainer/styles/panel = ExtResource("1_g8q83")
RichTextLabel/font_sizes/bold_font_size = 76
RichTextLabel/font_sizes/normal_font_size = 76
RichTextLabel/fonts/bold_font = ExtResource("3_fpgf0")
RichTextLabel/fonts/normal_font = ExtResource("1_37cf0")
+TabContainer/font_sizes/font_size = 32
+TabContainer/styles/panel = SubResource("StyleBoxFlat_ki0ve")
+TabContainer/styles/tab_selected = SubResource("StyleBoxFlat_y04f3")
+TabContainer/styles/tab_unselected = ExtResource("4_mx083")
+TabContainer/styles/tabbar_background = SubResource("StyleBoxFlat_m0gry")
+TooltipLabel/colors/font_color = Color(0.933333, 0.909804, 0.835294, 1)
+TooltipLabel/fonts/font = ExtResource("10_1rhih")
+TooltipPanel/styles/panel = SubResource("StyleBoxFlat_b8jmu")
+Tree/colors/children_hl_line_color = Color(0.396078, 0.482353, 0.513726, 1)
+Tree/colors/font_color = Color(0.501961, 0.596078, 0.627451, 1)
+Tree/colors/font_selected_color = Color(0.933333, 0.909804, 0.835294, 1)
+Tree/colors/parent_hl_line_color = Color(0.345098, 0.431373, 0.458824, 1)
+Tree/colors/relationship_line_color = Color(0.345098, 0.431373, 0.458824, 1)
+Tree/constants/children_hl_line_width = 3
+Tree/constants/draw_guides = 0
+Tree/constants/draw_relationship_lines = 1
+Tree/constants/item_margin = 10
+Tree/constants/parent_hl_line_width = 3
+Tree/constants/relationship_line_width = 2
+Tree/constants/v_separation = 1
+Tree/icons/arrow = ExtResource("6_uqp3t")
+Tree/icons/arrow_collapsed = ExtResource("7_raqbt")
+Tree/styles/panel = ExtResource("2_0o40a")
+VSeparator/constants/separation = 0
+VSeparator/styles/separator = SubResource("StyleBoxLine_vr8fs")
+ui_panel/base_type = &"PanelContainer"
+ui_panel/styles/panel = ExtResource("4_mx083")
diff --git a/ui/timer.gd b/ui/timer.gd
index a8a5b69..37c70d0 100644
--- a/ui/timer.gd
+++ b/ui/timer.gd
@@ -2,8 +2,8 @@ extends Label
var timer: GameTimer
-func assigned(_car, _ghost, _timer: GameTimer) -> void:
- timer = _timer
+func assigned(_car, p_timer: GameTimer) -> void:
+ timer = p_timer
func _process(_delta: float) -> void:
- text = "祥 %s" % timer.fmt_now() \ No newline at end of file
+ text = "祥 %s" % timer.fmt_now()
diff --git a/ui/track_button.gd b/ui/track_button.gd
new file mode 100644
index 0000000..97aca44
--- /dev/null
+++ b/ui/track_button.gd
@@ -0,0 +1,69 @@
+extends Control
+class_name TrackButton
+
+signal edit
+signal delete
+signal play
+signal watch
+signal include
+
+const trackloader_scn = preload("res://scenes/track.tscn")
+
+@export var button: Button
+
+var editable := false # can edit
+var dev := false # can edit main tracks and can move tracks into main
+var builtin := false # added to tracks.cfg
+
+func _ready() -> void:
+ %edit.visible = editable || dev
+ %delete.visible = editable || dev
+ %include.visible = dev && !builtin
+
+func init(t: TrackResource, g: GhostData) -> void:
+ %name.text = t.name
+ t.name_changed.connect(func(n: String): %name.text = n)
+ if g == null:
+ %watch.hide()
+ %time.text = "no time set"
+ else:
+ %time.text = GameTimer.format_precise(g.time)
+ builtin = t.builtin
+ var tex := Thumbnail._load(Globals.THUMBS % t.name, Thumbnail.hash_b(t.bytes()), false)
+ if tex == null:
+ tex = await mkthumb(t)
+ %thumb.texture = ImageTexture.create_from_image(tex)
+ # update thumb on save
+ t.saved.connect(func(): %thumb.texture = ImageTexture.create_from_image(await mkthumb(t)))
+
+func mkthumb(t: TrackResource) -> Image:
+ var p: String = Globals.THUMBS % t.name
+ var trackloader: TrackLoader = trackloader_scn.instantiate()
+ trackloader.track = t
+ trackloader.add_child(IntroCam.new(t, null))
+ var tex := await Thumbnail.create_thumb(self, trackloader, Vector2i(450, 200))
+ var e := Thumbnail.save(tex, p, Thumbnail.hash_b(t.bytes()))
+ if e != OK:
+ push_error("saving thumbnail failed with error %d" % e)
+ return tex
+
+func _on_delete_pressed() -> void:
+ var dialog := ConfirmationDialog.new()
+ dialog.min_size = Vector2(250, 100)
+ dialog.exclusive = true
+ dialog.title = "Are you sure!"
+ dialog.dialog_text = "Delete track!"
+ dialog.cancel_button_text = "no way"
+ dialog.ok_button_text = "yea sure"
+ dialog.dialog_hide_on_ok = false
+ dialog.dialog_close_on_escape = false
+ dialog.unresizable = true
+ dialog.popup_window = true
+ dialog.initial_position = Window.WINDOW_INITIAL_POSITION_CENTER_MAIN_WINDOW_SCREEN
+ dialog.add_theme_stylebox_override("panel", preload("res://ui/panel_dark.stylebox"))
+ add_child(dialog)
+ dialog.show()
+ dialog.confirmed.connect(emit_signal.bind(&"delete"))
+ dialog.canceled.connect(dialog.queue_free)
+ dialog.confirmed.connect(queue_free)
+
diff --git a/ui/track_button.tscn b/ui/track_button.tscn
index 4e25103..577d588 100644
--- a/ui/track_button.tscn
+++ b/ui/track_button.tscn
@@ -1,15 +1,13 @@
-[gd_scene load_steps=9 format=3 uid="uid://dfvtugujgcjcw"]
+[gd_scene load_steps=13 format=3 uid="uid://c6ntm3pmyfcuh"]
-[ext_resource type="Theme" uid="uid://cru1d7n2ftrfm" path="res://ui/theme.tres" id="1_noykn"]
-[ext_resource type="Script" path="res://ui/trackbutton.gd" id="2_bcpuy"]
+[ext_resource type="Theme" uid="uid://d3ywcokn5ddy8" path="res://ui/theme.tres" id="1_noykn"]
+[ext_resource type="Script" path="res://ui/track_button.gd" id="2_bbj4u"]
[ext_resource type="FontVariation" uid="uid://ba8ab6dti2fvo" path="res://ui/boldsans.tres" id="2_gctvu"]
[ext_resource type="SystemFont" uid="uid://d2klp6vxh5l2d" path="res://ui/cascadiabold.tres" id="3_suph6"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fymg3"]
bg_color = Color(0.137255, 0.137255, 0.137255, 1)
-[sub_resource type="World3D" id="World3D_vgauv"]
-
[sub_resource type="LabelSettings" id="LabelSettings_sa0e6"]
font = ExtResource("2_gctvu")
font_size = 25
@@ -20,24 +18,41 @@ font = ExtResource("3_suph6")
font_size = 25
font_color = Color(0.933333, 0.909804, 0.835294, 1)
-[node name="trackbutton" type="PanelContainer" node_paths=PackedStringArray("button")]
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_sad5x"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vcebg"]
+bg_color = Color(0.0431373, 0.270588, 0.32549, 1)
+corner_radius_top_left = 9
+corner_radius_top_right = 9
+corner_radius_bottom_right = 9
+corner_radius_bottom_left = 9
+corner_detail = 12
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_fayhu"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qw0k4"]
+bg_color = Color(0.14902, 0.545098, 0.823529, 1)
+corner_radius_top_left = 9
+corner_radius_top_right = 9
+corner_radius_bottom_right = 9
+corner_radius_bottom_left = 9
+corner_detail = 12
+
+[sub_resource type="Theme" id="Theme_vsupn"]
+Button/styles/focus = SubResource("StyleBoxEmpty_sad5x")
+Button/styles/hover = SubResource("StyleBoxFlat_vcebg")
+Button/styles/normal = SubResource("StyleBoxEmpty_fayhu")
+Button/styles/pressed = SubResource("StyleBoxFlat_qw0k4")
+
+[node name="track_button" type="PanelContainer" node_paths=PackedStringArray("button")]
custom_minimum_size = Vector2(450, 243)
offset_right = 200.0
offset_bottom = 100.0
theme = ExtResource("1_noykn")
theme_override_styles/panel = SubResource("StyleBoxFlat_fymg3")
-script = ExtResource("2_bcpuy")
+script = ExtResource("2_bbj4u")
button = NodePath("h2/play")
-[node name="port" type="SubViewport" parent="."]
-unique_name_in_owner = true
-own_world_3d = true
-world_3d = SubResource("World3D_vgauv")
-msaa_3d = 3
-screen_space_aa = 1
-size = Vector2i(450, 200)
-render_target_update_mode = 1
-
[node name="v" type="VBoxContainer" parent="."]
layout_mode = 2
@@ -74,23 +89,56 @@ layout_mode = 2
stretch_mode = 2
[node name="h2" type="HBoxContainer" parent="."]
+custom_minimum_size = Vector2(0, 40)
layout_mode = 2
size_flags_vertical = 8
+theme = SubResource("Theme_vsupn")
+theme_override_constants/separation = 0
[node name="play" type="Button" parent="h2"]
+custom_minimum_size = Vector2(40, 40)
layout_mode = 2
theme_override_font_sizes/font_size = 35
text = " "
+alignment = 2
+
+[node name="edit" type="Button" parent="h2"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(40, 40)
+layout_mode = 2
+theme_override_font_sizes/font_size = 35
+text = "󰛿 "
+alignment = 2
+
+[node name="include" type="Button" parent="h2"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(40, 40)
+layout_mode = 2
+theme_override_font_sizes/font_size = 35
+text = "󱘼"
[node name="spacer" type="Control" parent="h2"]
layout_mode = 2
size_flags_horizontal = 3
+[node name="delete" type="Button" parent="h2"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(40, 0)
+layout_mode = 2
+theme_override_font_sizes/font_size = 35
+text = "󰚃 "
+alignment = 2
+
[node name="watch" type="Button" parent="h2"]
unique_name_in_owner = true
+custom_minimum_size = Vector2(40, 0)
layout_mode = 2
theme_override_font_sizes/font_size = 35
text = "󰿎 "
+alignment = 2
-[connection signal="pressed" from="h2/play" to="." method="emit_signal" binds= [&"play"]]
-[connection signal="pressed" from="h2/watch" to="." method="emit_signal" binds= [&"watch"]]
+[connection signal="pressed" from="h2/play" to="." method="emit_signal" flags=18 binds= [&"play"]]
+[connection signal="pressed" from="h2/edit" to="." method="emit_signal" binds= [&"edit"]]
+[connection signal="pressed" from="h2/include" to="." method="emit_signal" binds= [&"include"]]
+[connection signal="pressed" from="h2/delete" to="." method="_on_delete_pressed"]
+[connection signal="pressed" from="h2/watch" to="." method="emit_signal" flags=18 binds= [&"watch"]]
diff --git a/ui/track_select.gd b/ui/track_select.gd
new file mode 100644
index 0000000..4a195a4
--- /dev/null
+++ b/ui/track_select.gd
@@ -0,0 +1,65 @@
+extends GridContainer
+class_name TrackSelect
+
+@export var editor: PackedScene = preload("res://ui/editor/track_editor.tscn")
+@export var race: PackedScene = preload("res://scenes/race_high.tscn")
+@export var ghost_watch: PackedScene = preload("res://scenes/ghost_watcher.tscn")
+@export var trackbutton: PackedScene = preload("res://ui/track_button.tscn")
+@export var editable := false
+@onready var dev = DirAccess.dir_exists_absolute("res://.git")
+
+func _ready() -> void:
+ if get_child_count() > 0:
+ (get_child(0) as TrackButton).button.grab_focus()
+
+## @virtual
+func _on_mkbutton(_button: TrackButton, _track: TrackResource) -> void:
+ pass
+
+func mkbutton(track: TrackResource) -> void:
+ var button := trackbutton.instantiate() as TrackButton
+ button.editable = editable
+ button.dev = dev
+ button.name = track.name
+ add_child(button)
+ button.init(track, lodg(track.name))
+
+ # this works perfectly because its all reference based, but the ghosts will change, so load them every time
+ button.watch.connect(func(): watch(track, lodg(track.name)))
+ button.delete.connect(delete.bind(track))
+ button.play.connect(func(): play(track, lodg(track.name)))
+ button.edit.connect(edit.bind(track))
+ _on_mkbutton(button, track)
+
+func mkbuttons(tracks: Array[TrackResource]) -> void:
+ for track in tracks:
+ mkbutton(track)
+
+func lodg(n: String) -> GhostData:
+ return GhostData._load(Globals.SAVES % n)
+
+func edit(track: TrackResource) -> void:
+ Globals.editing = track
+ add_to_main(editor)
+
+func play(track: TrackResource, ghost: GhostData) -> void:
+ Globals.playing = track
+ Globals.ghost = ghost
+ add_to_main(race)
+
+func watch(track: TrackResource, ghost: GhostData) -> void:
+ Globals.playing = track
+ Globals.ghost = ghost
+ add_to_main(ghost_watch)
+
+func add_to_main(p: PackedScene) -> void:
+ owner.hide()
+ var c := p.instantiate()
+ get_viewport().add_child(c)
+ c.tree_exited.connect(owner.show)
+
+static func delete(track: TrackResource):
+# OS.move_to_trash(Globals.TRACKS % track.name)
+ DirAccess.remove_absolute(Globals.TRACKS % track.name)
+ if FileAccess.file_exists(Globals.THUMBS % track.name):
+ DirAccess.remove_absolute(Globals.THUMBS % track.name)
diff --git a/ui/trackbutton.gd b/ui/trackbutton.gd
deleted file mode 100644
index 2c55c39..0000000
--- a/ui/trackbutton.gd
+++ /dev/null
@@ -1,41 +0,0 @@
-extends Control
-class_name TrackButton
-
-const trackloader_scn = preload("res://scenes/track.tscn")
-const thumbnail_path = "user://%s.thumb"
-
-@export var button: Button
-signal play
-signal watch
-
-func init(t: TrackResource, g: GhostData) -> void:
- %name.text = t.name
- if g == null:
- %watch.hide()
- %time.text = "no time set"
- else:
- %time.text = GameTimer.format_precise(g.time)
- var p: String = thumbnail_path % t.name
- if FileAccess.file_exists(p) and Time.get_unix_time_from_system() - FileAccess.get_modified_time(p) < 400000: # ~5days
- print("loading thumb")
- var f := FileAccess.open(p, FileAccess.READ)
- var img := Image.new()
- var e := img.load_png_from_buffer(f.get_buffer(f.get_length()))
- if e != OK:
- print("error: ", e)
- return
- (%thumb as TextureRect).texture = ImageTexture.create_from_image(img)
- else:
- print("making thumb")
- %port.add_child(IntroCam.new(t, null))
- var trackloader: TrackLoader = trackloader_scn.instantiate()
- trackloader.track = t
- %port.add_child(trackloader)
- await RenderingServer.frame_post_draw
- trackloader.queue_free()
- var img: Image = %port.get_texture().get_image()
- img.save_png(p)
- (%thumb as TextureRect).texture = ImageTexture.create_from_image(img)
-
-
-
diff --git a/ui/tracks.gd b/ui/tracks.gd
index 0686727..e1e139c 100644
--- a/ui/tracks.gd
+++ b/ui/tracks.gd
@@ -1,34 +1,28 @@
-extends GridContainer
-
-@export var tracks: Array[TrackResource]
-@export var race: PackedScene
-@export var ghost_watch: PackedScene
-@export var trackbutton: PackedScene
+extends TrackSelect
+class_name BuiltinTrackSelect
func _ready() -> void:
+ _load()
+ mkbuttons(Globals.builtin_tracks)
+ super()
+
+func _load():
+ var tracks: Array = str_to_var(FileAccess.get_file_as_string("res://tracks.cfg"))
for track in tracks:
- var button: TrackButton = trackbutton.instantiate()
- add_child(button)
- var ghost := GhostData._load(Globals.SAVES % track.name)
- button.init(track, ghost)
- button.play.connect(play.bind(track, ghost))
- button.watch.connect(watch.bind(track, ghost))
- (get_child(0) as TrackButton).button.grab_focus()
+ var loaded := TrackResource.from_d(track)
+ loaded.builtin = true
+ Globals.builtin_tracks.append(loaded)
-func play(track: TrackResource, ghost: GhostData) -> void:
- print("play %s" % track.name)
- Globals.playing = track
- Globals.ghost = ghost
- add_to_main(race)
+func add(t: TrackResource):
+ mkbutton(t)
+ Globals.builtin_tracks.append(t)
+ BuiltinTrackSelect.store_all()
-func watch(track: TrackResource, ghost: GhostData) -> void:
- print("watch %s" % track.name)
- Globals.playing = track
- Globals.ghost = ghost
- add_to_main(ghost_watch)
+static func delete(t: TrackResource):
+ Globals.builtin_tracks.erase(t)
+ BuiltinTrackSelect.store_all()
-func add_to_main(p: PackedScene) -> void:
- owner.hide()
- var c := p.instantiate()
- get_viewport().add_child(c)
- c.tree_exited.connect(owner.show)
+static func store_all():
+ var arr: Array = Globals.builtin_tracks.map(func(t: TrackResource) -> Dictionary: return t.to_d())
+ var file := FileAccess.open("res://tracks.cfg", FileAccess.WRITE)
+ file.store_string(var_to_str(arr))