a game about throwing hammers made for the github game off
bendn 2022-11-07
parent 1b75fd7 · commit 6aa8c82
-rw-r--r--.github/workflows/export.yml30
-rw-r--r--.gitignore2
-rw-r--r--Main.gd7
-rw-r--r--Main.tscn47
-rw-r--r--assets/fx/boom.pngbin0 -> 304 bytes
-rw-r--r--assets/fx/boom.png.import34
-rw-r--r--assets/fx/double_jump.pngbin0 -> 191 bytes
-rw-r--r--assets/fx/double_jump.png.import34
-rw-r--r--assets/fx/dust.pngbin0 -> 118 bytes
-rw-r--r--assets/fx/dust.png.import34
-rw-r--r--assets/fx/glow.pngbin0 -> 1918 bytes
-rw-r--r--assets/fx/glow.png.import34
-rw-r--r--assets/fx/jump.pngbin0 -> 156 bytes
-rw-r--r--assets/fx/jump.png.import34
-rw-r--r--assets/fx/particle.pngbin0 -> 91 bytes
-rw-r--r--assets/fx/particle.png.import34
-rw-r--r--assets/fx/wall_dust.pngbin0 -> 193 bytes
-rw-r--r--assets/fx/wall_dust.png.import34
-rw-r--r--assets/player/animations.pngbin0 -> 3469 bytes
-rw-r--r--assets/player/animations.png.import34
-rw-r--r--assets/world/brick.pngbin0 -> 181 bytes
-rw-r--r--assets/world/brick.png.import34
-rw-r--r--assets/world/computer.pngbin0 -> 260 bytes
-rw-r--r--assets/world/computer.png.import34
-rw-r--r--assets/world/door.pngbin0 -> 103 bytes
-rw-r--r--assets/world/door.png.import34
-rw-r--r--assets/world/door_wall.pngbin0 -> 161 bytes
-rw-r--r--assets/world/door_wall.png.import34
-rw-r--r--assets/world/ladder.pngbin0 -> 117 bytes
-rw-r--r--assets/world/ladder.png.import34
-rw-r--r--assets/world/moving_platform.pngbin0 -> 157 bytes
-rw-r--r--assets/world/moving_platform.png.import34
-rw-r--r--assets/world/one_way_platform.pngbin0 -> 154 bytes
-rw-r--r--assets/world/one_way_platform.png.import34
-rw-r--r--assets/world/save.pngbin0 -> 147 bytes
-rw-r--r--assets/world/save.png.import34
-rw-r--r--assets/world/slope.pngbin0 -> 292 bytes
-rw-r--r--assets/world/slope.png.import34
-rw-r--r--assets/world/tiles.pngbin0 -> 922 bytes
-rw-r--r--assets/world/tiles.png.import34
-rw-r--r--autoloads/Events.gd3
-rw-r--r--autoloads/Utils.gd19
-rw-r--r--classes/Maze.gd111
-rw-r--r--fx/double_jump.tscn68
-rw-r--r--fx/dust.gd7
-rw-r--r--fx/dust.tscn70
-rw-r--r--fx/fx.tscn8
-rw-r--r--fx/jump.tscn69
-rw-r--r--fx/wall_dust.tscn68
-rw-r--r--levels/BaseTemplate.gd79
-rw-r--r--levels/BaseTemplate.tscn21
-rw-r--r--levels/LevelManager.gd71
-rw-r--r--levels/Start.gd21
-rw-r--r--levels/Start.tscn8
-rw-r--r--levels/rand/01.tscn6
-rw-r--r--levels/rand/02.tscn6
-rw-r--r--levels/rand/03.tscn6
-rw-r--r--levels/rand/04.tscn7
-rw-r--r--levels/rand/05.tscn7
-rw-r--r--levels/rand/06.tscn7
-rw-r--r--levels/rand/07.tscn7
-rw-r--r--levels/rand/08.tscn7
-rw-r--r--levels/rand/09.tscn7
-rw-r--r--levels/rand/10.tscn7
-rw-r--r--levels/rand/11.tscn7
-rw-r--r--levels/rand/12.tscn7
-rw-r--r--levels/rand/13.tscn7
-rw-r--r--levels/rand/14.tscn7
-rw-r--r--levels/rand/15.tscn7
-rw-r--r--levels/rand/16.tscn7
-rw-r--r--levels/rand/17.tscn7
-rw-r--r--levels/rand/18.tscn7
-rw-r--r--plan.md9
-rw-r--r--player/player.gd205
-rw-r--r--player/player.tscn125
-rw-r--r--project.godot132
-rw-r--r--world/camera.gd1
-rw-r--r--world/camera.tscn6
-rw-r--r--world/door/block_door.gd22
-rw-r--r--world/door/block_door.tscn30
-rw-r--r--world/door/block_door_path.tres7
-rw-r--r--world/door/door.gd8
-rw-r--r--world/door/door.tscn21
-rw-r--r--world/door/door_shape.tres4
-rw-r--r--world/one_way_platform.gd8
-rw-r--r--world/one_way_platform.tscn20
-rw-r--r--world/tiles.tres530
87 files changed, 2520 insertions, 52 deletions
diff --git a/.github/workflows/export.yml b/.github/workflows/export.yml
deleted file mode 100644
index c07af32..0000000
--- a/.github/workflows/export.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-name: "export" # name of the workflow
-on: # when it is triggered
- workflow_dispatch: # manually or
- push: # on a push
- branches:
- - main # to this branch
- paths: # with modifications to these files
- - "**.gd" # all gdscript files
- - "**.tscn" # scene files
- - "**.import" # this means a png changed
- - "**.tres" # godot resources
- - "**.ttf" # fonts in godot3 dont have their own .import
- - ".github/workflows/export.yml" # this workflow
- - "export_presets.cfg" # the export template
-
-jobs: # the things to do
- export: # a thing to do
- uses: bend-n/godot-actions/.github/workflows/callable-export.yml@main
- with: # variables
- godot-version: 3.5 # the godot version
- image: ghcr.io/bend-n/godot-2d:3.5 # the container to use
- export-name: ${{ github.event.repository.name }} # the name of the exec. ($export-name.exe)
- platforms: "windows linux web android mac" # space seperated list of platforms to build
- project-root-path: "." # the directory that project.godot is in
- github-pages: "true" # to deploy to github pages or not (anything besides 'true' == false)
- itch-path: "${{ github.repository_owner }}/${{ github.event.repository.name }}" # required for itch.io deployment.
- secrets: # secrets
- butler-api-key: ${{ secrets.BUTLER_CREDENTIALS }} # required for itch.io deployment
- android-keystore-base64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} # for signing the apk, not required
- android-keystore-password: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} # ditto
diff --git a/.gitignore b/.gitignore
index d18ee6c..d7000d1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,5 @@ logs/
exports/
*.x86_64
addons/
+.godot/
+maze.png*
diff --git a/Main.gd b/Main.gd
new file mode 100644
index 0000000..0469154
--- /dev/null
+++ b/Main.gd
@@ -0,0 +1,7 @@
+extends Node2D
+
+var maze: Maze
+
+
+func _on_level_manager_world_generated(p_maze: Maze) -> void:
+ maze = p_maze
diff --git a/Main.tscn b/Main.tscn
index 70a653e..f9ecbcd 100644
--- a/Main.tscn
+++ b/Main.tscn
@@ -1,3 +1,48 @@
-[gd_scene format=2]
+[gd_scene load_steps=23 format=3 uid="uid://b4g41v2qctg7f"]
+
+[ext_resource type="Script" path="res://Main.gd" id="1_l4fqe"]
+[ext_resource type="PackedScene" uid="uid://c1fgxkkh72npw" path="res://player/player.tscn" id="1_ug1uc"]
+[ext_resource type="PackedScene" uid="uid://c8hhhk21dtpe0" path="res://levels/Start.tscn" id="2_vg2cv"]
+[ext_resource type="Script" path="res://levels/LevelManager.gd" id="3_yuvn4"]
+[ext_resource type="PackedScene" uid="uid://txq8h42d4oqi" path="res://levels/rand/01.tscn" id="4_e4ceh"]
+[ext_resource type="PackedScene" uid="uid://gev80rx2b8vn" path="res://levels/rand/02.tscn" id="5_vqiwr"]
+[ext_resource type="PackedScene" uid="uid://esupr5vkktt" path="res://levels/rand/03.tscn" id="6_v5xvb"]
+[ext_resource type="PackedScene" uid="uid://wgp3b5vk3qbs" path="res://levels/rand/04.tscn" id="7_rihcm"]
+[ext_resource type="PackedScene" uid="uid://lb0i4wxlcdo3" path="res://levels/rand/05.tscn" id="8_5a36k"]
+[ext_resource type="PackedScene" uid="uid://cmex8m63vfpoj" path="res://levels/rand/06.tscn" id="9_3vmkv"]
+[ext_resource type="PackedScene" uid="uid://bh0o48w2ir4l2" path="res://levels/rand/07.tscn" id="10_7n0bw"]
+[ext_resource type="PackedScene" uid="uid://x3fddi5udbur" path="res://levels/rand/08.tscn" id="11_skonw"]
+[ext_resource type="PackedScene" uid="uid://b7w7ns27n53rh" path="res://levels/rand/09.tscn" id="12_5n213"]
+[ext_resource type="PackedScene" uid="uid://gyxkjwsih0s2" path="res://levels/rand/10.tscn" id="13_ni5ug"]
+[ext_resource type="PackedScene" uid="uid://bkywu3kc1xfep" path="res://levels/rand/11.tscn" id="14_uubx2"]
+[ext_resource type="PackedScene" uid="uid://dnn448k214c42" path="res://levels/rand/12.tscn" id="15_x5iyq"]
+[ext_resource type="PackedScene" uid="uid://dkci2hmtjgrvj" path="res://levels/rand/13.tscn" id="16_xq64q"]
+[ext_resource type="PackedScene" uid="uid://bxokgsjhvo0ad" path="res://levels/rand/14.tscn" id="17_c4kk1"]
+[ext_resource type="PackedScene" uid="uid://cnwifdbe2eqv8" path="res://levels/rand/15.tscn" id="18_mpe1f"]
+[ext_resource type="PackedScene" uid="uid://d4dwvcp6764bx" path="res://levels/rand/16.tscn" id="19_ko67h"]
+[ext_resource type="PackedScene" uid="uid://duo0cbnh5u3qt" path="res://levels/rand/17.tscn" id="20_f85eu"]
+[ext_resource type="PackedScene" uid="uid://cy3kc27btbipt" path="res://levels/rand/18.tscn" id="21_rvdjm"]
[node name="Main" type="Node2D"]
+texture_filter = 1
+script = ExtResource("1_l4fqe")
+
+[node name="player" parent="." instance=ExtResource("1_ug1uc")]
+position = Vector2(128, 96)
+
+[node name="Start" parent="." instance=ExtResource("2_vg2cv")]
+layer_0/tile_data = PackedInt32Array(131072, 0, 1, 196608, 0, 1, 262144, 262144, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 262144, 2, 786432, 0, 1, 851968, 0, 1, 917504, 0, 1, 983040, 0, 2, 983041, 65536, 2, 2, 65536, 0, 983042, 327680, 3, 3, 65536, 0, 983043, 65536, 3, 4, 65536, 0, 983044, 65536, 3, 5, 327680, 0, 983045, 65536, 3, 6, 131072, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 131072, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 0, 0, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 0, 3, 10, 327680, 0, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 393216, 0, 983052, 65536, 3, 13, 65536, 0, 983053, 65536, 3, 14, 65536, 0, 983054, 65536, 3, 15, 131072, 0, 65551, 458752, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 0, 1, 0, 0, 0, 1, 65536, 0, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 917516, 196609, 0, 917517, 262145, 0, 851982, 196609, 0, 917518, 327681, 0, 917505, 65536, 1, 917506, 131072, 1, 851970, 131072, 0, 851969, 327680, 2, 786433, 131072, 1, 720897, 131072, 0, 786439, 0, 0, 786440, 327680, 0, 851976, 131072, 2, 851975, 0, 2, 786441, 131072, 3, 393220, 196608, 2, 327684, 196608, 1, 262148, 458752, 1, 393228, 196608, 0, 458764, 196608, 1, 524300, 196608, 1, 589836, 196608, 2, 262147, 65536, 2, 262146, 65536, 2, 262145, 65536, 2, 196609, 65536, 1, 131073, 65536, 1, 65537, 65536, 1, 65538, 65536, 1, 131074, 65536, 1, 196610, 65536, 1, 65539, 65536, 1, 131075, 65536, 1, 196611, 65536, 1, 196612, 131072, 1, 131076, 327680, 1, 131077, 131072, 2, 65540, 65536, 1, 65548, 0, 1, 65549, 327680, 1, 131085, 458752, 1, 131084, 0, 2, 196621, 196608, 2, 65550, 65536, 2, 65546, 131072, 1, 131082, 131072, 2, 65545, 0, 1, 131081, 262144, 1, 196617, 196608, 2, 65541, 131072, 1)
+
+[node name="LevelManager" type="Node" parent="." node_paths=PackedStringArray("current_level", "player")]
+unique_name_in_owner = true
+script = ExtResource("3_yuvn4")
+levels = [ExtResource("4_e4ceh"), ExtResource("5_vqiwr"), ExtResource("6_v5xvb"), ExtResource("7_rihcm"), ExtResource("8_5a36k"), ExtResource("9_3vmkv"), ExtResource("10_7n0bw"), ExtResource("11_skonw"), ExtResource("12_5n213"), ExtResource("13_ni5ug"), ExtResource("14_uubx2"), ExtResource("15_x5iyq"), ExtResource("16_xq64q"), ExtResource("17_c4kk1"), ExtResource("18_mpe1f"), ExtResource("19_ko67h"), ExtResource("20_f85eu"), ExtResource("21_rvdjm")]
+current_level = NodePath("../Start")
+player = NodePath("../player")
+
+[node name="Camera" type="Camera2D" parent="."]
+offset = Vector2(128, 128)
+current = true
+zoom = Vector2(1.25, 1.25)
+
+[connection signal="world_generated" from="LevelManager" to="." method="_on_level_manager_world_generated"]
diff --git a/assets/fx/boom.png b/assets/fx/boom.png
new file mode 100644
index 0000000..8036576
--- /dev/null
+++ b/assets/fx/boom.png
Binary files differ
diff --git a/assets/fx/boom.png.import b/assets/fx/boom.png.import
new file mode 100644
index 0000000..832808e
--- /dev/null
+++ b/assets/fx/boom.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dq6y1g5im510r"
+path="res://.godot/imported/boom.png-d5d6e37dae13f6bc5fd50590655695e2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/fx/boom.png"
+dest_files=["res://.godot/imported/boom.png-d5d6e37dae13f6bc5fd50590655695e2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/fx/double_jump.png b/assets/fx/double_jump.png
new file mode 100644
index 0000000..d0a2e39
--- /dev/null
+++ b/assets/fx/double_jump.png
Binary files differ
diff --git a/assets/fx/double_jump.png.import b/assets/fx/double_jump.png.import
new file mode 100644
index 0000000..cfe5452
--- /dev/null
+++ b/assets/fx/double_jump.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://byl1w287mywe"
+path="res://.godot/imported/double_jump.png-e0b90ffef70080db2857799ef778c72f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/fx/double_jump.png"
+dest_files=["res://.godot/imported/double_jump.png-e0b90ffef70080db2857799ef778c72f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/fx/dust.png b/assets/fx/dust.png
new file mode 100644
index 0000000..80af075
--- /dev/null
+++ b/assets/fx/dust.png
Binary files differ
diff --git a/assets/fx/dust.png.import b/assets/fx/dust.png.import
new file mode 100644
index 0000000..2e91aa4
--- /dev/null
+++ b/assets/fx/dust.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cuhf1q2aeyoau"
+path="res://.godot/imported/dust.png-d9e394ecfe07993d4ca5469c8c0f1216.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/fx/dust.png"
+dest_files=["res://.godot/imported/dust.png-d9e394ecfe07993d4ca5469c8c0f1216.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/fx/glow.png b/assets/fx/glow.png
new file mode 100644
index 0000000..39c9096
--- /dev/null
+++ b/assets/fx/glow.png
Binary files differ
diff --git a/assets/fx/glow.png.import b/assets/fx/glow.png.import
new file mode 100644
index 0000000..5e85263
--- /dev/null
+++ b/assets/fx/glow.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://co4vsks50x12o"
+path="res://.godot/imported/glow.png-cbd09004ec76a979572dca6d1ed54e96.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/fx/glow.png"
+dest_files=["res://.godot/imported/glow.png-cbd09004ec76a979572dca6d1ed54e96.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/fx/jump.png b/assets/fx/jump.png
new file mode 100644
index 0000000..f4eb811
--- /dev/null
+++ b/assets/fx/jump.png
Binary files differ
diff --git a/assets/fx/jump.png.import b/assets/fx/jump.png.import
new file mode 100644
index 0000000..4f4a71f
--- /dev/null
+++ b/assets/fx/jump.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c7cnh7u3nstnh"
+path="res://.godot/imported/jump.png-970682fea27aa33d1e9642383ca24125.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/fx/jump.png"
+dest_files=["res://.godot/imported/jump.png-970682fea27aa33d1e9642383ca24125.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/fx/particle.png b/assets/fx/particle.png
new file mode 100644
index 0000000..7389c0b
--- /dev/null
+++ b/assets/fx/particle.png
Binary files differ
diff --git a/assets/fx/particle.png.import b/assets/fx/particle.png.import
new file mode 100644
index 0000000..e6e5d20
--- /dev/null
+++ b/assets/fx/particle.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dpudx484ylr0b"
+path="res://.godot/imported/particle.png-d63c5cd27c93cd866464ac699a21f513.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/fx/particle.png"
+dest_files=["res://.godot/imported/particle.png-d63c5cd27c93cd866464ac699a21f513.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/fx/wall_dust.png b/assets/fx/wall_dust.png
new file mode 100644
index 0000000..68155d9
--- /dev/null
+++ b/assets/fx/wall_dust.png
Binary files differ
diff --git a/assets/fx/wall_dust.png.import b/assets/fx/wall_dust.png.import
new file mode 100644
index 0000000..b149842
--- /dev/null
+++ b/assets/fx/wall_dust.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cky7hbmx1auqh"
+path="res://.godot/imported/wall_dust.png-18e3f36ace4a3e2e1d5ba6b37b866951.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/fx/wall_dust.png"
+dest_files=["res://.godot/imported/wall_dust.png-18e3f36ace4a3e2e1d5ba6b37b866951.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/player/animations.png b/assets/player/animations.png
new file mode 100644
index 0000000..67db143
--- /dev/null
+++ b/assets/player/animations.png
Binary files differ
diff --git a/assets/player/animations.png.import b/assets/player/animations.png.import
new file mode 100644
index 0000000..a284862
--- /dev/null
+++ b/assets/player/animations.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b36hv0jwfmb1u"
+path="res://.godot/imported/animations.png-b89a395399ded18171b361fdbeedba3d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/player/animations.png"
+dest_files=["res://.godot/imported/animations.png-b89a395399ded18171b361fdbeedba3d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/world/brick.png b/assets/world/brick.png
new file mode 100644
index 0000000..544dd1f
--- /dev/null
+++ b/assets/world/brick.png
Binary files differ
diff --git a/assets/world/brick.png.import b/assets/world/brick.png.import
new file mode 100644
index 0000000..963fad4
--- /dev/null
+++ b/assets/world/brick.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cpg4ehst7ctf5"
+path="res://.godot/imported/brick.png-3ac7fb1e792bc87a523b2637ad809cf3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/world/brick.png"
+dest_files=["res://.godot/imported/brick.png-3ac7fb1e792bc87a523b2637ad809cf3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/world/computer.png b/assets/world/computer.png
new file mode 100644
index 0000000..95b31e7
--- /dev/null
+++ b/assets/world/computer.png
Binary files differ
diff --git a/assets/world/computer.png.import b/assets/world/computer.png.import
new file mode 100644
index 0000000..23edeae
--- /dev/null
+++ b/assets/world/computer.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://rdqqqq6dce0t"
+path="res://.godot/imported/computer.png-23acc443667b6152ee25598eeac373fc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/world/computer.png"
+dest_files=["res://.godot/imported/computer.png-23acc443667b6152ee25598eeac373fc.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/world/door.png b/assets/world/door.png
new file mode 100644
index 0000000..bc16098
--- /dev/null
+++ b/assets/world/door.png
Binary files differ
diff --git a/assets/world/door.png.import b/assets/world/door.png.import
new file mode 100644
index 0000000..50723c6
--- /dev/null
+++ b/assets/world/door.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ca243eorhvtp2"
+path="res://.godot/imported/door.png-a2df4577680945bd177bbd8cef62f846.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/world/door.png"
+dest_files=["res://.godot/imported/door.png-a2df4577680945bd177bbd8cef62f846.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/world/door_wall.png b/assets/world/door_wall.png
new file mode 100644
index 0000000..6c8a385
--- /dev/null
+++ b/assets/world/door_wall.png
Binary files differ
diff --git a/assets/world/door_wall.png.import b/assets/world/door_wall.png.import
new file mode 100644
index 0000000..b9fb862
--- /dev/null
+++ b/assets/world/door_wall.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dtec6qxbrg3ym"
+path="res://.godot/imported/door_wall.png-6c092803a253a9b82d0df6d6bd467fdc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/world/door_wall.png"
+dest_files=["res://.godot/imported/door_wall.png-6c092803a253a9b82d0df6d6bd467fdc.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/world/ladder.png b/assets/world/ladder.png
new file mode 100644
index 0000000..febee73
--- /dev/null
+++ b/assets/world/ladder.png
Binary files differ
diff --git a/assets/world/ladder.png.import b/assets/world/ladder.png.import
new file mode 100644
index 0000000..7e4d1b1
--- /dev/null
+++ b/assets/world/ladder.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://beg8cclmeknvm"
+path="res://.godot/imported/ladder.png-319444723779bba8ef63c700fef8313f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/world/ladder.png"
+dest_files=["res://.godot/imported/ladder.png-319444723779bba8ef63c700fef8313f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/world/moving_platform.png b/assets/world/moving_platform.png
new file mode 100644
index 0000000..a1f493c
--- /dev/null
+++ b/assets/world/moving_platform.png
Binary files differ
diff --git a/assets/world/moving_platform.png.import b/assets/world/moving_platform.png.import
new file mode 100644
index 0000000..1faa31c
--- /dev/null
+++ b/assets/world/moving_platform.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cdg0t1suvcfmt"
+path="res://.godot/imported/moving_platform.png-59913c01ac72567a5daf9a179d272e14.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/world/moving_platform.png"
+dest_files=["res://.godot/imported/moving_platform.png-59913c01ac72567a5daf9a179d272e14.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/world/one_way_platform.png b/assets/world/one_way_platform.png
new file mode 100644
index 0000000..4809ecb
--- /dev/null
+++ b/assets/world/one_way_platform.png
Binary files differ
diff --git a/assets/world/one_way_platform.png.import b/assets/world/one_way_platform.png.import
new file mode 100644
index 0000000..df05d0c
--- /dev/null
+++ b/assets/world/one_way_platform.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b0iehyccoav1r"
+path="res://.godot/imported/one_way_platform.png-b81b1bf0424b2e722c681bc7cf9045a6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/world/one_way_platform.png"
+dest_files=["res://.godot/imported/one_way_platform.png-b81b1bf0424b2e722c681bc7cf9045a6.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/world/save.png b/assets/world/save.png
new file mode 100644
index 0000000..3bc7275
--- /dev/null
+++ b/assets/world/save.png
Binary files differ
diff --git a/assets/world/save.png.import b/assets/world/save.png.import
new file mode 100644
index 0000000..afe3cbb
--- /dev/null
+++ b/assets/world/save.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cipwi1dppfmi3"
+path="res://.godot/imported/save.png-901d5a1782619906c9452c3e3fd93d77.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/world/save.png"
+dest_files=["res://.godot/imported/save.png-901d5a1782619906c9452c3e3fd93d77.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/world/slope.png b/assets/world/slope.png
new file mode 100644
index 0000000..b09603a
--- /dev/null
+++ b/assets/world/slope.png
Binary files differ
diff --git a/assets/world/slope.png.import b/assets/world/slope.png.import
new file mode 100644
index 0000000..871ed69
--- /dev/null
+++ b/assets/world/slope.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b0urvindbx57t"
+path="res://.godot/imported/slope.png-29b8994b19d893b89f41c3a9e9f169d4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/world/slope.png"
+dest_files=["res://.godot/imported/slope.png-29b8994b19d893b89f41c3a9e9f169d4.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/world/tiles.png b/assets/world/tiles.png
new file mode 100644
index 0000000..6e65a78
--- /dev/null
+++ b/assets/world/tiles.png
Binary files differ
diff --git a/assets/world/tiles.png.import b/assets/world/tiles.png.import
new file mode 100644
index 0000000..7382d2e
--- /dev/null
+++ b/assets/world/tiles.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bs3dt308ypttr"
+path="res://.godot/imported/tiles.png-f8cc7b96b0fed1a4a6ae62e78a717e22.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/world/tiles.png"
+dest_files=["res://.godot/imported/tiles.png-f8cc7b96b0fed1a4a6ae62e78a717e22.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/autoloads/Events.gd b/autoloads/Events.gd
new file mode 100644
index 0000000..ac5910f
--- /dev/null
+++ b/autoloads/Events.gd
@@ -0,0 +1,3 @@
+extends Node
+
+signal change_level(to: Vector2i) \ No newline at end of file
diff --git a/autoloads/Utils.gd b/autoloads/Utils.gd
new file mode 100644
index 0000000..b794b72
--- /dev/null
+++ b/autoloads/Utils.gd
@@ -0,0 +1,19 @@
+extends Node
+class_name Util
+
+
+func instance_scene_on_main(scene: PackedScene, position: Vector2) -> Node:
+ var main = get_tree().current_scene
+ var instance = scene.instantiate()
+ main.add_child(instance)
+ instance.global_position = position
+ return instance
+
+
+static func str_vec(vec: Vector2) -> String:
+ var map := {Vector2.UP: "up", Vector2.DOWN: "down", Vector2.LEFT: "left", Vector2.RIGHT: "right"}
+ return map.get(vec, str(vec))
+
+
+static func sub(a: Array, b: Array) -> Array:
+ return a.filter(func(item) -> bool: return not item in b)
diff --git a/classes/Maze.gd b/classes/Maze.gd
new file mode 100644
index 0000000..ad295c8
--- /dev/null
+++ b/classes/Maze.gd
@@ -0,0 +1,111 @@
+extends Resource
+class_name Maze
+
+const N := 1
+const E := 2
+const S := 4
+const W := 8
+
+# dict mapping direction to vectors.
+const _cell_walls := {Vector2i(0, -1): N, Vector2i(1, 0): E, Vector2i(0, 1): S, Vector2i(-1, 0): W}
+
+var _size: Vector2i = Vector2i(6, 6)
+
+var maze := []
+
+
+func _init(p_size: Vector2i) -> void:
+ _size = p_size
+ randomize()
+ _make_maze()
+
+
+func _check_neighbours(cell: Vector2i, unvisited: Array[Vector2i]) -> Array[Vector2i]:
+ # checks if neighbour is visited.
+ # returns array of unvisited neighbours.
+ var list: Array[Vector2i] = []
+ for n in _cell_walls.keys():
+ if cell + n in unvisited:
+ list.append(cell + n)
+ return list
+
+
+func get_cellv(cell: Vector2i) -> int:
+ return maze[cell.y][cell.x]
+
+
+func set_cellv(cell: Vector2i, v: int) -> void:
+ maze[cell.y][cell.x] = v
+
+
+func _make_maze() -> void:
+ var unvisited: Array[Vector2i] = []
+ var stack: Array[Vector2i] = []
+
+ # fill maze
+ maze.clear()
+ for x in range(_size.x):
+ var row: PackedInt32Array = []
+ for y in range(_size.y):
+ row.append(N | E | S | W) #N|E|S|W = 15
+ unvisited.append(Vector2i(x,y))
+ maze.append(row)
+
+ var current := Vector2i(0, 0)
+ unvisited.erase(current)
+
+ #recurive backtracking algorithm
+ while unvisited.size() > 0:
+ # check neighbours of current cell.
+ var neighbours := _check_neighbours(current, unvisited)
+
+ # if neighbours exist, pick one at random and move in that direction.
+ # remove wall between current cell and neighbour cell.
+ if neighbours.size() > 0:
+ var next := neighbours[randi() % neighbours.size()]
+ stack.append(current)
+
+ # remove wall from both cells.
+ var dir := next - current
+ var current_walls: int = get_cellv(current) - _cell_walls[dir]
+ var next_walls: int = get_cellv(next) - _cell_walls[-dir]
+ set_cellv(current, current_walls)
+ set_cellv(next, next_walls)
+ current = next
+ unvisited.erase(current)
+ elif stack:
+ # if neighbours don't exist, retrieve new current from stack.
+ current = stack.pop_back()
+
+
+static func tile_4b_to_wall_array(tile_4b: int) -> Array[Vector2i]:
+ var array: Array[Vector2i] = []
+ if tile_4b & N:
+ array.append(Vector2i.UP)
+ if tile_4b & E:
+ array.append(Vector2i.RIGHT)
+ if tile_4b & S:
+ array.append(Vector2i.DOWN)
+ if tile_4b & W:
+ array.append(Vector2i.LEFT)
+ return array
+
+func image() -> Image:
+ var img := Image.create(_size.x*3, _size.y*3, false, Image.FORMAT_L8)
+
+ const ALL_DOORS := [Vector2i.UP, Vector2i.DOWN, Vector2i.LEFT, Vector2i.RIGHT]
+ var position := Vector2i.ZERO
+ for i in len(maze):
+ for j in len(maze[i]):
+ var walls := Maze.tile_4b_to_wall_array(maze[i][j])
+ if len(walls) != 4:
+ var paths := Util.sub(ALL_DOORS, walls)
+ var middle := position + Vector2i.ONE
+ # if len(paths) > 2:
+ img.set_pixelv(middle, Color.WHITE)
+ for path in paths:
+ img.set_pixelv(middle + path, Color.WHITE)
+ position.x += 3
+ position.y += 3
+ position.x = 0
+ return img \ No newline at end of file
diff --git a/fx/double_jump.tscn b/fx/double_jump.tscn
new file mode 100644
index 0000000..45841ac
--- /dev/null
+++ b/fx/double_jump.tscn
@@ -0,0 +1,68 @@
+[gd_scene load_steps=6 format=3 uid="uid://clsdwiyvr2dmc"]
+
+[ext_resource type="PackedScene" uid="uid://6o1bfy3xhjbm" path="res://fx/fx.tscn" id="1"]
+[ext_resource type="Texture2D" uid="uid://byl1w287mywe" path="res://assets/fx/double_jump.png" id="2"]
+
+[sub_resource type="Animation" id="1"]
+resource_name = "Animate"
+length = 0.5
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4),
+"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
+"update": 1,
+"values": [0, 1, 2, 3, 4]
+}
+tracks/1/type = "method"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath(".")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0.5),
+"transitions": PackedFloat32Array(1),
+"values": [{
+"args": [],
+"method": &"queue_free"
+}]
+}
+
+[sub_resource type="Animation" id="2"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [1]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_8xbme"]
+_data = {
+"Animate": SubResource("1"),
+"RESET": SubResource("2")
+}
+
+[node name="DoubleJumpEffect" instance=ExtResource("1")]
+
+[node name="Sprite" parent="." index="0"]
+texture = ExtResource("2")
+hframes = 5
+frame = 1
+
+[node name="AnimationPlayer" parent="." index="1"]
+autoplay = "Animate"
+libraries = {
+"": SubResource("AnimationLibrary_8xbme")
+}
diff --git a/fx/dust.gd b/fx/dust.gd
new file mode 100644
index 0000000..6bc9386
--- /dev/null
+++ b/fx/dust.gd
@@ -0,0 +1,7 @@
+extends Node2D
+
+var motion := Vector2(randf_range(-20, 20), randf_range(-10, 10))
+
+
+func _process(delta: float) -> void:
+ position += motion * delta
diff --git a/fx/dust.tscn b/fx/dust.tscn
new file mode 100644
index 0000000..8d98c20
--- /dev/null
+++ b/fx/dust.tscn
@@ -0,0 +1,70 @@
+[gd_scene load_steps=7 format=3 uid="uid://dn3jh3u6xksvj"]
+
+[ext_resource type="PackedScene" uid="uid://6o1bfy3xhjbm" path="res://fx/fx.tscn" id="1"]
+[ext_resource type="Texture2D" uid="uid://cuhf1q2aeyoau" path="res://assets/fx/dust.png" id="2"]
+[ext_resource type="Script" path="res://fx/dust.gd" id="3"]
+
+[sub_resource type="Animation" id="1"]
+resource_name = "Animate"
+length = 0.3
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 0.1, 0.2),
+"transitions": PackedFloat32Array(1, 1, 1),
+"update": 1,
+"values": [0, 1, 2]
+}
+tracks/1/type = "method"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath(".")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0.3),
+"transitions": PackedFloat32Array(1),
+"values": [{
+"args": [],
+"method": &"queue_free"
+}]
+}
+
+[sub_resource type="Animation" id="2"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [2]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_60u2x"]
+_data = {
+"Animate": SubResource("1"),
+"RESET": SubResource("2")
+}
+
+[node name="DustEffect" instance=ExtResource("1")]
+script = ExtResource("3")
+
+[node name="Sprite" parent="." index="0"]
+texture = ExtResource("2")
+hframes = 3
+frame = 2
+
+[node name="AnimationPlayer" parent="." index="1"]
+autoplay = "Animate"
+libraries = {
+"": SubResource("AnimationLibrary_60u2x")
+}
diff --git a/fx/fx.tscn b/fx/fx.tscn
new file mode 100644
index 0000000..e5fa217
--- /dev/null
+++ b/fx/fx.tscn
@@ -0,0 +1,8 @@
+[gd_scene format=3 uid="uid://6o1bfy3xhjbm"]
+
+[node name="Effect" type="Node2D"]
+texture_filter = 1
+
+[node name="Sprite" type="Sprite2D" parent="."]
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
diff --git a/fx/jump.tscn b/fx/jump.tscn
new file mode 100644
index 0000000..3010854
--- /dev/null
+++ b/fx/jump.tscn
@@ -0,0 +1,69 @@
+[gd_scene load_steps=6 format=3 uid="uid://cyihdut47gar"]
+
+[ext_resource type="PackedScene" uid="uid://6o1bfy3xhjbm" path="res://fx/fx.tscn" id="1"]
+[ext_resource type="Texture2D" uid="uid://c7cnh7u3nstnh" path="res://assets/fx/jump.png" id="2"]
+
+[sub_resource type="Animation" id="1"]
+resource_name = "Animate"
+length = 0.4
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 0.1, 0.2, 0.3),
+"transitions": PackedFloat32Array(1, 1, 1, 1),
+"update": 1,
+"values": [0, 1, 2, 3]
+}
+tracks/1/type = "method"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath(".")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0.4),
+"transitions": PackedFloat32Array(1),
+"values": [{
+"args": [],
+"method": &"queue_free"
+}]
+}
+
+[sub_resource type="Animation" id="2"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [1]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_ity0p"]
+_data = {
+"Animate": SubResource("1"),
+"RESET": SubResource("2")
+}
+
+[node name="JumpEffect" instance=ExtResource("1")]
+
+[node name="Sprite" parent="." index="0"]
+position = Vector2(0, -8)
+texture = ExtResource("2")
+hframes = 4
+frame = 1
+
+[node name="AnimationPlayer" parent="." index="1"]
+autoplay = "Animate"
+libraries = {
+"": SubResource("AnimationLibrary_ity0p")
+}
diff --git a/fx/wall_dust.tscn b/fx/wall_dust.tscn
new file mode 100644
index 0000000..a062964
--- /dev/null
+++ b/fx/wall_dust.tscn
@@ -0,0 +1,68 @@
+[gd_scene load_steps=6 format=3 uid="uid://batisas75bpt0"]
+
+[ext_resource type="PackedScene" uid="uid://6o1bfy3xhjbm" path="res://fx/fx.tscn" id="1_4c41e"]
+[ext_resource type="Texture2D" uid="uid://cky7hbmx1auqh" path="res://assets/fx/wall_dust.png" id="2_inful"]
+
+[sub_resource type="Animation" id="1"]
+resource_name = "Animate"
+length = 0.5
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4),
+"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
+"update": 1,
+"values": [0, 1, 2, 3, 4]
+}
+tracks/1/type = "method"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath(".")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0.5),
+"transitions": PackedFloat32Array(1),
+"values": [{
+"args": [],
+"method": &"queue_free"
+}]
+}
+
+[sub_resource type="Animation" id="2"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [1]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_ct4ki"]
+_data = {
+"Animate": SubResource("1"),
+"RESET": SubResource("2")
+}
+
+[node name="WallDustEffect" instance=ExtResource("1_4c41e")]
+
+[node name="Sprite" parent="." index="0"]
+texture = ExtResource("2_inful")
+hframes = 5
+frame = 1
+
+[node name="AnimationPlayer" parent="." index="1"]
+autoplay = "Animate"
+libraries = {
+"": SubResource("AnimationLibrary_ct4ki")
+}
diff --git a/levels/BaseTemplate.gd b/levels/BaseTemplate.gd
new file mode 100644
index 0000000..6679cde
--- /dev/null
+++ b/levels/BaseTemplate.gd
@@ -0,0 +1,79 @@
+extends TileMap
+class_name Level
+
+const BlockDoor_scn := preload("res://world/door/block_door.tscn")
+const Door_scn := preload("res://world/door/door.tscn")
+const OneWayPlatform_scn := preload("res://world/one_way_platform.tscn")
+
+const ALL_DOORS := [Vector2i.UP, Vector2i.DOWN, Vector2i.LEFT, Vector2i.RIGHT]
+
+@export_range(0, 15) var enabled_walls := 0 # https://kidscancode.org/blog/img/cells_4bit.png
+
+const rot_map := {Vector2i.LEFT: PI, Vector2i.RIGHT: 0, Vector2i.DOWN: PI / 2, Vector2i.UP: -PI / 2} # 180 # 90 # -90
+
+@onready var enemys := $Enemys.get_children()
+@onready var enemyqty := $Enemys.get_child_count()
+@onready var has_enemys := enemyqty != 0
+
+@onready var blockdoors: Node2D
+@onready var doors: Node2D = create_node(&"doors")
+
+
+func create_node(p_name: StringName) -> Node2D:
+ var n := Node2D.new()
+ n.position = Vector2.ZERO
+ n.name = p_name
+ add_child(n)
+ return n
+
+
+func _ready():
+ var wall_array := Maze.tile_4b_to_wall_array(enabled_walls)
+
+ if len(wall_array) != 4:
+ var door_array := Util.sub(ALL_DOORS, wall_array)
+ if Vector2i.DOWN in door_array:
+ var p: OneWayPlatform = OneWayPlatform_scn.instantiate()
+ p.position = Vector2(128, 243)
+ call_deferred(&"add_child", p)
+
+ if has_enemys:
+ blockdoors = create_node(&"block_doors")
+
+ for door_p in door_array:
+ var door := add_door(door_p)
+ if has_enemys:
+ add_block_door(door)
+
+ for enemy in enemys:
+ enemy.connect(&"died", _on_enemy_died)
+
+
+func add_door(dir: Vector2i) -> Door:
+ var d := Door_scn.instantiate()
+ var v := Vector2i(128, 128) # center
+ d.rotation = rot_map[dir]
+ d.position = Vector2(v + (v * dir)).move_toward(v, 16)
+ d.dir = dir
+ doors.add_child(d)
+ return d
+
+
+func add_block_door(door: Door) -> BlockDoor:
+ var d := BlockDoor_scn.instantiate()
+ d.rotation = door.rotation
+ d.position = door.position.move_toward(Vector2(128, 128), -8)
+ blockdoors.add_child(d)
+ return d
+
+
+func _on_enemy_died() -> void:
+ enemyqty -= 1
+ if enemyqty == 0:
+ open_doors()
+
+
+func open_doors() -> void:
+ var block_doors := blockdoors.get_children()
+ for bloc_door in block_doors:
+ bloc_door.open()
diff --git a/levels/BaseTemplate.tscn b/levels/BaseTemplate.tscn
new file mode 100644
index 0000000..4674c6d
--- /dev/null
+++ b/levels/BaseTemplate.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=3 format=3 uid="uid://h2yl2s2kudv8"]
+
+[ext_resource type="Script" path="res://levels/BaseTemplate.gd" id="1_cubc7"]
+[ext_resource type="TileSet" uid="uid://dsw8frlrcnbi8" path="res://world/tiles.tres" id="1_r867i"]
+
+[node name="BaseTemplate" type="TileMap"]
+texture_filter = 1
+tile_set = ExtResource("1_r867i")
+format = 2
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 131072, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 131072, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 0, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 0, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1)
+script = ExtResource("1_cubc7")
+metadata/_edit_lock_ = true
+
+[node name="Blocks" type="TileMap" parent="."]
+visible = false
+tile_set = ExtResource("1_r867i")
+format = 2
+layer_0/tile_data = PackedInt32Array(458750, 0, 3, 458751, 131072, 3, 655359, 131072, 3, -131066, 196608, 0, -65530, 196608, 2, 1048582, 196608, 0, 1114118, 196608, 2, -65527, 196608, 2, 1048585, 196608, 0, 1114121, 196608, 2, 393232, 0, 3, 589840, 0, 3, 393233, 131072, 3, 589841, 131072, 3, -131063, 196608, 0, 655358, 0, 3)
+metadata/_edit_lock_ = true
+
+[node name="Enemys" type="Node2D" parent="."]
diff --git a/levels/LevelManager.gd b/levels/LevelManager.gd
new file mode 100644
index 0000000..3c85b80
--- /dev/null
+++ b/levels/LevelManager.gd
@@ -0,0 +1,71 @@
+extends Node
+class_name LevelManager
+
+signal world_generated(maze: Maze)
+
+var map := []
+
+const lvl_path_fmt := "res://levels/rand/%s.tscn"
+@export var levels: Array[PackedScene]
+@export var size := Vector2i(6, 6)
+@export var current_level: TileMap # ASSIGN TO START
+@export var player: Player
+@onready var main := get_parent()
+var lvl_position := Vector2i(-1, -1)
+var t: SceneTreeTimer
+
+var sorted := [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]] # Array[Array[PackedScene]] [[0..][1..]...[15..]]
+
+
+func go(to: Vector2i) -> void:
+ if t and t.time_left > 0:
+ print("skipping door enter")
+ return
+ t = get_tree().create_timer(0.1)
+ lvl_position += to
+ current_level.queue_free()
+ current_level = map[lvl_position.y][lvl_position.x].instantiate()
+ var v := Vector2i(128, 128) # center
+ player.position = Vector2(v - (v * to)).move_toward(v, 24)
+ player.velocity = Vector2.ZERO
+ prints("welcome to", current_level.name)
+ main.call_deferred(&"add_child", current_level)
+
+
+func print_map_pretty() -> void:
+ var string := ""
+ for row in map:
+ for item in row:
+ string += str(item.get_state().get_node_name(0)).substr(0, 2) + " "
+ string += "\n"
+ print(string)
+
+
+# split levels into https://kidscancode.org/blog/img/cells_4bit.png
+func sort_levels():
+ for level in levels:
+ var n: int = 0 if level.get_state().get_node_property_count(0) == 1 else level.get_state().get_node_property_value(0,1)
+ sorted[n].append(level)
+ prints(level.get_state().get_node_name(0),"=>", n)
+
+
+func _ready() -> void:
+ gen_map()
+ lvl_position = size / 2
+ Events.connect(&"change_level", go)
+ print_map_pretty()
+
+
+func gen_map() -> void:
+ sort_levels()
+ var maze := Maze.new(size)
+ maze.image().save_png("res://maze.png")
+ lvl_position = size / 2
+ map.clear()
+ for row in maze.maze:
+ var map_row: Array[PackedScene] = []
+ for i in row:
+ map_row.append(sorted[i][randi() % len(sorted[i])])
+ map.append(map_row)
+ map[lvl_position.x][lvl_position.y] = preload("res://levels/Start.tscn")
+ emit_signal(&"world_generated", maze)
diff --git a/levels/Start.gd b/levels/Start.gd
new file mode 100644
index 0000000..4f48edc
--- /dev/null
+++ b/levels/Start.gd
@@ -0,0 +1,21 @@
+extends Level
+
+@onready var lvl_manager = $"../LevelManager"
+
+func _ready() -> void:
+ var maze: Maze = get_parent().maze
+ if !maze:
+ maze = await lvl_manager.world_generated
+ enabled_walls = (maze.get_cellv(lvl_manager.size / 2))
+ const wm := {
+ Vector2i.UP: [Vector2i(7, 0), Vector2i(8, 0)],
+ Vector2i.DOWN: [Vector2i(7, 15), Vector2i(8, 15)],
+ Vector2i.LEFT: [Vector2i(0, 7), Vector2i(0, 8)],
+ Vector2i.RIGHT: [Vector2i(15, 7), Vector2i(15, 8)]
+ }
+ var terrain: Array[Vector2i] = []
+ for wall in Maze.tile_4b_to_wall_array(enabled_walls):
+ terrain.append_array(wm[wall])
+ set_cells_terrain_connect(0, terrain, 0, 0, true)
+ super()
+
diff --git a/levels/Start.tscn b/levels/Start.tscn
new file mode 100644
index 0000000..406a257
--- /dev/null
+++ b/levels/Start.tscn
@@ -0,0 +1,8 @@
+[gd_scene load_steps=3 format=3 uid="uid://c8hhhk21dtpe0"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_qw36g"]
+[ext_resource type="Script" path="res://levels/Start.gd" id="2_dhcq0"]
+
+[node name="Start" instance=ExtResource("1_qw36g")]
+layer_0/tile_data = PackedInt32Array(131072, 0, 1, 196608, 0, 1, 262144, 262144, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 262144, 2, 786432, 0, 1, 851968, 0, 1, 917504, 0, 1, 983040, 0, 2, 983041, 65536, 2, 2, 65536, 0, 983042, 327680, 3, 3, 65536, 0, 983043, 65536, 3, 4, 65536, 0, 983044, 65536, 3, 5, 327680, 0, 983045, 65536, 3, 6, 131072, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 131072, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 0, 0, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 0, 3, 10, 327680, 0, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 393216, 0, 983052, 65536, 3, 13, 65536, 0, 983053, 65536, 3, 14, 65536, 0, 983054, 65536, 3, 15, 131072, 0, 65551, 458752, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 0, 1, 0, 0, 0, 1, 65536, 0, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 917516, 196609, 0, 917517, 262145, 0, 851982, 196609, 0, 917518, 327681, 0, 917505, 65536, 1, 917506, 131072, 1, 851970, 131072, 0, 851969, 327680, 2, 786433, 131072, 1, 720897, 131072, 0, 786439, 0, 0, 786440, 327680, 0, 851976, 131072, 2, 851975, 0, 2, 786441, 131072, 3, 393220, 196608, 2, 327684, 196608, 1, 262148, 458752, 1, 393228, 196608, 0, 458764, 196608, 1, 524300, 196608, 1, 589836, 196608, 2, 262147, 65536, 2, 262146, 65536, 2, 262145, 65536, 2, 196609, 65536, 1, 131073, 65536, 1, 65537, 65536, 1, 65538, 65536, 1, 131074, 65536, 1, 196610, 65536, 1, 65539, 65536, 1, 131075, 65536, 1, 196611, 65536, 1, 196612, 131072, 1, 131076, 327680, 1, 131077, 131072, 2, 65541, 131072, 1, 65540, 65536, 1, 65548, 0, 1, 65549, 327680, 1, 131085, 458752, 1, 131084, 0, 2, 196621, 196608, 2, 65550, 65536, 2, 65546, 131072, 1, 131082, 131072, 2, 65545, 0, 1, 131081, 262144, 1, 196617, 196608, 2)
+script = ExtResource("2_dhcq0")
diff --git a/levels/rand/01.tscn b/levels/rand/01.tscn
new file mode 100644
index 0000000..1aa70e2
--- /dev/null
+++ b/levels/rand/01.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://txq8h42d4oqi"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_gxkva"]
+
+[node name="01" instance=ExtResource("1_gxkva")]
+layer_0/tile_data = PackedInt32Array(131072, 0, 1, 196608, 0, 1, 262144, 262144, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 0, 983042, 65536, 3, 3, 65536, 0, 983043, 65536, 3, 4, 327680, 0, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 131072, 3, 983046, 131072, 3, 9, 0, 3, 983049, 0, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 393216, 0, 983052, 65536, 3, 13, 65536, 0, 983053, 65536, 3, 14, 65536, 0, 983054, 65536, 3, 15, 131072, 0, 65551, 131072, 1, 131087, 131072, 1, 196623, 131072, 1, 262159, 458752, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 0, 1, 0, 0, 0, 1, 65536, 0, 65537, 65536, 1, 131073, 65536, 1, 196609, 65536, 1, 262145, 65536, 2, 262146, 131072, 2, 196610, 131072, 1, 131074, 327680, 1, 65538, 65536, 1, 65539, 65536, 1, 131075, 65536, 2, 65540, 131072, 1, 131076, 458752, 1, 196612, 196608, 2, 65548, 0, 1, 131084, 0, 1, 196620, 262144, 1, 262156, 196608, 2, 131085, 65536, 1, 65549, 65536, 1, 65550, 65536, 1, 196621, 65536, 2, 196622, 393216, 1, 131086, 65536, 1, 262158, 0, 2, 524294, 65536, 1, 524295, 65536, 1, 524296, 65536, 1, 458760, 65536, 1, 458761, 65536, 1, 458762, 327680, 2, 458763, 131072, 0, 524298, 327680, 1, 589834, 131072, 2, 524297, 65536, 1, 458759, 65536, 1, 458758, 65536, 1, 589831, 65536, 2, 393223, 65536, 0, 393222, 65536, 0, 393221, 0, 0, 458757, 393216, 2, 524293, 393216, 1, 524292, 0, 2, 458756, 0, 0, 393226, 131072, 0, 393225, 65536, 0, 393224, 65536, 0, 589829, 0, 2, 589830, 65536, 2, 589832, 65536, 2, 589833, 65536, 2, 524299, 131072, 2, 917518, 327681, 0, 393220, 1, 0, 917516, 196609, 0, 917517, 262145, 0, 851982, 196609, 0)
diff --git a/levels/rand/02.tscn b/levels/rand/02.tscn
new file mode 100644
index 0000000..f60876b
--- /dev/null
+++ b/levels/rand/02.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://gev80rx2b8vn"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_br7j7"]
+
+[node name="02" instance=ExtResource("1_br7j7")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 131072, 3, 393222, 65536, 1, 524294, 65536, 1, 589830, 65536, 1, 983046, 131072, 3, 524295, 65536, 1, 589831, 65536, 1, 393224, 65536, 1, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 1, 9, 0, 3, 393225, 65536, 1, 458761, 65536, 1, 524297, 65536, 1, 589833, 65536, 1, 983049, 0, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 65536, 1, 393223, 65536, 1, 458759, 65536, 1, 786444, 131072, 2, 720908, 131072, 1, 655372, 131072, 1, 589836, 131072, 1, 524300, 131072, 1, 458764, 131072, 1, 393228, 131072, 1, 327692, 131072, 1, 262156, 131072, 1, 786443, 65536, 2, 720907, 65536, 1, 655371, 65536, 1, 589835, 65536, 1, 524299, 65536, 1, 458763, 65536, 1, 393227, 65536, 1, 327691, 65536, 1, 262155, 65536, 1, 786442, 65536, 2, 720906, 65536, 1, 655370, 65536, 1, 589834, 65536, 1, 524298, 65536, 1, 458762, 65536, 1, 393226, 65536, 1, 327690, 65536, 1, 262154, 65536, 1, 786441, 65536, 2, 720905, 65536, 1, 655369, 65536, 1, 327689, 65536, 1, 262153, 65536, 1, 786440, 65536, 2, 720904, 65536, 1, 655368, 65536, 1, 327688, 65536, 1, 262152, 65536, 1, 786439, 65536, 2, 720903, 65536, 1, 655367, 65536, 1, 327687, 65536, 1, 262151, 65536, 1, 786438, 65536, 2, 720902, 65536, 1, 655366, 65536, 1, 327686, 65536, 1, 262150, 65536, 1, 786437, 65536, 2, 720901, 65536, 1, 655365, 65536, 1, 589829, 65536, 1, 524293, 65536, 1, 458757, 65536, 1, 393221, 65536, 1, 327685, 65536, 1, 262149, 65536, 1, 786436, 65536, 2, 720900, 65536, 1, 655364, 65536, 1, 589828, 65536, 1, 524292, 65536, 1, 458756, 65536, 1, 393220, 65536, 1, 327684, 65536, 1, 262148, 65536, 1, 196620, 131072, 0, 196619, 65536, 0, 196618, 65536, 0, 196617, 65536, 0, 196616, 65536, 0, 196615, 65536, 0, 196614, 65536, 0, 196613, 65536, 0, 196612, 65536, 0, 786435, 0, 2, 720899, 0, 1, 655363, 0, 1, 589827, 0, 1, 524291, 0, 1, 458755, 0, 1, 393219, 0, 1, 327683, 0, 1, 262147, 0, 1, 196611, 0, 0)
diff --git a/levels/rand/03.tscn b/levels/rand/03.tscn
new file mode 100644
index 0000000..e18805b
--- /dev/null
+++ b/levels/rand/03.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://esupr5vkktt"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_tj6sj"]
+
+[node name="03" instance=ExtResource("1_tj6sj")]
+layer_0/tile_data = PackedInt32Array(131072, 0, 1, 196608, 0, 1, 262144, 0, 1, 327680, 262144, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 262144, 2, 720896, 0, 1, 786432, 0, 1, 851968, 0, 1, 917504, 0, 1, 983040, 0, 2, 983041, 65536, 2, 2, 65536, 0, 983042, 65536, 2, 3, 65536, 0, 983043, 65536, 2, 4, 65536, 0, 983044, 65536, 2, 5, 327680, 0, 983045, 65536, 2, 6, 131072, 3, 983046, 131072, 2, 9, 0, 0, 983049, 0, 2, 10, 65536, 0, 983050, 65536, 2, 11, 65536, 0, 983051, 65536, 2, 12, 65536, 0, 983052, 65536, 2, 13, 65536, 0, 983053, 65536, 2, 14, 65536, 0, 983054, 65536, 2, 15, 131072, 0, 65551, 131072, 1, 131087, 131072, 1, 196623, 131072, 1, 262159, 131072, 1, 327695, 458752, 1, 393231, 196608, 2, 589839, 131072, 0, 655375, 131072, 1, 720911, 131072, 1, 786447, 131072, 1, 851983, 131072, 1, 917519, 131072, 1, 983055, 131072, 2, 65536, 0, 1, 0, 0, 0, 1, 65536, 0, 917505, 65536, 1, 917506, 65536, 1, 917507, 65536, 1, 917508, 65536, 1, 917509, 65536, 1, 917510, 131072, 1, 851974, 131072, 0, 851973, 327680, 2, 851972, 65536, 1, 851971, 65536, 1, 851970, 65536, 1, 851969, 65536, 1, 786433, 65536, 1, 720897, 65536, 1, 655361, 65536, 0, 786434, 65536, 1, 720898, 65536, 1, 655362, 65536, 0, 786435, 65536, 1, 720899, 65536, 1, 655363, 65536, 0, 655364, 65536, 0, 655365, 131072, 0, 720901, 131072, 1, 720900, 65536, 1, 786436, 65536, 1, 786437, 131072, 1, 917513, 0, 0, 917514, 65536, 0, 917515, 65536, 0, 917516, 393216, 2, 851980, 0, 0, 917517, 65536, 1, 851981, 393216, 2, 851982, 65536, 1, 917518, 65536, 1, 786445, 0, 0, 786446, 393216, 2, 720910, 0, 1, 655374, 0, 1, 589838, 0, 0, 65546, 393216, 1, 131082, 0, 1, 131083, 65536, 1, 196619, 393216, 1, 196620, 65536, 1, 262156, 65536, 1, 327692, 393216, 1, 327693, 327680, 1, 327694, 65536, 2, 262158, 65536, 1, 196622, 65536, 1, 131086, 65536, 1, 65549, 65536, 1, 131085, 65536, 1, 131084, 65536, 1, 65548, 65536, 1, 196621, 65536, 1, 65547, 65536, 1, 262157, 65536, 1, 65550, 65536, 1, 393229, 131072, 2, 393228, 0, 2, 327691, 0, 2, 262155, 0, 1, 196618, 0, 2, 65545, 0, 2, 65538, 65536, 1, 131075, 65536, 1, 196611, 327680, 1, 196612, 131072, 2, 131076, 327680, 1, 65541, 131072, 1, 131077, 131072, 2, 196610, 65536, 1, 65537, 65536, 1, 131074, 65536, 1, 131073, 65536, 1, 196609, 65536, 1, 262145, 65536, 1, 65539, 65536, 1, 65540, 65536, 1, 262147, 131072, 2, 262146, 327680, 1, 327682, 131072, 2, 327681, 65536, 2, 393222, 393216, 4, 458758, 0, 2, 458759, 65536, 2, 458760, 458752, 1, 524296, 196608, 2, 393224, 131072, 0, 393223, 327680, 2, 393221, 0, 3, 327686, 0, 0, 327687, 131072, 0, 655370, 131072, 0, 720906, 131072, 2, 720905, 0, 2, 655369, 0, 0, 524299, 131072, 3, 524298, 0, 3, 196616, 131072, 3, 196615, 0, 3)
diff --git a/levels/rand/04.tscn b/levels/rand/04.tscn
new file mode 100644
index 0000000..6749d8c
--- /dev/null
+++ b/levels/rand/04.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://wgp3b5vk3qbs"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_twiom"]
+
+[node name="04" instance=ExtResource("1_twiom")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 262144, 2, 917504, 0, 1, 983040, 0, 2, 983041, 65536, 2, 2, 65536, 3, 983042, 65536, 2, 3, 393216, 0, 983043, 65536, 2, 4, 65536, 0, 983044, 327680, 3, 5, 65536, 0, 983045, 65536, 3, 6, 65536, 0, 393222, 0, 1, 524294, 393216, 1, 589830, 0, 2, 983046, 131072, 3, 524295, 65536, 1, 589831, 393216, 1, 393224, 65536, 1, 458760, 65536, 1, 524296, 65536, 1, 589832, 327680, 1, 9, 327680, 0, 393225, 65536, 1, 458761, 65536, 1, 524297, 65536, 1, 589833, 65536, 2, 983049, 0, 3, 10, 65536, 3, 983050, 65536, 3, 11, 393216, 0, 983051, 65536, 3, 12, 65536, 0, 983052, 65536, 3, 13, 65536, 0, 983053, 65536, 3, 14, 65536, 0, 983054, 65536, 3, 15, 131072, 0, 65551, 131072, 1, 131087, 131072, 1, 196623, 131072, 1, 262159, 458752, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 393216, 2, 393223, 65536, 1, 458759, 65536, 1, 8, 65536, 0, 7, 65536, 0, 65542, 65536, 1, 131078, 65536, 1, 196614, 393216, 1, 262150, 0, 1, 327686, 0, 1, 327687, 65536, 1, 327688, 65536, 1, 327689, 65536, 1, 262153, 327680, 2, 196617, 131072, 1, 131081, 131072, 1, 65545, 131072, 1, 65544, 65536, 1, 65543, 65536, 1, 131079, 65536, 1, 196615, 65536, 1, 262151, 65536, 1, 196616, 65536, 1, 131080, 65536, 1, 262152, 65536, 1, 65539, 0, 2, 65540, 393216, 1, 131076, 0, 2, 131077, 393216, 1, 196613, 0, 2, 65541, 65536, 1, 262158, 0, 2, 196622, 393216, 1, 196621, 0, 2, 131085, 393216, 1, 131084, 0, 2, 65548, 393216, 1, 65547, 0, 2, 65549, 65536, 1, 65550, 65536, 1, 131086, 65536, 1, 327690, 327680, 2, 327691, 131072, 0, 393227, 327680, 2, 458763, 65536, 1, 458764, 327680, 4, 393228, 131072, 0, 524300, 131072, 2, 524299, 327680, 1, 524298, 65536, 1, 589834, 65536, 2, 589835, 131072, 2, 458762, 65536, 1, 393226, 65536, 1, 458765, 131072, 3, 262154, 131072, 0, 458757, 0, 0, 524293, 0, 2, 655367, 0, 2, 655368, 131072, 2, 917516, 196609, 0, 917517, 262145, 0, 851982, 196609, 0, 917518, 327681, 0, 917505, 65536, 1, 917506, 327680, 2, 851969, 65536, 0, 851970, 131072, 0, 917507, 65536, 0, 917508, 131072, 0)
+enabled_walls = 1.0
diff --git a/levels/rand/05.tscn b/levels/rand/05.tscn
new file mode 100644
index 0000000..cd2c676
--- /dev/null
+++ b/levels/rand/05.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://lb0i4wxlcdo3"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_6wqlc"]
+
+[node name="05" instance=ExtResource("1_6wqlc")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 131072, 3, 393222, 589824, 0, 524294, 0, 1, 589830, 0, 2, 983046, 131072, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 0, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 327680, 2, 589833, 393216, 1, 983049, 0, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 393216, 3, 12, 65536, 3, 983052, 65536, 2, 13, 65536, 3, 983053, 65536, 2, 14, 65536, 3, 983054, 65536, 2, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 1, 589839, 196608, 1, 655375, 196608, 1, 720911, 196608, 1, 786447, 458752, 2, 851983, 131072, 1, 917519, 131072, 1, 983055, 131072, 2, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 458767, 196608, 1, 524303, 196608, 1, 917518, 65536, 1, 917517, 65536, 1, 851981, 393216, 2, 851982, 65536, 1, 786446, 65536, 0, 786445, 0, 0, 851980, 0, 0, 917516, 393216, 2, 917515, 0, 0, 131074, 0, 0, 196610, 0, 1, 262146, 0, 2, 262147, 393216, 1, 262148, 327680, 2, 196612, 131072, 1, 196611, 65536, 1, 131075, 65536, 0, 131076, 131072, 0, 262149, 65536, 0, 327685, 393216, 1, 327686, 131072, 1, 262150, 131072, 0, 393221, 0, 2, 327684, 65536, 2, 327683, 0, 2, 655369, 0, 1, 720905, 0, 2, 720906, 131072, 2, 655370, 131072, 1, 589834, 131072, 1, 524298, 131072, 0, 720900, 131072, 0, 720899, 0, 0, 786435, 0, 2, 786436, 131072, 2)
+enabled_walls = 2.0
diff --git a/levels/rand/06.tscn b/levels/rand/06.tscn
new file mode 100644
index 0000000..a1efe51
--- /dev/null
+++ b/levels/rand/06.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://cmex8m63vfpoj"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_m26rk"]
+
+[node name="06" instance=ExtResource("1_m26rk")]
+layer_0/tile_data = PackedInt32Array(131072, 262144, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 0, 983042, 65536, 3, 3, 65536, 0, 983043, 65536, 3, 4, 65536, 0, 983044, 65536, 3, 5, 65536, 0, 983045, 65536, 3, 6, 65536, 0, 393222, 393216, 1, 524294, 0, 1, 589830, 0, 2, 983046, 131072, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 1, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 65536, 0, 393225, 65536, 1, 458761, 65536, 1, 524297, 65536, 1, 589833, 65536, 2, 983049, 0, 3, 10, 65536, 0, 983050, 65536, 3, 11, 65536, 0, 983051, 65536, 3, 12, 65536, 0, 983052, 65536, 3, 13, 65536, 0, 983053, 65536, 3, 14, 65536, 0, 983054, 393216, 3, 15, 131072, 0, 65551, 131072, 1, 131087, 131072, 1, 196623, 131072, 1, 262159, 131072, 1, 327695, 131072, 1, 393231, 131072, 1, 589839, 131072, 1, 655375, 131072, 1, 720911, 131072, 1, 786447, 131072, 1, 851983, 131072, 1, 917519, 131072, 1, 983055, 131072, 2, 65536, 0, 1, 0, 0, 0, 1, 65536, 0, 458758, 0, 1, 393223, 65536, 1, 458759, 65536, 1, 327686, 65536, 1, 262149, 65536, 1, 196612, 65536, 1, 131075, 65536, 1, 65538, 65536, 1, 786446, 65536, 1, 720909, 65536, 1, 655372, 65536, 1, 589835, 65536, 1, 524298, 65536, 1, 196611, 393216, 1, 262148, 393216, 1, 327685, 393216, 1, 589834, 393216, 1, 655371, 393216, 1, 720908, 393216, 1, 786445, 393216, 1, 851982, 393216, 1, 131074, 393216, 1, 65537, 65536, 1, 196610, 0, 2, 262147, 0, 2, 327684, 0, 2, 393221, 0, 2, 655370, 0, 2, 720907, 0, 2, 786444, 0, 2, 851981, 0, 2, 917518, 0, 1, 131073, 65536, 2, 7, 65536, 0, 8, 65536, 0, 458767, 131072, 1, 524303, 131072, 1, 720910, 65536, 1, 655374, 65536, 1, 589838, 65536, 1, 524302, 65536, 1, 458766, 65536, 1, 393230, 65536, 1, 327694, 65536, 1, 262158, 65536, 1, 196622, 65536, 1, 131086, 65536, 1, 65550, 65536, 1, 655373, 65536, 1, 589837, 65536, 1, 524301, 65536, 1, 458765, 65536, 1, 393229, 65536, 1, 327693, 65536, 1, 262157, 65536, 1, 196621, 65536, 1, 131085, 65536, 1, 65549, 65536, 1, 589836, 65536, 1, 524300, 65536, 1, 458764, 65536, 1, 393228, 65536, 1, 327692, 65536, 1, 262156, 65536, 1, 196620, 65536, 1, 131084, 65536, 1, 65548, 65536, 1, 524299, 65536, 1, 458763, 65536, 1, 393227, 65536, 1, 327691, 65536, 1, 262155, 65536, 1, 196619, 65536, 1, 131083, 65536, 1, 65547, 65536, 1, 458762, 65536, 1, 393226, 65536, 1, 327690, 65536, 1, 262154, 65536, 1, 196618, 65536, 1, 131082, 65536, 1, 65546, 65536, 1, 327689, 65536, 1, 262153, 65536, 1, 196617, 65536, 1, 131081, 65536, 1, 65545, 65536, 1, 327688, 65536, 1, 262152, 65536, 1, 196616, 65536, 1, 131080, 65536, 1, 65544, 65536, 1, 327687, 65536, 1, 262151, 65536, 1, 196615, 65536, 1, 131079, 65536, 1, 65543, 65536, 1, 262150, 65536, 1, 196614, 65536, 1, 131078, 65536, 1, 65542, 65536, 1, 196613, 65536, 1, 131077, 65536, 1, 65541, 65536, 1, 131076, 65536, 1, 65540, 65536, 1, 65539, 65536, 1)
+enabled_walls = 3.0
diff --git a/levels/rand/07.tscn b/levels/rand/07.tscn
new file mode 100644
index 0000000..e4e6ba9
--- /dev/null
+++ b/levels/rand/07.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://bh0o48w2ir4l2"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_3bnrf"]
+
+[node name="07" instance=ExtResource("1_3bnrf")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 131072, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 65536, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 0, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 65536, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 983047, 65536, 3, 983048, 65536, 3)
+enabled_walls = 4.0
diff --git a/levels/rand/08.tscn b/levels/rand/08.tscn
new file mode 100644
index 0000000..9a85d13
--- /dev/null
+++ b/levels/rand/08.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://x3fddi5udbur"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_4ldoi"]
+
+[node name="08" instance=ExtResource("1_4ldoi")]
+layer_0/tile_data = PackedInt32Array(131072, 0, 1, 196608, 0, 1, 262144, 0, 1, 327680, 0, 1, 393216, 0, 2, 589824, 0, 0, 655360, 0, 1, 720896, 0, 1, 786432, 0, 1, 851968, 0, 1, 917504, 0, 1, 983040, 0, 2, 983041, 65536, 2, 2, 65536, 0, 983042, 65536, 2, 3, 65536, 0, 983043, 65536, 2, 4, 65536, 0, 983044, 65536, 2, 5, 65536, 0, 983045, 65536, 2, 6, 65536, 0, 524294, 0, 2, 983046, 65536, 2, 524295, 65536, 2, 458760, 65536, 0, 524296, 65536, 2, 9, 65536, 0, 458761, 131072, 0, 524297, 131072, 2, 983049, 65536, 2, 10, 65536, 0, 983050, 65536, 2, 11, 65536, 0, 983051, 65536, 2, 12, 65536, 0, 983052, 65536, 2, 13, 65536, 0, 983053, 65536, 2, 14, 65536, 0, 983054, 65536, 2, 15, 131072, 0, 65551, 131072, 1, 131087, 131072, 1, 196623, 131072, 1, 262159, 131072, 1, 327695, 131072, 1, 393231, 131072, 2, 589839, 131072, 0, 655375, 131072, 1, 720911, 131072, 1, 786447, 131072, 1, 851983, 131072, 1, 917519, 131072, 1, 983055, 131072, 2, 65536, 0, 1, 0, 0, 0, 1, 65536, 0, 458758, 0, 0, 458759, 65536, 0, 7, 65536, 0, 8, 65536, 0, 983047, 65536, 2, 983048, 65536, 2, 917518, 65536, 1, 851982, 65536, 1, 786446, 65536, 1, 720910, 65536, 1, 655374, 65536, 1, 589838, 65536, 0, 917517, 65536, 1, 851981, 65536, 1, 786445, 65536, 1, 720909, 65536, 1, 655373, 65536, 1, 589837, 65536, 0, 917516, 65536, 1, 851980, 65536, 1, 786444, 65536, 1, 720908, 65536, 1, 655372, 65536, 1, 589836, 65536, 0, 917515, 65536, 1, 851979, 65536, 1, 786443, 65536, 1, 720907, 393216, 2, 655371, 0, 1, 589835, 0, 0, 917514, 65536, 1, 851978, 65536, 1, 786442, 65536, 1, 720906, 65536, 0, 917513, 65536, 1, 851977, 65536, 1, 786441, 65536, 1, 720905, 65536, 0, 917512, 65536, 1, 851976, 65536, 1, 786440, 65536, 1, 720904, 65536, 0, 917511, 65536, 1, 851975, 65536, 1, 786439, 65536, 1, 720903, 65536, 0, 917510, 65536, 1, 851974, 65536, 1, 786438, 65536, 1, 720902, 65536, 0, 917509, 65536, 1, 851973, 65536, 1, 786437, 65536, 1, 720901, 65536, 0, 917508, 65536, 1, 851972, 65536, 1, 786436, 65536, 1, 720900, 327680, 2, 655364, 131072, 1, 589828, 131072, 0, 917507, 65536, 1, 851971, 65536, 1, 786435, 65536, 1, 720899, 65536, 1, 655363, 65536, 1, 589827, 65536, 0, 917506, 65536, 1, 851970, 65536, 1, 786434, 65536, 1, 720898, 65536, 1, 655362, 65536, 1, 589826, 65536, 0, 917505, 65536, 1, 851969, 65536, 1, 786433, 65536, 1, 720897, 65536, 1, 655361, 65536, 1, 589825, 65536, 0, 393230, 65536, 2, 327694, 65536, 1, 262158, 65536, 1, 196622, 65536, 1, 131086, 65536, 1, 65550, 65536, 1, 393229, 65536, 2, 327693, 65536, 1, 262157, 65536, 1, 196621, 65536, 1, 131085, 65536, 1, 65549, 65536, 1, 393228, 65536, 2, 327692, 65536, 1, 262156, 65536, 1, 196620, 65536, 1, 131084, 65536, 1, 65548, 65536, 1, 393227, 0, 2, 327691, 393216, 1, 262155, 65536, 1, 196619, 65536, 1, 131083, 65536, 1, 65547, 65536, 1, 327690, 65536, 2, 262154, 65536, 1, 196618, 65536, 1, 131082, 65536, 1, 65546, 65536, 1, 327689, 65536, 2, 262153, 65536, 1, 196617, 65536, 1, 131081, 65536, 1, 65545, 65536, 1, 327688, 65536, 2, 262152, 65536, 1, 196616, 65536, 1, 131080, 65536, 1, 65544, 65536, 1, 327687, 65536, 2, 262151, 65536, 1, 196615, 65536, 1, 131079, 65536, 1, 65543, 65536, 1, 327686, 65536, 2, 262150, 65536, 1, 196614, 65536, 1, 131078, 65536, 1, 65542, 65536, 1, 262149, 65536, 1, 196613, 65536, 1, 131077, 65536, 1, 65541, 65536, 1, 393220, 131072, 2, 327684, 327680, 1, 262148, 65536, 1, 196612, 65536, 1, 131076, 65536, 1, 65540, 65536, 1, 393219, 65536, 2, 327683, 65536, 1, 262147, 65536, 1, 196611, 65536, 1, 131075, 65536, 1, 65539, 65536, 1, 393218, 65536, 2, 327682, 65536, 1, 262146, 65536, 1, 196610, 65536, 1, 131074, 65536, 1, 65538, 65536, 1, 393217, 65536, 2, 327681, 65536, 1, 262145, 65536, 1, 196609, 65536, 1, 131073, 65536, 1, 65537, 65536, 1, 327685, 65536, 2)
+enabled_walls = 5.0
diff --git a/levels/rand/09.tscn b/levels/rand/09.tscn
new file mode 100644
index 0000000..c5d9f87
--- /dev/null
+++ b/levels/rand/09.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://b7w7ns27n53rh"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_ix63m"]
+
+[node name="09" instance=ExtResource("1_ix63m")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 131072, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 65536, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 0, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 65536, 3, 10, 65536, 3, 983050, 393216, 3, 11, 65536, 3, 983051, 65536, 2, 12, 65536, 3, 983052, 65536, 2, 13, 65536, 3, 983053, 65536, 2, 14, 65536, 3, 983054, 65536, 2, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 1, 589839, 131072, 1, 655375, 131072, 1, 720911, 131072, 1, 786447, 131072, 1, 851983, 131072, 1, 917519, 131072, 1, 983055, 131072, 2, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 983047, 65536, 3, 983048, 65536, 3, 917514, 0, 0, 917515, 65536, 0, 917516, 393216, 2, 851981, 65536, 1, 851982, 65536, 1, 786446, 65536, 1, 720910, 393216, 2, 524303, 458752, 2, 458767, 196608, 1, 524302, 0, 0, 589838, 0, 1, 655374, 0, 1, 917517, 65536, 1, 917518, 65536, 1, 786445, 393216, 2, 720909, 0, 0, 786444, 0, 0, 851980, 0, 1)
+enabled_walls = 6.0
diff --git a/levels/rand/10.tscn b/levels/rand/10.tscn
new file mode 100644
index 0000000..867f536
--- /dev/null
+++ b/levels/rand/10.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://gyxkjwsih0s2"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_c2n3v"]
+
+[node name="10" instance=ExtResource("1_c2n3v")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 2, 589824, 196608, 0, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 65536, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 65536, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 65536, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 65536, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 1, 589839, 196608, 1, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 983047, 65536, 3, 983048, 65536, 3, 524303, 196608, 1, 458767, 196608, 1, 8, 65536, 3, 7, 65536, 3)
+enabled_walls = 7.0
diff --git a/levels/rand/11.tscn b/levels/rand/11.tscn
new file mode 100644
index 0000000..5a7156b
--- /dev/null
+++ b/levels/rand/11.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://bkywu3kc1xfep"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_pa3ds"]
+
+[node name="11" instance=ExtResource("1_pa3ds")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 1, 589824, 196608, 1, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 131072, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 131072, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 0, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 0, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 524288, 196608, 1, 458752, 196608, 1)
+enabled_walls = 8.0
diff --git a/levels/rand/12.tscn b/levels/rand/12.tscn
new file mode 100644
index 0000000..7e3b2de
--- /dev/null
+++ b/levels/rand/12.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://dnn448k214c42"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_x55go"]
+
+[node name="12" instance=ExtResource("1_x55go")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 1, 589824, 196608, 1, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 65536, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 131072, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 65536, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 0, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 7, 65536, 3, 8, 65536, 3, 458752, 196608, 1, 524288, 196608, 1)
+enabled_walls = 9.0
diff --git a/levels/rand/13.tscn b/levels/rand/13.tscn
new file mode 100644
index 0000000..8012be2
--- /dev/null
+++ b/levels/rand/13.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://dkci2hmtjgrvj"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_13npg"]
+
+[node name="13" instance=ExtResource("1_13npg")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 1, 589824, 196608, 1, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 131072, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 131072, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 0, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 0, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 1, 589839, 196608, 1, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 458767, 196608, 1, 524303, 196608, 1, 458752, 196608, 1, 524288, 196608, 1)
+enabled_walls = 10.0
diff --git a/levels/rand/14.tscn b/levels/rand/14.tscn
new file mode 100644
index 0000000..913caaf
--- /dev/null
+++ b/levels/rand/14.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://bxokgsjhvo0ad"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_d7058"]
+
+[node name="14" instance=ExtResource("1_d7058")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 1, 589824, 196608, 1, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 65536, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 131072, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 65536, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 0, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 1, 589839, 196608, 1, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 458752, 196608, 1, 524288, 196608, 1, 8, 65536, 3, 7, 65536, 3, 524303, 196608, 1, 458767, 196608, 1)
+enabled_walls = 11.0
diff --git a/levels/rand/15.tscn b/levels/rand/15.tscn
new file mode 100644
index 0000000..22d87cd
--- /dev/null
+++ b/levels/rand/15.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://cnwifdbe2eqv8"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_40br1"]
+
+[node name="15" instance=ExtResource("1_40br1")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 1, 589824, 196608, 1, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 131072, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 65536, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 0, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 65536, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 458752, 196608, 1, 524288, 196608, 1, 983047, 65536, 3, 983048, 65536, 3)
+enabled_walls = 12.0
diff --git a/levels/rand/16.tscn b/levels/rand/16.tscn
new file mode 100644
index 0000000..e33cf47
--- /dev/null
+++ b/levels/rand/16.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://d4dwvcp6764bx"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_yds8y"]
+
+[node name="16" instance=ExtResource("1_yds8y")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 1, 589824, 196608, 1, 655360, 196608, 1, 720896, 196608, 1, 786432, 196608, 1, 851968, 196608, 1, 917504, 196608, 1, 983040, 262144, 3, 983041, 65536, 3, 2, 65536, 3, 983042, 65536, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 65536, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 65536, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 65536, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 65536, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 2, 589839, 196608, 0, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 983048, 65536, 3, 983047, 65536, 3, 524288, 196608, 1, 458752, 196608, 1, 7, 65536, 3, 8, 65536, 3)
+enabled_walls = 13.0
diff --git a/levels/rand/17.tscn b/levels/rand/17.tscn
new file mode 100644
index 0000000..ce200e3
--- /dev/null
+++ b/levels/rand/17.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://duo0cbnh5u3qt"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_otvl3"]
+
+[node name="17" instance=ExtResource("1_otvl3")]
+layer_0/tile_data = PackedInt32Array(131072, 196608, 1, 196608, 196608, 1, 262144, 196608, 1, 327680, 196608, 1, 393216, 196608, 1, 589824, 196608, 1, 655360, 196608, 1, 720896, 196608, 1, 786432, 262144, 2, 851968, 0, 1, 917504, 0, 1, 983040, 0, 2, 983041, 65536, 2, 2, 65536, 3, 983042, 327680, 3, 3, 65536, 3, 983043, 65536, 3, 4, 65536, 3, 983044, 65536, 3, 5, 65536, 3, 983045, 65536, 3, 6, 131072, 3, 393222, 0, 0, 524294, 0, 1, 589830, 0, 2, 983046, 65536, 3, 524295, 65536, 1, 589831, 65536, 2, 393224, 65536, 0, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 2, 9, 0, 3, 393225, 131072, 0, 458761, 131072, 1, 524297, 131072, 1, 589833, 131072, 2, 983049, 65536, 3, 10, 65536, 3, 983050, 65536, 3, 11, 65536, 3, 983051, 65536, 3, 12, 65536, 3, 983052, 65536, 3, 13, 65536, 3, 983053, 65536, 3, 14, 65536, 3, 983054, 65536, 3, 15, 458752, 0, 65551, 196608, 1, 131087, 196608, 1, 196623, 196608, 1, 262159, 196608, 1, 327695, 196608, 1, 393231, 196608, 1, 589839, 196608, 1, 655375, 196608, 1, 720911, 196608, 1, 786447, 196608, 1, 851983, 196608, 1, 917519, 196608, 1, 983055, 458752, 3, 65536, 196608, 1, 0, 262144, 0, 1, 65536, 3, 458758, 0, 1, 393223, 65536, 0, 458759, 65536, 1, 458752, 196608, 1, 524288, 196608, 1, 786433, 131072, 0, 917505, 327680, 2, 851969, 131072, 1, 917506, 131072, 0, 983047, 65536, 3, 983048, 65536, 3, 524303, 196608, 1, 458767, 196608, 1)
+enabled_walls = 14.0
diff --git a/levels/rand/18.tscn b/levels/rand/18.tscn
new file mode 100644
index 0000000..3f22f31
--- /dev/null
+++ b/levels/rand/18.tscn
@@ -0,0 +1,7 @@
+[gd_scene load_steps=2 format=3 uid="uid://cy3kc27btbipt"]
+
+[ext_resource type="PackedScene" uid="uid://h2yl2s2kudv8" path="res://levels/BaseTemplate.tscn" id="1_ucpni"]
+
+[node name="18" instance=ExtResource("1_ucpni")]
+layer_0/tile_data = PackedInt32Array(131072, 0, 1, 196608, 0, 1, 262144, 0, 1, 327680, 0, 1, 393216, 0, 1, 589824, 0, 1, 655360, 0, 1, 720896, 0, 1, 786432, 0, 1, 851968, 0, 1, 917504, 0, 1, 983040, 0, 2, 983041, 65536, 2, 2, 65536, 0, 983042, 65536, 2, 3, 65536, 0, 983043, 65536, 2, 4, 65536, 0, 983044, 65536, 2, 5, 65536, 0, 983045, 65536, 2, 6, 65536, 0, 393222, 65536, 1, 524294, 65536, 1, 589830, 65536, 1, 983046, 65536, 2, 524295, 65536, 1, 589831, 65536, 1, 393224, 65536, 1, 458760, 65536, 1, 524296, 65536, 1, 589832, 65536, 1, 9, 65536, 0, 393225, 65536, 1, 458761, 65536, 1, 524297, 65536, 1, 589833, 65536, 1, 983049, 65536, 2, 10, 65536, 0, 983050, 65536, 2, 11, 65536, 0, 983051, 65536, 2, 12, 65536, 0, 983052, 65536, 2, 13, 65536, 0, 983053, 65536, 2, 14, 65536, 0, 983054, 65536, 2, 15, 131072, 0, 65551, 131072, 1, 131087, 131072, 1, 196623, 131072, 1, 262159, 131072, 1, 327695, 131072, 1, 393231, 131072, 1, 589839, 131072, 1, 655375, 131072, 1, 720911, 131072, 1, 786447, 131072, 1, 851983, 131072, 1, 917519, 131072, 1, 983055, 131072, 2, 65536, 0, 1, 0, 0, 0, 1, 65536, 0, 458758, 65536, 1, 393223, 65536, 1, 458759, 65536, 1, 524303, 131072, 1, 458767, 131072, 1, 917518, 65536, 1, 851982, 65536, 1, 786446, 65536, 1, 720910, 65536, 1, 655374, 65536, 1, 589838, 65536, 1, 524302, 65536, 1, 458766, 65536, 1, 393230, 65536, 1, 327694, 65536, 1, 262158, 65536, 1, 196622, 65536, 1, 131086, 65536, 1, 65550, 65536, 1, 917517, 65536, 1, 851981, 65536, 1, 786445, 65536, 1, 720909, 65536, 1, 655373, 65536, 1, 589837, 65536, 1, 524301, 65536, 1, 458765, 65536, 1, 393229, 65536, 1, 327693, 65536, 1, 262157, 65536, 1, 196621, 65536, 1, 131085, 65536, 1, 65549, 65536, 1, 917516, 65536, 1, 851980, 65536, 1, 786444, 65536, 1, 720908, 65536, 1, 655372, 65536, 1, 589836, 65536, 1, 524300, 65536, 1, 458764, 65536, 1, 393228, 65536, 1, 327692, 65536, 1, 262156, 65536, 1, 196620, 65536, 1, 131084, 65536, 1, 65548, 65536, 1, 917515, 65536, 1, 851979, 65536, 1, 786443, 65536, 1, 720907, 65536, 1, 655371, 65536, 1, 589835, 65536, 1, 524299, 65536, 1, 458763, 65536, 1, 393227, 65536, 1, 327691, 65536, 1, 262155, 65536, 1, 196619, 65536, 1, 131083, 65536, 1, 65547, 65536, 1, 917514, 65536, 1, 851978, 65536, 1, 786442, 65536, 1, 720906, 65536, 1, 655370, 65536, 1, 589834, 65536, 1, 524298, 65536, 1, 458762, 65536, 1, 393226, 65536, 1, 327690, 65536, 1, 262154, 65536, 1, 196618, 65536, 1, 131082, 65536, 1, 65546, 65536, 1, 917513, 65536, 1, 851977, 65536, 1, 786441, 65536, 1, 720905, 65536, 1, 655369, 65536, 1, 327689, 65536, 1, 262153, 65536, 1, 196617, 65536, 1, 131081, 65536, 1, 65545, 65536, 1, 983048, 65536, 2, 917512, 65536, 1, 851976, 65536, 1, 786440, 65536, 1, 720904, 65536, 1, 655368, 65536, 1, 327688, 65536, 1, 262152, 65536, 1, 196616, 65536, 1, 131080, 65536, 1, 65544, 65536, 1, 8, 65536, 0, 983047, 65536, 2, 917511, 65536, 1, 851975, 65536, 1, 786439, 65536, 1, 720903, 65536, 1, 655367, 65536, 1, 327687, 65536, 1, 262151, 65536, 1, 196615, 65536, 1, 131079, 65536, 1, 65543, 65536, 1, 7, 65536, 0, 917510, 65536, 1, 851974, 65536, 1, 786438, 65536, 1, 720902, 65536, 1, 655366, 65536, 1, 327686, 65536, 1, 262150, 65536, 1, 196614, 65536, 1, 131078, 65536, 1, 65542, 65536, 1, 917509, 65536, 1, 851973, 65536, 1, 786437, 65536, 1, 720901, 65536, 1, 655365, 65536, 1, 589829, 65536, 1, 524293, 65536, 1, 458757, 65536, 1, 393221, 65536, 1, 327685, 65536, 1, 262149, 65536, 1, 196613, 65536, 1, 131077, 65536, 1, 65541, 65536, 1, 917508, 65536, 1, 851972, 65536, 1, 786436, 65536, 1, 720900, 65536, 1, 655364, 65536, 1, 589828, 65536, 1, 524292, 65536, 1, 458756, 65536, 1, 393220, 65536, 1, 327684, 65536, 1, 262148, 65536, 1, 196612, 65536, 1, 131076, 65536, 1, 65540, 65536, 1, 917507, 65536, 1, 851971, 65536, 1, 786435, 65536, 1, 720899, 65536, 1, 655363, 65536, 1, 589827, 65536, 1, 524291, 65536, 1, 458755, 65536, 1, 393219, 65536, 1, 327683, 65536, 1, 262147, 65536, 1, 196611, 65536, 1, 131075, 65536, 1, 65539, 65536, 1, 917506, 65536, 1, 851970, 65536, 1, 786434, 65536, 1, 720898, 65536, 1, 655362, 65536, 1, 589826, 65536, 1, 524290, 65536, 1, 458754, 65536, 1, 393218, 65536, 1, 327682, 65536, 1, 262146, 65536, 1, 196610, 65536, 1, 131074, 65536, 1, 65538, 65536, 1, 917505, 65536, 1, 851969, 65536, 1, 786433, 65536, 1, 720897, 65536, 1, 655361, 65536, 1, 589825, 65536, 1, 524289, 65536, 1, 458753, 65536, 1, 393217, 65536, 1, 327681, 65536, 1, 262145, 65536, 1, 196609, 65536, 1, 131073, 65536, 1, 65537, 65536, 1, 524288, 0, 1, 458752, 0, 1)
+enabled_walls = 15.0
diff --git a/plan.md b/plan.md
new file mode 100644
index 0000000..ab19fbc
--- /dev/null
+++ b/plan.md
@@ -0,0 +1,9 @@
+# hammer spaec
+
+
+
+the floor is hammer
+
+
+
+hammer will kill you
diff --git a/player/player.gd b/player/player.gd
new file mode 100644
index 0000000..9da6719
--- /dev/null
+++ b/player/player.gd
@@ -0,0 +1,205 @@
+extends CharacterBody2D
+class_name Player
+
+const DustEffect := preload("res://fx/dust.tscn")
+const JumpEffect := preload("res://fx/jump.tscn")
+const DoubleJumpEffect := preload("res://fx/double_jump.tscn")
+const WallJumpEffect := preload("res://fx/wall_dust.tscn")
+
+@export var ACCELERATION := 512
+@export var MAX_SPEED := 64
+@export var JUMP_FORCE := 150
+@export var MAX_WALL_SLIDE_SPEED := 110
+@export var WALL_SLIDE_SPEED := 42
+
+@export var FRICTION := 0.25
+@export var AIR_MOVEMENT_MODIFIER := 0.95
+
+@onready var sprite := $Sprite
+@onready var anims := $Player as AnimationPlayer
+@onready var coyote := $CoyoteJump as Timer
+
+@onready var GRAVITY: float = ProjectSettings.get_setting(&"physics/2d/default_gravity")
+
+const FLOOR_MAX_ANGLE := deg_to_rad(46)
+
+
+func _init() -> void:
+ floor_max_angle = FLOOR_MAX_ANGLE
+
+
+enum State { MOVE, WALL_SLIDE, STOP }
+
+var double_jump := true
+var state := State.MOVE
+var just_jumped := false
+
+
+func _physics_process(delta: float) -> void:
+ just_jumped = false
+ match state:
+ State.STOP:
+ velocity = Vector2.ZERO
+ play(&"idle")
+ State.MOVE:
+ var input := Input.get_axis(&"left", &"right")
+ apply_force(input, delta)
+ apply_friction(input)
+
+ jump_check()
+
+ apply_gravity(delta)
+
+ animate()
+ move()
+ wall_slide_check()
+ State.WALL_SLIDE:
+ play(&"wall_slide")
+ var wall_axis := get_wall_axis()
+ if wall_axis != 0:
+ sprite.scale.x = wall_axis
+
+ wall_slide_jump_check(wall_axis)
+ wall_slide_drop(delta)
+ move()
+ wall_detatch(wall_axis, delta)
+
+
+func dust() -> void:
+ var dust_position := global_position
+ dust_position.x += randf_range(-4, 4)
+ Utils.instance_scene_on_main(DustEffect, dust_position)
+ # SoundFx.play("Step", -20)
+
+
+func apply_gravity(delta: float) -> void:
+ velocity.y += GRAVITY * delta
+ velocity.y = minf(velocity.y, JUMP_FORCE)
+
+
+func apply_force(input: float, delta: float) -> void:
+ if input != 0:
+ velocity.x += input * ACCELERATION * delta
+ velocity.x = clampf(velocity.x, -MAX_SPEED, MAX_SPEED)
+ # if not is_on_floor():
+ # velocity.x *= AIR_MOVEMENT_MODIFIER
+
+
+func apply_friction(input: float) -> void:
+ if input == 0 and not is_zero_approx(velocity.x) and is_on_floor():
+ velocity.x = lerpf(velocity.x, 0, FRICTION)
+
+
+func animate() -> void:
+ var facing = sign(get_local_mouse_position().x)
+ if facing != 0:
+ sprite.scale.x = facing
+
+ if not is_on_floor():
+ play(&"jump")
+ return
+
+ if velocity.x != 0:
+ play(&"run", clampi(velocity.x * sprite.scale.x, -1, 1))
+ else:
+ play(&"idle")
+
+
+func play(anim: StringName, speed: float = 1.0) -> void:
+ anims.play(anim, -1, speed)
+
+
+func jump_check() -> void:
+ var want2jump := Input.is_action_just_pressed(&"jump")
+ if want2jump and (is_on_floor() or coyote.time_left > 0):
+ jump(JUMP_FORCE)
+ just_jumped = true
+ else:
+ if want2jump and velocity.y < -JUMP_FORCE / 2:
+ velocity.y = -JUMP_FORCE / 2
+
+ if want2jump and double_jump == true:
+ double_jump = false
+ jump(JUMP_FORCE * .75)
+
+
+func jump(force):
+ # SoundFx.play("Jump", -20)
+ if double_jump:
+ Utils.instance_scene_on_main(JumpEffect, global_position)
+ else:
+ Utils.instance_scene_on_main(DoubleJumpEffect, global_position)
+ velocity.y = -force
+
+
+func move() -> void:
+ var was_in_air := not is_on_floor()
+ var was_on_floor := is_on_floor()
+ var last_position := position
+ var last_velocity := velocity
+ move_and_slide()
+
+ # landing
+ if was_in_air and is_on_floor():
+ velocity.x = last_velocity.x
+ double_jump = true
+ Utils.instance_scene_on_main(JumpEffect, global_position)
+
+ # just left ground
+ if was_on_floor and not is_on_floor() and not just_jumped:
+ position.y = last_position.y
+ coyote.start()
+ Utils.instance_scene_on_main(JumpEffect, global_position)
+
+
+func wall_slide_check():
+ if not is_on_floor() and is_on_wall_only():
+ state = State.WALL_SLIDE
+ double_jump = true
+ dust()
+
+
+func get_wall_axis() -> int:
+ var is_right_wall := test_move(transform, Vector2.RIGHT)
+ var is_left_wall := test_move(transform, Vector2.LEFT)
+ return int(is_left_wall) - int(is_right_wall)
+
+
+func wall_slide_jump_check(wall_axis) -> void:
+ if Input.is_action_just_pressed("jump"):
+ velocity.x = wall_axis * MAX_SPEED
+ velocity.y = -JUMP_FORCE / 1.25
+ state = State.MOVE
+ wall_dust(wall_axis)
+ # SoundFx.play("Jump", -20)
+
+
+func wall_dust(wall_axis: int) -> void:
+ var dust_position = global_position + Vector2(wall_axis * 4, -2)
+ var dust_fx := Utils.instance_scene_on_main(WallJumpEffect, dust_position)
+ dust_fx.scale.x = wall_axis
+
+
+func wall_slide_drop(delta: float) -> void:
+ var max_slide_speed = WALL_SLIDE_SPEED
+ if Input.is_action_pressed("down"):
+ max_slide_speed = MAX_WALL_SLIDE_SPEED
+ velocity.y = min(velocity.y + GRAVITY * delta, max_slide_speed)
+
+
+func wall_detatch(wall_axis: int, delta: float) -> void:
+ var detached := false
+ if Input.is_action_just_pressed("right"):
+ velocity.x = ACCELERATION * delta
+ detached = true
+
+ if Input.is_action_just_pressed("left"):
+ velocity.x = -ACCELERATION * delta
+ detached = true
+
+ if detached:
+ state = State.MOVE
+ wall_dust(wall_axis)
+
+ if wall_axis == 0 or is_on_floor():
+ state = State.MOVE
diff --git a/player/player.tscn b/player/player.tscn
new file mode 100644
index 0000000..b5e9665
--- /dev/null
+++ b/player/player.tscn
@@ -0,0 +1,125 @@
+[gd_scene load_steps=9 format=3 uid="uid://c1fgxkkh72npw"]
+
+[ext_resource type="Script" path="res://player/player.gd" id="1_lnsyt"]
+[ext_resource type="Texture2D" uid="uid://b36hv0jwfmb1u" path="res://assets/player/animations.png" id="2_dgplu"]
+
+[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_bxmud"]
+radius = 3.0
+height = 12.0
+
+[sub_resource type="Animation" id="Animation_sbyxw"]
+resource_name = "idle"
+length = 1.2
+loop_mode = 2
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 0.3, 0.6, 0.9),
+"transitions": PackedFloat32Array(1, 1, 1, 1),
+"update": 1,
+"values": [0, 1, 2, 3]
+}
+
+[sub_resource type="Animation" id="Animation_myglh"]
+resource_name = "jump"
+length = 0.1
+loop_mode = 1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [29]
+}
+
+[sub_resource type="Animation" id="Animation_5lnnm"]
+resource_name = "run"
+length = 0.7
+loop_mode = 1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6),
+"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1),
+"update": 1,
+"values": [4, 5, 6, 7, 8, 9, 7]
+}
+tracks/1/type = "method"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath(".")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0.3, 0.6),
+"transitions": PackedFloat32Array(1, 1),
+"values": [{
+"args": [],
+"method": &"dust"
+}, {
+"args": [],
+"method": &"dust"
+}]
+}
+
+[sub_resource type="Animation" id="Animation_ijk7a"]
+resource_name = "wall_slide"
+length = 0.1
+loop_mode = 1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [10]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_7pk85"]
+_data = {
+"idle": SubResource("Animation_sbyxw"),
+"jump": SubResource("Animation_myglh"),
+"run": SubResource("Animation_5lnnm"),
+"wall_slide": SubResource("Animation_ijk7a")
+}
+
+[node name="player" type="CharacterBody2D"]
+collision_layer = 2
+script = ExtResource("1_lnsyt")
+
+[node name="Sprite" type="Sprite2D" parent="."]
+texture_filter = 1
+position = Vector2(0, -14)
+texture = ExtResource("2_dgplu")
+hframes = 30
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+position = Vector2(0, -6)
+shape = SubResource("CapsuleShape2D_bxmud")
+debug_color = Color(0.811765, 0.360784, 0.529412, 0.419608)
+
+[node name="Player" type="AnimationPlayer" parent="."]
+libraries = {
+"": SubResource("AnimationLibrary_7pk85")
+}
+
+[node name="CoyoteJump" type="Timer" parent="."]
+wait_time = 0.2
+one_shot = true
diff --git a/project.godot b/project.godot
index 663e841..c415d4a 100644
--- a/project.godot
+++ b/project.godot
@@ -6,55 +6,145 @@
; [section] ; section goes between []
; param=value ; assign values to parameters
-config_version=4
+config_version=5
-_global_script_classes=[ {
-"base": "Reference",
-"class": "Arg",
-"language": "GDScript",
-"path": "res://addons/gdcli/Arg.gd"
+_global_script_classes=[{
+"base": "Node2D",
+"class": &"BlockDoor",
+"language": &"GDScript",
+"path": "res://world/door/block_door.gd"
}, {
-"base": "Reference",
-"class": "Parser",
-"language": "GDScript",
-"path": "res://addons/gdcli/Parser.gd"
-} ]
+"base": "Area2D",
+"class": &"Door",
+"language": &"GDScript",
+"path": "res://world/door/door.gd"
+}, {
+"base": "TileMap",
+"class": &"Level",
+"language": &"GDScript",
+"path": "res://levels/BaseTemplate.gd"
+}, {
+"base": "Node",
+"class": &"LevelManager",
+"language": &"GDScript",
+"path": "res://levels/LevelManager.gd"
+}, {
+"base": "Resource",
+"class": &"Maze",
+"language": &"GDScript",
+"path": "res://classes/Maze.gd"
+}, {
+"base": "StaticBody2D",
+"class": &"OneWayPlatform",
+"language": &"GDScript",
+"path": "res://world/one_way_platform.gd"
+}, {
+"base": "CharacterBody2D",
+"class": &"Player",
+"language": &"GDScript",
+"path": "res://player/player.gd"
+}, {
+"base": "Node",
+"class": &"Util",
+"language": &"GDScript",
+"path": "res://autoloads/Utils.gd"
+}]
_global_script_class_icons={
-"Arg": "",
-"Parser": ""
+"BlockDoor": "",
+"Door": "",
+"Level": "",
+"LevelManager": "",
+"Maze": "",
+"OneWayPlatform": "",
+"Player": "",
+"Util": ""
}
[application]
-config/name="Godot Template"
+config/name="hammer space"
run/main_scene="res://Main.tscn"
config/use_custom_user_dir=true
config/custom_user_dir_name="GodotTemplate"
+config/features=PackedStringArray("4.0")
[autoload]
-CLI="*res://autoloads/CLI.gd"
+Utils="*res://autoloads/Utils.gd"
+Events="*res://autoloads/Events.gd"
[debug]
gdscript/warnings/return_value_discarded=false
+gdscript/warnings/integer_division=0
[display]
-window/size/width=320
-window/size/height=180
+window/size/viewport_width=320
+window/size/viewport_height=320
+window/size/window_width_override=1280
+window/size/window_height_override=1280
+window/vsync/vsync_mode=0
+window/stretch/mode="canvas_items"
+window/size/width=1280
+window/size/height=1280
window/size/test_width=1280
-window/size/test_height=720
-window/dpi/allow_hidpi=true
-window/stretch/mode="2d"
-window/stretch/aspect="keep"
+window/size/test_height=1280
+
+[input]
+
+left={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"unicode":0,"echo":false,"script":null)
+]
+}
+right={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"unicode":0,"echo":false,"script":null)
+]
+}
+jump={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"unicode":0,"echo":false,"script":null)
+]
+}
+dash={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"unicode":0,"echo":false,"script":null)
+]
+}
+shoot={
+"deadzone": 0.5,
+"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"pressed":false,"double_click":false,"script":null)
+]
+}
+down={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"unicode":0,"echo":false,"script":null)
+]
+}
+
+[layer_names]
+
+2d_physics/layer_1="world"
+2d_physics/layer_2="player"
+2d_physics/layer_3="enemy"
[logging]
file_logging/enable_file_logging=true
+[physics]
+
+2d/run_on_separate_thread=true
+2d/default_gravity=300.0
+
[rendering]
+environment/defaults/default_clear_color=Color(0, 0, 0, 1)
quality/driver/driver_name="GLES2"
2d/options/use_nvidia_rect_flicker_workaround=true
quality/intended_usage/framebuffer_allocation=0
diff --git a/world/camera.gd b/world/camera.gd
new file mode 100644
index 0000000..1977a39
--- /dev/null
+++ b/world/camera.gd
@@ -0,0 +1 @@
+extends Camera2D
diff --git a/world/camera.tscn b/world/camera.tscn
new file mode 100644
index 0000000..5472655
--- /dev/null
+++ b/world/camera.tscn
@@ -0,0 +1,6 @@
+[gd_scene load_steps=2 format=3 uid="uid://dteshgq6omv8k"]
+
+[ext_resource type="Script" path="res://world/camera.gd" id="1_jvai6"]
+
+[node name="Camera" type="Camera2D"]
+script = ExtResource("1_jvai6")
diff --git a/world/door/block_door.gd b/world/door/block_door.gd
new file mode 100644
index 0000000..26427ef
--- /dev/null
+++ b/world/door/block_door.gd
@@ -0,0 +1,22 @@
+extends Node2D
+class_name BlockDoor
+
+const DustEffect := preload("res://fx/wall_dust.tscn")
+
+@onready @export var path_follower: PathFollow2D
+
+
+func dust(mod: int) -> void:
+ var i: Node2D = (
+ Utils . instance_scene_on_main(DustEffect, global_position + Vector2(randi_range(3, 5), (16 + 7) * mod))
+ )
+ i.rotation = (PI / 2) * mod
+
+
+func open() -> void:
+ dust(1)
+ dust(-1)
+ var t := create_tween().set_ease(Tween.EASE_IN)
+ t.tween_property(path_follower, "progress_ratio", 1, 2)
+ await t.finished
+ queue_free()
diff --git a/world/door/block_door.tscn b/world/door/block_door.tscn
new file mode 100644
index 0000000..b657460
--- /dev/null
+++ b/world/door/block_door.tscn
@@ -0,0 +1,30 @@
+[gd_scene load_steps=5 format=3 uid="uid://6rgblwkwaw6v"]
+
+[ext_resource type="Script" path="res://world/door/block_door.gd" id="1_tux7r"]
+[ext_resource type="Curve2D" uid="uid://jw0yvthht4bj" path="res://world/door/block_door_path.tres" id="2_57k4a"]
+[ext_resource type="Shape2D" uid="uid://cxidkq2kfr583" path="res://world/door/door_shape.tres" id="4_fq60q"]
+[ext_resource type="Texture2D" uid="uid://dtec6qxbrg3ym" path="res://assets/world/door_wall.png" id="5_ut41x"]
+
+[node name="BlockDoor" type="Node2D" node_paths=PackedStringArray("path_follower")]
+texture_filter = 1
+script = ExtResource("1_tux7r")
+path_follower = NodePath("DoorOpenPath/PathFollower")
+
+[node name="DoorOpenPath" type="Path2D" parent="."]
+curve = ExtResource("2_57k4a")
+
+[node name="PathFollower" type="PathFollow2D" parent="DoorOpenPath"]
+
+[node name="RemoteTransform2D" type="RemoteTransform2D" parent="DoorOpenPath/PathFollower"]
+remote_path = NodePath("../../../DoorBody")
+
+[node name="DoorBody" type="AnimatableBody2D" parent="."]
+collision_mask = 0
+
+[node name="CollisionShape" type="CollisionShape2D" parent="DoorBody"]
+visible = false
+shape = ExtResource("4_fq60q")
+
+[node name="Sprite" type="Sprite2D" parent="DoorBody"]
+rotation = 1.5708
+texture = ExtResource("5_ut41x")
diff --git a/world/door/block_door_path.tres b/world/door/block_door_path.tres
new file mode 100644
index 0000000..d1e0e64
--- /dev/null
+++ b/world/door/block_door_path.tres
@@ -0,0 +1,7 @@
+[gd_resource type="Curve2D" format=3 uid="uid://jw0yvthht4bj"]
+
+[resource]
+_data = {
+"points": PackedVector2Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0)
+}
+point_count = 2
diff --git a/world/door/door.gd b/world/door/door.gd
new file mode 100644
index 0000000..bd5869f
--- /dev/null
+++ b/world/door/door.gd
@@ -0,0 +1,8 @@
+extends Area2D
+class_name Door
+
+var dir: Vector2i
+
+
+func _on_body_entered(_p: Player) -> void:
+ Events.emit_signal(&"change_level", dir)
diff --git a/world/door/door.tscn b/world/door/door.tscn
new file mode 100644
index 0000000..b33e2c1
--- /dev/null
+++ b/world/door/door.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=4 format=3 uid="uid://b6frlgjdtxsnb"]
+
+[ext_resource type="Script" path="res://world/door/door.gd" id="1_t5c8c"]
+[ext_resource type="Shape2D" uid="uid://cxidkq2kfr583" path="res://world/door/door_shape.tres" id="4_ty3l8"]
+[ext_resource type="Texture2D" uid="uid://ca243eorhvtp2" path="res://assets/world/door.png" id="4_weg0g"]
+
+[node name="door" type="Area2D"]
+texture_filter = 1
+collision_layer = 0
+collision_mask = 2
+script = ExtResource("1_t5c8c")
+
+[node name="CollisionShape" type="CollisionShape2D" parent="."]
+position = Vector2(16, 0)
+shape = ExtResource("4_ty3l8")
+
+[node name="Sprite" type="Sprite2D" parent="."]
+position = Vector2(10, 0)
+texture = ExtResource("4_weg0g")
+
+[connection signal="body_entered" from="." to="." method="_on_body_entered"]
diff --git a/world/door/door_shape.tres b/world/door/door_shape.tres
new file mode 100644
index 0000000..3415917
--- /dev/null
+++ b/world/door/door_shape.tres
@@ -0,0 +1,4 @@
+[gd_resource type="RectangleShape2D" format=3 uid="uid://cxidkq2kfr583"]
+
+[resource]
+size = Vector2(16, 32)
diff --git a/world/one_way_platform.gd b/world/one_way_platform.gd
new file mode 100644
index 0000000..eb69c2f
--- /dev/null
+++ b/world/one_way_platform.gd
@@ -0,0 +1,8 @@
+extends StaticBody2D
+class_name OneWayPlatform
+
+@onready @export var shape: CollisionShape2D
+
+func _input(event: InputEvent) -> void:
+ if event.is_action("down") and shape.disabled == not event.is_pressed():
+ shape.set_deferred("disabled", event.is_pressed())
diff --git a/world/one_way_platform.tscn b/world/one_way_platform.tscn
new file mode 100644
index 0000000..6ca8267
--- /dev/null
+++ b/world/one_way_platform.tscn
@@ -0,0 +1,20 @@
+[gd_scene load_steps=4 format=3 uid="uid://cbrnw5j2j8wax"]
+
+[ext_resource type="Texture2D" uid="uid://b0iehyccoav1r" path="res://assets/world/one_way_platform.png" id="1_3fm0l"]
+[ext_resource type="Script" path="res://world/one_way_platform.gd" id="1_3rdiq"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_x8my0"]
+size = Vector2(34, 3)
+
+[node name="one_way_platform" type="StaticBody2D" node_paths=PackedStringArray("shape")]
+texture_filter = 1
+script = ExtResource("1_3rdiq")
+shape = NodePath("CollisionShape")
+
+[node name="Sprite" type="Sprite2D" parent="."]
+texture = ExtResource("1_3fm0l")
+
+[node name="CollisionShape" type="CollisionShape2D" parent="."]
+position = Vector2(0, -1.5)
+shape = SubResource("RectangleShape2D_x8my0")
+one_way_collision = true
diff --git a/world/tiles.tres b/world/tiles.tres
new file mode 100644
index 0000000..65f5113
--- /dev/null
+++ b/world/tiles.tres
@@ -0,0 +1,530 @@
+[gd_resource type="TileSet" load_steps=6 format=3 uid="uid://dsw8frlrcnbi8"]
+
+[ext_resource type="Texture2D" uid="uid://bs3dt308ypttr" path="res://assets/world/tiles.png" id="1_6jxv4"]
+[ext_resource type="Texture2D" uid="uid://b0urvindbx57t" path="res://assets/world/slope.png" id="2_qk6e1"]
+
+[sub_resource type="TileMapPattern" id="TileMapPattern_hcn1t"]
+tile_data = PackedInt32Array(65536, 196609, 0, 65537, 262145, 0, 2, 196609, 0, 65538, 327681, 0)
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_rc3at"]
+resource_name = "tiles"
+texture = ExtResource("1_6jxv4")
+0:0/0 = 0
+0:0/0/terrain_set = 0
+0:0/0/terrain = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+0:0/0/terrains_peering_bit/right_side = 0
+0:0/0/terrains_peering_bit/bottom_right_corner = 0
+0:0/0/terrains_peering_bit/bottom_side = 0
+1:0/0 = 0
+1:0/0/terrain_set = 0
+1:0/0/terrain = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+1:0/0/terrains_peering_bit/right_side = 0
+1:0/0/terrains_peering_bit/bottom_right_corner = 0
+1:0/0/terrains_peering_bit/bottom_side = 0
+1:0/0/terrains_peering_bit/bottom_left_corner = 0
+1:0/0/terrains_peering_bit/left_side = 0
+2:0/0 = 0
+2:0/0/terrain_set = 0
+2:0/0/terrain = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+2:0/0/terrains_peering_bit/bottom_side = 0
+2:0/0/terrains_peering_bit/bottom_left_corner = 0
+2:0/0/terrains_peering_bit/left_side = 0
+3:0/0 = 0
+3:0/0/terrain_set = 0
+3:0/0/terrain = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+3:0/0/terrains_peering_bit/bottom_side = 0
+4:0/0 = 0
+4:0/0/terrain_set = 0
+4:0/0/terrain = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+4:0/0/terrains_peering_bit/right_side = 0
+4:0/0/terrains_peering_bit/bottom_side = 0
+5:0/0 = 0
+5:0/0/terrain_set = 0
+5:0/0/terrain = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+5:0/0/terrains_peering_bit/right_side = 0
+5:0/0/terrains_peering_bit/bottom_side = 0
+5:0/0/terrains_peering_bit/bottom_left_corner = 0
+5:0/0/terrains_peering_bit/left_side = 0
+6:0/0 = 0
+6:0/0/terrain_set = 0
+6:0/0/terrain = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+6:0/0/terrains_peering_bit/right_side = 0
+6:0/0/terrains_peering_bit/bottom_right_corner = 0
+6:0/0/terrains_peering_bit/bottom_side = 0
+6:0/0/terrains_peering_bit/left_side = 0
+7:0/0 = 0
+7:0/0/terrain_set = 0
+7:0/0/terrain = 0
+7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:0/0/physics_layer_0/angular_velocity = 0.0
+7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:0/0/terrains_peering_bit/bottom_side = 0
+7:0/0/terrains_peering_bit/left_side = 0
+8:0/0 = 0
+8:0/0/terrain_set = 0
+8:0/0/terrain = 0
+8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:0/0/physics_layer_0/angular_velocity = 0.0
+8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:0/0/terrains_peering_bit/right_side = 0
+8:0/0/terrains_peering_bit/bottom_side = 0
+8:0/0/terrains_peering_bit/left_side = 0
+9:0/0 = 0
+9:0/0/terrain_set = 0
+9:0/0/terrain = 0
+9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:0/0/physics_layer_0/angular_velocity = 0.0
+9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:0/0/terrains_peering_bit/right_side = 0
+9:0/0/terrains_peering_bit/bottom_right_corner = 0
+9:0/0/terrains_peering_bit/bottom_side = 0
+9:0/0/terrains_peering_bit/left_side = 0
+9:0/0/terrains_peering_bit/top_left_corner = 0
+9:0/0/terrains_peering_bit/top_side = 0
+0:1/0 = 0
+0:1/0/terrain_set = 0
+0:1/0/terrain = 0
+0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:1/0/physics_layer_0/angular_velocity = 0.0
+0:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+0:1/0/terrains_peering_bit/right_side = 0
+0:1/0/terrains_peering_bit/bottom_right_corner = 0
+0:1/0/terrains_peering_bit/bottom_side = 0
+0:1/0/terrains_peering_bit/top_side = 0
+0:1/0/terrains_peering_bit/top_right_corner = 0
+1:1/0 = 0
+1:1/0/terrain_set = 0
+1:1/0/terrain = 0
+1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:1/0/physics_layer_0/angular_velocity = 0.0
+1:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+1:1/0/terrains_peering_bit/right_side = 0
+1:1/0/terrains_peering_bit/bottom_right_corner = 0
+1:1/0/terrains_peering_bit/bottom_side = 0
+1:1/0/terrains_peering_bit/bottom_left_corner = 0
+1:1/0/terrains_peering_bit/left_side = 0
+1:1/0/terrains_peering_bit/top_left_corner = 0
+1:1/0/terrains_peering_bit/top_side = 0
+1:1/0/terrains_peering_bit/top_right_corner = 0
+2:1/0 = 0
+2:1/0/terrain_set = 0
+2:1/0/terrain = 0
+2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:1/0/physics_layer_0/angular_velocity = 0.0
+2:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+2:1/0/terrains_peering_bit/bottom_side = 0
+2:1/0/terrains_peering_bit/bottom_left_corner = 0
+2:1/0/terrains_peering_bit/left_side = 0
+2:1/0/terrains_peering_bit/top_left_corner = 0
+2:1/0/terrains_peering_bit/top_side = 0
+3:1/0 = 0
+3:1/0/terrain_set = 0
+3:1/0/terrain = 0
+3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:1/0/physics_layer_0/angular_velocity = 0.0
+3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+3:1/0/terrains_peering_bit/bottom_side = 0
+3:1/0/terrains_peering_bit/top_side = 0
+4:1/0 = 0
+4:1/0/terrain_set = 0
+4:1/0/terrain = 0
+4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:1/0/physics_layer_0/angular_velocity = 0.0
+4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+4:1/0/terrains_peering_bit/right_side = 0
+4:1/0/terrains_peering_bit/bottom_side = 0
+4:1/0/terrains_peering_bit/top_side = 0
+4:1/0/terrains_peering_bit/top_right_corner = 0
+5:1/0 = 0
+5:1/0/terrain_set = 0
+5:1/0/terrain = 0
+5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:1/0/physics_layer_0/angular_velocity = 0.0
+5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+5:1/0/terrains_peering_bit/right_side = 0
+5:1/0/terrains_peering_bit/bottom_side = 0
+5:1/0/terrains_peering_bit/bottom_left_corner = 0
+5:1/0/terrains_peering_bit/left_side = 0
+5:1/0/terrains_peering_bit/top_left_corner = 0
+5:1/0/terrains_peering_bit/top_side = 0
+5:1/0/terrains_peering_bit/top_right_corner = 0
+6:1/0 = 0
+6:1/0/terrain_set = 0
+6:1/0/terrain = 0
+6:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:1/0/physics_layer_0/angular_velocity = 0.0
+6:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+6:1/0/terrains_peering_bit/right_side = 0
+6:1/0/terrains_peering_bit/bottom_right_corner = 0
+6:1/0/terrains_peering_bit/bottom_side = 0
+6:1/0/terrains_peering_bit/left_side = 0
+6:1/0/terrains_peering_bit/top_left_corner = 0
+6:1/0/terrains_peering_bit/top_side = 0
+6:1/0/terrains_peering_bit/top_right_corner = 0
+7:1/0 = 0
+7:1/0/terrain_set = 0
+7:1/0/terrain = 0
+7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:1/0/physics_layer_0/angular_velocity = 0.0
+7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:1/0/terrains_peering_bit/bottom_side = 0
+7:1/0/terrains_peering_bit/left_side = 0
+7:1/0/terrains_peering_bit/top_left_corner = 0
+7:1/0/terrains_peering_bit/top_side = 0
+8:1/0 = 0
+8:1/0/terrain_set = 0
+8:1/0/terrain = 0
+8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:1/0/physics_layer_0/angular_velocity = 0.0
+8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:1/0/terrains_peering_bit/right_side = 0
+8:1/0/terrains_peering_bit/bottom_side = 0
+8:1/0/terrains_peering_bit/left_side = 0
+8:1/0/terrains_peering_bit/top_left_corner = 0
+8:1/0/terrains_peering_bit/top_side = 0
+8:1/0/terrains_peering_bit/top_right_corner = 0
+9:1/0 = 0
+9:1/0/terrain_set = 0
+9:1/0/terrain = 0
+9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:1/0/physics_layer_0/angular_velocity = 0.0
+9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:1/0/terrains_peering_bit/right_side = 0
+9:1/0/terrains_peering_bit/bottom_side = 0
+9:1/0/terrains_peering_bit/bottom_left_corner = 0
+9:1/0/terrains_peering_bit/left_side = 0
+9:1/0/terrains_peering_bit/top_side = 0
+9:1/0/terrains_peering_bit/top_right_corner = 0
+0:2/0 = 0
+0:2/0/terrain_set = 0
+0:2/0/terrain = 0
+0:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:2/0/physics_layer_0/angular_velocity = 0.0
+0:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+0:2/0/terrains_peering_bit/right_side = 0
+0:2/0/terrains_peering_bit/top_side = 0
+0:2/0/terrains_peering_bit/top_right_corner = 0
+1:2/0 = 0
+1:2/0/terrain_set = 0
+1:2/0/terrain = 0
+1:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:2/0/physics_layer_0/angular_velocity = 0.0
+1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+1:2/0/terrains_peering_bit/right_side = 0
+1:2/0/terrains_peering_bit/left_side = 0
+1:2/0/terrains_peering_bit/top_left_corner = 0
+1:2/0/terrains_peering_bit/top_side = 0
+1:2/0/terrains_peering_bit/top_right_corner = 0
+2:2/0 = 0
+2:2/0/terrain_set = 0
+2:2/0/terrain = 0
+2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:2/0/physics_layer_0/angular_velocity = 0.0
+2:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+2:2/0/terrains_peering_bit/left_side = 0
+2:2/0/terrains_peering_bit/top_left_corner = 0
+2:2/0/terrains_peering_bit/top_side = 0
+3:2/0 = 0
+3:2/0/terrain_set = 0
+3:2/0/terrain = 0
+3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:2/0/physics_layer_0/angular_velocity = 0.0
+3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+3:2/0/terrains_peering_bit/top_side = 0
+4:2/0 = 0
+4:2/0/terrain_set = 0
+4:2/0/terrain = 0
+4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:2/0/physics_layer_0/angular_velocity = 0.0
+4:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+4:2/0/terrains_peering_bit/right_side = 0
+4:2/0/terrains_peering_bit/bottom_right_corner = 0
+4:2/0/terrains_peering_bit/bottom_side = 0
+4:2/0/terrains_peering_bit/top_side = 0
+5:2/0 = 0
+5:2/0/terrain_set = 0
+5:2/0/terrain = 0
+5:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:2/0/physics_layer_0/angular_velocity = 0.0
+5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+5:2/0/terrains_peering_bit/right_side = 0
+5:2/0/terrains_peering_bit/bottom_right_corner = 0
+5:2/0/terrains_peering_bit/bottom_side = 0
+5:2/0/terrains_peering_bit/bottom_left_corner = 0
+5:2/0/terrains_peering_bit/left_side = 0
+5:2/0/terrains_peering_bit/top_left_corner = 0
+5:2/0/terrains_peering_bit/top_side = 0
+6:2/0 = 0
+6:2/0/terrain_set = 0
+6:2/0/terrain = 0
+6:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:2/0/physics_layer_0/angular_velocity = 0.0
+6:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+6:2/0/terrains_peering_bit/right_side = 0
+6:2/0/terrains_peering_bit/bottom_right_corner = 0
+6:2/0/terrains_peering_bit/bottom_side = 0
+6:2/0/terrains_peering_bit/bottom_left_corner = 0
+6:2/0/terrains_peering_bit/left_side = 0
+6:2/0/terrains_peering_bit/top_side = 0
+6:2/0/terrains_peering_bit/top_right_corner = 0
+7:2/0 = 0
+7:2/0/terrain_set = 0
+7:2/0/terrain = 0
+7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:2/0/physics_layer_0/angular_velocity = 0.0
+7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:2/0/terrains_peering_bit/bottom_side = 0
+7:2/0/terrains_peering_bit/bottom_left_corner = 0
+7:2/0/terrains_peering_bit/left_side = 0
+7:2/0/terrains_peering_bit/top_side = 0
+8:2/0 = 0
+8:2/0/terrain_set = 0
+8:2/0/terrain = 0
+8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:2/0/physics_layer_0/angular_velocity = 0.0
+8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:2/0/terrains_peering_bit/right_side = 0
+8:2/0/terrains_peering_bit/bottom_right_corner = 0
+8:2/0/terrains_peering_bit/bottom_side = 0
+8:2/0/terrains_peering_bit/bottom_left_corner = 0
+8:2/0/terrains_peering_bit/left_side = 0
+8:2/0/terrains_peering_bit/top_side = 0
+9:2/0 = 0
+9:2/0/terrain_set = 0
+9:2/0/terrain = 0
+9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:2/0/physics_layer_0/angular_velocity = 0.0
+9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:2/0/terrains_peering_bit/right_side = 0
+9:2/0/terrains_peering_bit/bottom_right_corner = 0
+9:2/0/terrains_peering_bit/bottom_side = 0
+9:2/0/terrains_peering_bit/left_side = 0
+9:2/0/terrains_peering_bit/top_side = 0
+10:2/0 = 0
+10:2/0/terrain_set = 0
+10:2/0/terrain = 0
+10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:2/0/physics_layer_0/angular_velocity = 0.0
+10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:2/0/terrains_peering_bit/right_side = 0
+10:2/0/terrains_peering_bit/bottom_side = 0
+10:2/0/terrains_peering_bit/bottom_left_corner = 0
+10:2/0/terrains_peering_bit/left_side = 0
+10:2/0/terrains_peering_bit/top_side = 0
+0:3/0 = 0
+0:3/0/terrain_set = 0
+0:3/0/terrain = 0
+0:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:3/0/physics_layer_0/angular_velocity = 0.0
+0:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+0:3/0/terrains_peering_bit/right_side = 0
+1:3/0 = 0
+1:3/0/terrain_set = 0
+1:3/0/terrain = 0
+1:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:3/0/physics_layer_0/angular_velocity = 0.0
+1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+1:3/0/terrains_peering_bit/right_side = 0
+1:3/0/terrains_peering_bit/left_side = 0
+2:3/0 = 0
+2:3/0/terrain_set = 0
+2:3/0/terrain = 0
+2:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:3/0/physics_layer_0/angular_velocity = 0.0
+2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+2:3/0/terrains_peering_bit/left_side = 0
+3:3/0 = 0
+3:3/0/terrain_set = 0
+3:3/0/terrain = 0
+3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:3/0/physics_layer_0/angular_velocity = 0.0
+3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+4:3/0 = 0
+4:3/0/terrain_set = 0
+4:3/0/terrain = 0
+4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:3/0/physics_layer_0/angular_velocity = 0.0
+4:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+4:3/0/terrains_peering_bit/right_side = 0
+4:3/0/terrains_peering_bit/top_side = 0
+5:3/0 = 0
+5:3/0/terrain_set = 0
+5:3/0/terrain = 0
+5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:3/0/physics_layer_0/angular_velocity = 0.0
+5:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+5:3/0/terrains_peering_bit/right_side = 0
+5:3/0/terrains_peering_bit/left_side = 0
+5:3/0/terrains_peering_bit/top_left_corner = 0
+5:3/0/terrains_peering_bit/top_side = 0
+6:3/0 = 0
+6:3/0/terrain_set = 0
+6:3/0/terrain = 0
+6:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:3/0/physics_layer_0/angular_velocity = 0.0
+6:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+6:3/0/terrains_peering_bit/right_side = 0
+6:3/0/terrains_peering_bit/left_side = 0
+6:3/0/terrains_peering_bit/top_side = 0
+6:3/0/terrains_peering_bit/top_right_corner = 0
+7:3/0 = 0
+7:3/0/terrain_set = 0
+7:3/0/terrain = 0
+7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:3/0/physics_layer_0/angular_velocity = 0.0
+7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:3/0/terrains_peering_bit/left_side = 0
+7:3/0/terrains_peering_bit/top_side = 0
+8:3/0 = 0
+8:3/0/terrain_set = 0
+8:3/0/terrain = 0
+8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:3/0/physics_layer_0/angular_velocity = 0.0
+8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:3/0/terrains_peering_bit/right_side = 0
+8:3/0/terrains_peering_bit/left_side = 0
+8:3/0/terrains_peering_bit/top_side = 0
+9:3/0 = 0
+9:3/0/terrain_set = 0
+9:3/0/terrain = 0
+9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+9:3/0/physics_layer_0/angular_velocity = 0.0
+9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+9:3/0/terrains_peering_bit/right_side = 0
+9:3/0/terrains_peering_bit/bottom_side = 0
+9:3/0/terrains_peering_bit/left_side = 0
+9:3/0/terrains_peering_bit/top_side = 0
+9:3/0/terrains_peering_bit/top_right_corner = 0
+10:3/0 = 0
+10:3/0/terrain_set = 0
+10:3/0/terrain = 0
+10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+10:3/0/physics_layer_0/angular_velocity = 0.0
+10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+10:3/0/terrains_peering_bit/right_side = 0
+10:3/0/terrains_peering_bit/bottom_side = 0
+10:3/0/terrains_peering_bit/left_side = 0
+10:3/0/terrains_peering_bit/top_left_corner = 0
+10:3/0/terrains_peering_bit/top_side = 0
+4:4/0 = 0
+4:4/0/terrain_set = 0
+4:4/0/terrain = 0
+4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:4/0/physics_layer_0/angular_velocity = 0.0
+4:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+4:4/0/terrains_peering_bit/right_side = 0
+4:4/0/terrains_peering_bit/bottom_side = 0
+4:4/0/terrains_peering_bit/top_side = 0
+5:4/0 = 0
+5:4/0/terrain_set = 0
+5:4/0/terrain = 0
+5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:4/0/physics_layer_0/angular_velocity = 0.0
+5:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+5:4/0/terrains_peering_bit/right_side = 0
+5:4/0/terrains_peering_bit/bottom_side = 0
+5:4/0/terrains_peering_bit/bottom_left_corner = 0
+5:4/0/terrains_peering_bit/left_side = 0
+5:4/0/terrains_peering_bit/top_left_corner = 0
+5:4/0/terrains_peering_bit/top_side = 0
+6:4/0 = 0
+6:4/0/terrain_set = 0
+6:4/0/terrain = 0
+6:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:4/0/physics_layer_0/angular_velocity = 0.0
+6:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+6:4/0/terrains_peering_bit/right_side = 0
+6:4/0/terrains_peering_bit/bottom_right_corner = 0
+6:4/0/terrains_peering_bit/bottom_side = 0
+6:4/0/terrains_peering_bit/left_side = 0
+6:4/0/terrains_peering_bit/top_side = 0
+6:4/0/terrains_peering_bit/top_right_corner = 0
+7:4/0 = 0
+7:4/0/terrain_set = 0
+7:4/0/terrain = 0
+7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+7:4/0/physics_layer_0/angular_velocity = 0.0
+7:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+7:4/0/terrains_peering_bit/bottom_side = 0
+7:4/0/terrains_peering_bit/left_side = 0
+7:4/0/terrains_peering_bit/top_side = 0
+8:4/0 = 0
+8:4/0/terrain_set = 0
+8:4/0/terrain = 0
+8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+8:4/0/physics_layer_0/angular_velocity = 0.0
+8:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+8:4/0/terrains_peering_bit/right_side = 0
+8:4/0/terrains_peering_bit/bottom_side = 0
+8:4/0/terrains_peering_bit/left_side = 0
+8:4/0/terrains_peering_bit/top_side = 0
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_teocq"]
+resource_name = "slopes"
+texture = ExtResource("2_qk6e1")
+0:0/0 = 0
+0:0/0/terrain_set = 0
+0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+0:0/0/physics_layer_0/angular_velocity = 0.0
+0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8)
+1:0/0 = 0
+1:0/0/terrain_set = 0
+1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+1:0/0/physics_layer_0/angular_velocity = 0.0
+1:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8, -8, -7, -7, -8)
+2:0/0 = 0
+2:0/0/terrain_set = 0
+2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+2:0/0/physics_layer_0/angular_velocity = 0.0
+2:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8, -8, -7, -7, -8)
+3:0/0 = 0
+3:0/0/terrain_set = 0
+3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+3:0/0/physics_layer_0/angular_velocity = 0.0
+3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, 0, 8, 8, -8, 8)
+4:0/0 = 0
+4:0/0/terrain_set = 0
+4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+4:0/0/physics_layer_0/angular_velocity = 0.0
+4:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8, -8, 0)
+5:0/0 = 0
+5:0/0/terrain_set = 0
+5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+5:0/0/physics_layer_0/angular_velocity = 0.0
+5:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+6:0/0 = 0
+6:0/0/terrain_set = 0
+6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
+6:0/0/physics_layer_0/angular_velocity = 0.0
+6:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
+
+[resource]
+physics_layer_0/collision_layer = 1
+physics_layer_0/collision_mask = 0
+terrain_set_0/mode = 0
+terrain_set_0/terrain_0/name = "ground"
+terrain_set_0/terrain_0/color = Color(0.207843, 0.129412, 0.0862745, 1)
+sources/0 = SubResource("TileSetAtlasSource_rc3at")
+sources/1 = SubResource("TileSetAtlasSource_teocq")
+pattern_0 = SubResource("TileMapPattern_hcn1t")