sokoban
sokoban
bendn 2022-08-12
parent d5efe19 · commit 066213d
-rw-r--r--(16)04B_30__.TTFbin0 -> 30728 bytes
-rw-r--r--.github/FUNDING.yml12
-rw-r--r--04B_19__.TTFbin0 -> 6632 bytes
-rw-r--r--Back.tscn12
-rw-r--r--Box.gd65
-rw-r--r--ButtonHoverStylebox.pngbin0 -> 94 bytes
-rw-r--r--ButtonHoverStylebox.png.import35
-rw-r--r--ButtonHoverStylebox.tres11
-rw-r--r--ButtonStylebox.pngbin0 -> 103 bytes
-rw-r--r--ButtonStylebox.png.import35
-rw-r--r--ButtonStylebox.tres11
-rw-r--r--Check.pngbin0 -> 215 bytes
-rw-r--r--Check.png.import35
-rw-r--r--Crate.tscn76
-rw-r--r--ExplosionEffect.tscn58
-rw-r--r--GameoverScreen.gd25
-rw-r--r--GameoverScreen.tscn72
-rw-r--r--HUD.tscn99
-rw-r--r--LICENSE21
-rw-r--r--Label.gd21
-rw-r--r--Label.tscn27
-rw-r--r--Level.gd304
-rw-r--r--Level.tscn197
-rw-r--r--Levels/1.sokolvl12
-rw-r--r--Levels/10.sokolvl21
-rw-r--r--Levels/11.sokolvl23
-rw-r--r--Levels/12.sokolvl18
-rw-r--r--Levels/13.sokolvl19
-rw-r--r--Levels/14.sokolvl16
-rw-r--r--Levels/15.sokolvl16
-rw-r--r--Levels/16.sokolvl20
-rw-r--r--Levels/17.sokolvl18
-rw-r--r--Levels/18.sokolvl19
-rw-r--r--Levels/19.sokolvl16
-rw-r--r--Levels/2.sokolvl14
-rw-r--r--Levels/20.sokolvl23
-rw-r--r--Levels/21.sokolvl23
-rw-r--r--Levels/22.sokolvl17
-rw-r--r--Levels/23.sokolvl23
-rw-r--r--Levels/24.sokolvl17
-rw-r--r--Levels/25.sokolvl22
-rw-r--r--Levels/26.sokolvl20
-rw-r--r--Levels/27.sokolvl18
-rw-r--r--Levels/28.sokolvl16
-rw-r--r--Levels/29.sokolvl20
-rw-r--r--Levels/3.sokolvl13
-rw-r--r--Levels/30.sokolvl14
-rw-r--r--Levels/31.sokolvl23
-rw-r--r--Levels/32.sokolvl15
-rw-r--r--Levels/33.sokolvl19
-rw-r--r--Levels/34.sokolvl18
-rw-r--r--Levels/35.sokolvl18
-rw-r--r--Levels/36.sokolvl19
-rw-r--r--Levels/37.sokolvl22
-rw-r--r--Levels/38.sokolvl18
-rw-r--r--Levels/39.sokolvl18
-rw-r--r--Levels/4.sokolvl13
-rw-r--r--Levels/40.sokolvl21
-rw-r--r--Levels/41.sokolvl14
-rw-r--r--Levels/42.sokolvl18
-rw-r--r--Levels/43.sokolvl21
-rw-r--r--Levels/44.sokolvl19
-rw-r--r--Levels/45.sokolvl22
-rw-r--r--Levels/46.sokolvl14
-rw-r--r--Levels/47.sokolvl20
-rw-r--r--Levels/48.sokolvl18
-rw-r--r--Levels/49.sokolvl18
-rw-r--r--Levels/5.sokolvl16
-rw-r--r--Levels/50.sokolvl19
-rw-r--r--Levels/51.sokolvl19
-rw-r--r--Levels/52.sokolvl17
-rw-r--r--Levels/53.sokolvl17
-rw-r--r--Levels/54.sokolvl22
-rw-r--r--Levels/55.sokolvl23
-rw-r--r--Levels/56.sokolvl18
-rw-r--r--Levels/57.sokolvl19
-rw-r--r--Levels/58.sokolvl14
-rw-r--r--Levels/59.sokolvl23
-rw-r--r--Levels/6.sokolvl16
-rw-r--r--Levels/60.sokolvl23
-rw-r--r--Levels/7.sokolvl14
-rw-r--r--Levels/8.sokolvl15
-rw-r--r--Levels/9.sokolvl20
-rw-r--r--Levels/levels.py52
-rw-r--r--LoadingScreen.gd77
-rw-r--r--LoadingScreen.tscn333
-rw-r--r--MainInstances.gd5
-rw-r--r--MobileInputs.tscn56
-rw-r--r--Music.gd82
-rw-r--r--Music.tscn21
-rw-r--r--Others.tscn363
-rw-r--r--Pause.tscn106
-rw-r--r--PauseMenu.gd35
-rw-r--r--PauseMenu.tscn87
-rw-r--r--Player.gd159
-rw-r--r--Player.tscn312
-rw-r--r--PlayerSprite.gd35
-rw-r--r--PlayerWalk.tscn59
-rw-r--r--README.md38
-rw-r--r--Save_Load.gd41
-rw-r--r--Settings.gd122
-rw-r--r--SettingsMenu.tscn114
-rw-r--r--SoundFX.gd30
-rw-r--r--SoundFX.tscn17
-rw-r--r--StartScreen.gd50
-rw-r--r--StartScreen.tscn141
-rw-r--r--StopWatch.gd39
-rw-r--r--Target.gd28
-rw-r--r--Target.pngbin0 -> 132 bytes
-rw-r--r--Target.png.import35
-rw-r--r--Target.tscn88
-rw-r--r--Utils.gd55
-rw-r--r--WinScreen.gd21
-rw-r--r--WinScreen.tscn71
-rw-r--r--World.gd136
-rw-r--r--World.tscn29
-rw-r--r--arrow.pngbin0 -> 133 bytes
-rw-r--r--arrow.png.import35
-rw-r--r--box.pngbin0 -> 283 bytes
-rw-r--r--box.png.import35
-rw-r--r--box_normal.pngbin0 -> 284 bytes
-rw-r--r--box_normal.png.import35
-rw-r--r--checked_box.pngbin0 -> 155 bytes
-rw-r--r--checked_box.png.import35
-rw-r--r--circle.pngbin0 -> 182 bytes
-rw-r--r--circle.png.import35
-rw-r--r--clean_import.py63
-rw-r--r--console.gd32
-rw-r--r--console.tscn29
-rw-r--r--cube_normal.pngbin0 -> 590 bytes
-rw-r--r--cube_normal.png.import35
-rw-r--r--cuberot.pngbin0 -> 493 bytes
-rw-r--r--cuberot.png.import35
-rw-r--r--decoration.pngbin0 -> 2128 bytes
-rw-r--r--decoration.png.import35
-rw-r--r--default_env.tres7
-rw-r--r--explode.pngbin0 -> 498 bytes
-rw-r--r--explode.png.import35
-rw-r--r--export_presets.cfg2
-rw-r--r--focus_box.tres15
-rw-r--r--focused.pngbin0 -> 126 bytes
-rw-r--r--focused.png.import35
-rw-r--r--font.tres7
-rw-r--r--gameover.wavbin0 -> 418360 bytes
-rw-r--r--gameover.wav.import21
-rw-r--r--globalsettings.gd8
-rw-r--r--icon.icobin0 -> 136435 bytes
-rw-r--r--icon.pngbin0 -> 591 bytes
-rw-r--r--icon.png.import35
-rw-r--r--light.pngbin0 -> 159897 bytes
-rw-r--r--light.png.import35
-rw-r--r--light2.pngbin0 -> 130161 bytes
-rw-r--r--light2.png.import35
-rw-r--r--lite_music.wavbin0 -> 26606524 bytes
-rw-r--r--lite_music.wav.import21
-rw-r--r--motion_box.wavbin0 -> 15148 bytes
-rw-r--r--motion_box.wav.import21
-rw-r--r--pause.pngbin0 -> 115 bytes
-rw-r--r--pause.png.import35
-rw-r--r--project.godot167
-rw-r--r--settings.pngbin0 -> 205 bytes
-rw-r--r--settings.png.import35
-rw-r--r--settingshover.pngbin0 -> 187 bytes
-rw-r--r--settingshover.png.import35
-rw-r--r--smallfont.tres7
-rw-r--r--sokobanner.pngbin0 -> 470 bytes
-rw-r--r--sokobanner.png.import35
-rw-r--r--sound.wavbin0 -> 5676480 bytes
-rw-r--r--sound.wav.import21
-rw-r--r--spot.pngbin0 -> 1795 bytes
-rw-r--r--spot.png.import35
-rw-r--r--swayshader.tres58
-rw-r--r--theme.tres71
-rw-r--r--tilemap.pngbin0 -> 1244 bytes
-rw-r--r--tilemap.png.import35
-rw-r--r--tilemap.tres490
-rw-r--r--tilemap_normal.pngbin0 -> 1960 bytes
-rw-r--r--tilemap_normal.png.import35
-rw-r--r--tileset.pngbin0 -> 620 bytes
-rw-r--r--tileset.png.import35
-rw-r--r--transparency.pngbin0 -> 81 bytes
-rw-r--r--transparency.png.import35
-rw-r--r--tree.pngbin0 -> 527 bytes
-rw-r--r--tree.png.import35
-rw-r--r--unchecked_box.pngbin0 -> 155 bytes
-rw-r--r--unchecked_box.png.import35
-rw-r--r--victory.wavbin0 -> 1852934 bytes
-rw-r--r--victory.wav.import21
-rw-r--r--walk.wavbin0 -> 54900 bytes
-rw-r--r--walk.wav.import21
-rw-r--r--wall.pngbin0 -> 213 bytes
-rw-r--r--wall.png.import35
192 files changed, 6945 insertions, 66 deletions
diff --git a/(16)04B_30__.TTF b/(16)04B_30__.TTF
new file mode 100644
index 0000000..9c2323b
--- /dev/null
+++ b/(16)04B_30__.TTF
Binary files differ
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..16fe0d4
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: bendn
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/04B_19__.TTF b/04B_19__.TTF
new file mode 100644
index 0000000..6338c19
--- /dev/null
+++ b/04B_19__.TTF
Binary files differ
diff --git a/Back.tscn b/Back.tscn
new file mode 100644
index 0000000..3622d69
--- /dev/null
+++ b/Back.tscn
@@ -0,0 +1,12 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://theme.tres" type="Theme" id=1]
+
+[node name="Back" type="ColorRect"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+theme = ExtResource( 1 )
+color = Color( 0.333333, 0.490196, 0.333333, 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/Box.gd b/Box.gd
new file mode 100644
index 0000000..0a4957b
--- /dev/null
+++ b/Box.gd
@@ -0,0 +1,65 @@
+extends Node2D
+
+var main
+var target_count = 0
+var game_over = false
+
+signal target_updated
+signal game_over_detected
+
+
+func push(offset: Vector2) -> bool:
+ $RayCast.cast_to = offset
+ $RayCast.force_raycast_update()
+
+ if $RayCast.is_colliding():
+ return false
+
+ $Tween.interpolate_property(
+ self,
+ "position",
+ self.position,
+ self.position + offset,
+ 0.35,
+ Tween.TRANS_LINEAR,
+ Tween.EASE_IN_OUT
+ )
+ $Tween.start()
+ SoundFx.play("motion_box", -17, rand_range(.5, 1))
+ return true
+
+
+func _is_stuck_in_a_corner() -> bool:
+ var left_or_right_blocked = (
+ $WallChecks/LR/Left.is_colliding()
+ or $WallChecks/LR/Right.is_colliding()
+ )
+ var up_or_down_blocked = $WallChecks/DU/Up.is_colliding() or $WallChecks/DU/Down.is_colliding()
+
+ return left_or_right_blocked and up_or_down_blocked
+
+
+func entered_target(_target):
+ target_count += 1
+ _update_check_mark()
+ emit_signal("target_updated")
+
+
+func left_target(_target):
+ target_count -= 1
+ _update_check_mark()
+ emit_signal("target_updated")
+
+
+func _update_check_mark():
+ $CheckSprite.visible = target_count > 0
+
+
+func check_over():
+ yield(get_tree().create_timer(0.2), "timeout")
+ if target_count == 0 and not main.game_over and _is_stuck_in_a_corner():
+ emit_signal("game_over_detected")
+
+
+func _on_Tween_tween_all_completed():
+ check_over()
diff --git a/ButtonHoverStylebox.png b/ButtonHoverStylebox.png
new file mode 100644
index 0000000..5ef08bc
--- /dev/null
+++ b/ButtonHoverStylebox.png
Binary files differ
diff --git a/ButtonHoverStylebox.png.import b/ButtonHoverStylebox.png.import
new file mode 100644
index 0000000..a5f8455
--- /dev/null
+++ b/ButtonHoverStylebox.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/ButtonHoverStylebox.png-3ec7162d68e6c0071f8ea095e3dcb14c.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ButtonHoverStylebox.png"
+dest_files=[ "res://.import/ButtonHoverStylebox.png-3ec7162d68e6c0071f8ea095e3dcb14c.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/ButtonHoverStylebox.tres b/ButtonHoverStylebox.tres
new file mode 100644
index 0000000..e7d244b
--- /dev/null
+++ b/ButtonHoverStylebox.tres
@@ -0,0 +1,11 @@
+[gd_resource type="StyleBoxTexture" load_steps=2 format=2]
+
+[ext_resource path="res://ButtonHoverStylebox.png" type="Texture" id=1]
+
+[resource]
+texture = ExtResource( 1 )
+region_rect = Rect2( 0, 0, 6, 6 )
+margin_left = 2.0
+margin_right = 2.0
+margin_top = 2.0
+margin_bottom = 2.0
diff --git a/ButtonStylebox.png b/ButtonStylebox.png
new file mode 100644
index 0000000..bd9e409
--- /dev/null
+++ b/ButtonStylebox.png
Binary files differ
diff --git a/ButtonStylebox.png.import b/ButtonStylebox.png.import
new file mode 100644
index 0000000..b33b5bf
--- /dev/null
+++ b/ButtonStylebox.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/ButtonStylebox.png-d06ae3d69719dbddb35ca9cdb48963f9.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://ButtonStylebox.png"
+dest_files=[ "res://.import/ButtonStylebox.png-d06ae3d69719dbddb35ca9cdb48963f9.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/ButtonStylebox.tres b/ButtonStylebox.tres
new file mode 100644
index 0000000..2f75e2e
--- /dev/null
+++ b/ButtonStylebox.tres
@@ -0,0 +1,11 @@
+[gd_resource type="StyleBoxTexture" load_steps=2 format=2]
+
+[ext_resource path="res://ButtonStylebox.png" type="Texture" id=1]
+
+[resource]
+texture = ExtResource( 1 )
+region_rect = Rect2( 0, 0, 6, 6 )
+margin_left = 2.0
+margin_right = 2.0
+margin_top = 2.0
+margin_bottom = 2.0
diff --git a/Check.png b/Check.png
new file mode 100644
index 0000000..5180d39
--- /dev/null
+++ b/Check.png
Binary files differ
diff --git a/Check.png.import b/Check.png.import
new file mode 100644
index 0000000..7abf11c
--- /dev/null
+++ b/Check.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Check.png-e6d621bff9435dcfb300e0bec422577a.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Check.png"
+dest_files=[ "res://.import/Check.png-e6d621bff9435dcfb300e0bec422577a.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/Crate.tscn b/Crate.tscn
new file mode 100644
index 0000000..077fc88
--- /dev/null
+++ b/Crate.tscn
@@ -0,0 +1,76 @@
+[gd_scene load_steps=7 format=2]
+
+[ext_resource path="res://box.png" type="Texture" id=1]
+[ext_resource path="res://Box.gd" type="Script" id=2]
+[ext_resource path="res://Check.png" type="Texture" id=3]
+[ext_resource path="res://box_normal.png" type="Texture" id=4]
+
+[sub_resource type="RectangleShape2D" id=1]
+extents = Vector2( 8.5, 8.5 )
+
+[sub_resource type="OccluderPolygon2D" id=2]
+polygon = PoolVector2Array( 0, 0, 0, 16, 16, 16, 16, 0 )
+
+[node name="Crate" type="KinematicBody2D" groups=["crates"]]
+script = ExtResource( 2 )
+
+[node name="Crate" type="Sprite" parent="."]
+light_mask = 3
+texture = ExtResource( 1 )
+normal_map = ExtResource( 4 )
+centered = false
+
+[node name="CheckSprite" type="Sprite" parent="."]
+visible = false
+light_mask = 0
+position = Vector2( 8, 8 )
+texture = ExtResource( 3 )
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+visible = false
+light_mask = 0
+position = Vector2( 8, 8 )
+shape = SubResource( 1 )
+
+[node name="RayCast" type="RayCast2D" parent="."]
+visible = false
+position = Vector2( 8, 8 )
+
+[node name="Tween" type="Tween" parent="."]
+
+[node name="LightOccluder2D" type="LightOccluder2D" parent="."]
+visible = false
+occluder = SubResource( 2 )
+
+[node name="WallChecks" type="Node2D" parent="."]
+visible = false
+
+[node name="LR" type="Node2D" parent="WallChecks"]
+
+[node name="Left" type="RayCast2D" parent="WallChecks/LR"]
+position = Vector2( 8, 8 )
+enabled = true
+cast_to = Vector2( -10, 0 )
+collision_mask = 2
+
+[node name="Right" type="RayCast2D" parent="WallChecks/LR"]
+position = Vector2( 8, 8 )
+enabled = true
+cast_to = Vector2( 10, 0 )
+collision_mask = 2
+
+[node name="DU" type="Node2D" parent="WallChecks"]
+
+[node name="Down" type="RayCast2D" parent="WallChecks/DU"]
+position = Vector2( 8, 8 )
+enabled = true
+cast_to = Vector2( 0, 10 )
+collision_mask = 2
+
+[node name="Up" type="RayCast2D" parent="WallChecks/DU"]
+position = Vector2( 8, 8 )
+enabled = true
+cast_to = Vector2( 0, -10 )
+collision_mask = 2
+
+[connection signal="tween_all_completed" from="Tween" to="." method="_on_Tween_tween_all_completed"]
diff --git a/ExplosionEffect.tscn b/ExplosionEffect.tscn
new file mode 100644
index 0000000..c2c54c4
--- /dev/null
+++ b/ExplosionEffect.tscn
@@ -0,0 +1,58 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://explode.png" type="Texture" id=1]
+
+[sub_resource type="Animation" id=1]
+resource_name = "Animate"
+length = 0.9
+tracks/0/type = "value"
+tracks/0/path = NodePath(".:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8 ),
+"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1 ),
+"update": 1,
+"values": [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]
+}
+tracks/1/type = "method"
+tracks/1/path = NodePath(".")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0.9 ),
+"transitions": PoolRealArray( 1 ),
+"values": [ {
+"args": [ ],
+"method": "queue_free"
+} ]
+}
+
+[sub_resource type="Animation" id=2]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath(".:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ 1 ]
+}
+
+[node name="ExplosionEffect" type="Sprite"]
+texture = ExtResource( 1 )
+hframes = 9
+frame = 1
+
+[node name="AnimatedSprite" type="AnimationPlayer" parent="."]
+autoplay = "Animate"
+anims/Animate = SubResource( 1 )
+anims/RESET = SubResource( 2 )
diff --git a/GameoverScreen.gd b/GameoverScreen.gd
new file mode 100644
index 0000000..9c83b09
--- /dev/null
+++ b/GameoverScreen.gd
@@ -0,0 +1,25 @@
+extends CanvasLayer
+
+var player: KinematicBody2D
+var shown = false
+
+
+func _ready():
+ $Container.hide()
+
+
+func _show(integer):
+ shown = true
+ $Container/AnimationPlayer.play("Animate")
+ $Container.visible = true
+ $Container/Label._dialogue("LEVEL %s FAILED PRESS enter TO RETRY!" % integer)
+ SoundFx.play("defeat")
+
+
+func hide(backwards = true):
+ if backwards:
+ $Container/Label._erase()
+ $Container/AnimationPlayer.play_backwards("Animate")
+ yield($Container/AnimationPlayer, "animation_finished")
+ shown = false
+ $Container.hide()
diff --git a/GameoverScreen.tscn b/GameoverScreen.tscn
new file mode 100644
index 0000000..eca8102
--- /dev/null
+++ b/GameoverScreen.tscn
@@ -0,0 +1,72 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://Label.tscn" type="PackedScene" id=1]
+[ext_resource path="res://GameoverScreen.gd" type="Script" id=3]
+
+[sub_resource type="Animation" id=1]
+resource_name = "Animate"
+length = 2.0
+tracks/0/type = "value"
+tracks/0/path = NodePath("Panel:color")
+tracks/0/interp = 2
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 2 ),
+"transitions": PoolRealArray( -2, -2 ),
+"update": 0,
+"values": [ Color( 0, 0, 0, 0 ), Color( 0, 0, 0, 0.784314 ) ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Label:rect_scale")
+tracks/1/interp = 2
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 2 ),
+"transitions": PoolRealArray( -2, -2 ),
+"update": 0,
+"values": [ Vector2( 1e-05, 1e-05 ), Vector2( 1, 1 ) ]
+}
+
+[sub_resource type="Animation" id=2]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath("Panel:color")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ Color( 0, 0, 0, 0 ) ]
+}
+
+[node name="GameoverScreen" type="CanvasLayer"]
+script = ExtResource( 3 )
+
+[node name="Container" type="Control" parent="."]
+visible = false
+anchor_right = 1.0
+anchor_bottom = 1.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Panel" type="ColorRect" parent="Container"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+color = Color( 0, 0, 0, 0 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="Container"]
+anims/Animate = SubResource( 1 )
+anims/RESET = SubResource( 2 )
+
+[node name="Label" parent="Container" instance=ExtResource( 1 )]
diff --git a/HUD.tscn b/HUD.tscn
new file mode 100644
index 0000000..b55341b
--- /dev/null
+++ b/HUD.tscn
@@ -0,0 +1,99 @@
+[gd_scene load_steps=7 format=2]
+
+[ext_resource path="res://04B_19__.TTF" type="DynamicFontData" id=2]
+[ext_resource path="res://StopWatch.gd" type="Script" id=3]
+[ext_resource path="res://theme.tres" type="Theme" id=4]
+
+[sub_resource type="DynamicFont" id=2]
+size = 9
+font_data = ExtResource( 2 )
+
+[sub_resource type="DynamicFont" id=3]
+size = 9
+font_data = ExtResource( 2 )
+
+[sub_resource type="DynamicFont" id=1]
+size = 38
+outline_size = 1
+outline_color = Color( 0, 0, 0, 1 )
+font_data = ExtResource( 2 )
+
+[node name="HUD" type="Control"]
+pause_mode = 2
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+theme = ExtResource( 4 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="MovesLabel" type="Label" parent="."]
+anchor_left = 1.0
+anchor_right = 1.0
+margin_left = -104.0
+margin_top = 8.0
+margin_right = -8.0
+margin_bottom = 28.0
+text = "Moves: 0"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Hint" type="Label" parent="."]
+visible = false
+anchor_top = 1.0
+anchor_bottom = 1.0
+margin_left = 8.0
+margin_top = -24.0
+margin_right = 170.0
+margin_bottom = -8.0
+custom_fonts/font = SubResource( 2 )
+text = "press q to screenshot"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Hint2" type="Label" parent="."]
+visible = false
+anchor_top = 1.0
+anchor_bottom = 1.0
+margin_left = 8.0
+margin_top = -48.0
+margin_right = 170.0
+margin_bottom = -25.0
+custom_fonts/font = SubResource( 3 )
+text = "esc to restart
+tab to pause"
+valign = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LevelLabel" type="Label" parent="."]
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = -176.0
+margin_top = -48.0
+margin_right = -24.0
+margin_bottom = -9.0
+custom_fonts/font = SubResource( 1 )
+text = "Level = "
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="StopWatch" type="Label" parent="."]
+pause_mode = 1
+visible = false
+margin_left = 8.0
+margin_top = 8.0
+margin_right = 116.0
+margin_bottom = 36.0
+text = "1:0:2"
+script = ExtResource( 3 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..9a9763e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 bendn
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Label.gd b/Label.gd
new file mode 100644
index 0000000..c288b00
--- /dev/null
+++ b/Label.gd
@@ -0,0 +1,21 @@
+extends Label
+
+onready var Timer = $Timer
+
+
+func _ready():
+ Timer.set_wait_time(.1) # time between letters
+
+
+func _dialogue(string):
+ for letter in string:
+ Timer.start()
+ text += letter
+ yield(Timer, "timeout")
+
+
+func _erase():
+ for letter in text:
+ Timer.start()
+ text = text.substr(0, len(text) - 1)
+ yield(Timer, "timeout")
diff --git a/Label.tscn b/Label.tscn
new file mode 100644
index 0000000..1932293
--- /dev/null
+++ b/Label.tscn
@@ -0,0 +1,27 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://font.tres" type="DynamicFont" id=1]
+[ext_resource path="res://Label.gd" type="Script" id=2]
+
+[node name="Label" type="Label"]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -80.0
+margin_top = -8.0
+margin_right = 80.0
+margin_bottom = 40.0
+rect_scale = Vector2( 1e-05, 1e-05 )
+rect_pivot_offset = Vector2( 80, 8 )
+custom_colors/font_color = Color( 0.996078, 1, 0.6, 1 )
+custom_fonts/font = ExtResource( 1 )
+align = 1
+autowrap = true
+script = ExtResource( 2 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Timer" type="Timer" parent="."]
+wait_time = 0.1
diff --git a/Level.gd b/Level.gd
new file mode 100644
index 0000000..df597f8
--- /dev/null
+++ b/Level.gd
@@ -0,0 +1,304 @@
+extends Node2D
+
+const GRID_SIZE = 16
+const grassDecorationIds = [0, 1, 2, 3, 4, 5, 6, 7]
+const treeDecorationIds = [8, 9, 10, 11]
+const stoneDecorationIds = [12, 13, 14, 15, 16]
+const mushroomDecorationIds = [17, 18, 19, 20, 21, 22, 23, 24]
+var explosionEffect = preload("res://ExplosionEffect.tscn")
+
+var thread: Thread
+var wall_positions: PoolVector2Array = []
+var crate_prefab = preload("res://Crate.tscn")
+var target_prefab = preload("res://Target.tscn")
+
+var game_over := false
+
+onready var crates = $LevelContainer/Crates
+onready var player = $LevelContainer/Player
+onready var targets = $LevelContainer/Targets
+onready var walls = $LevelContainer/Walls
+onready var floors = $LevelContainer/Floors
+onready var timer = $Timer
+onready var others = $LevelContainer/Others
+onready var cam = $LevelContainer/Player/Camera2D
+var consol
+
+var current_level := ""
+onready var tilemaps = [walls, others, floors]
+var just_started = true
+
+var level_size = Vector2(0, 0)
+
+signal game_over
+signal level_completed(completed)
+signal level_reset
+signal level_made
+
+
+func _ready():
+ player.connect("level_reset_requested", self, "_on_Player_level_reset_requested")
+ thread = Thread.new()
+ reset_time()
+
+
+func reset_time():
+ MainInstances.stopwatch.reset()
+ player.started = false
+
+
+func start_stopwatch():
+ MainInstances.stopwatch.start()
+
+
+func load_level(level: String, decorate = true):
+ $LevelContainer/Walls.modulate = Color.white
+ $LevelContainer/Player/RayCast2D.set_collision_mask_bit(0, true)
+ if thread.is_alive():
+ return
+ if thread.is_active():
+ thread.wait_to_finish()
+ reset_time()
+ consol = MainInstances.console
+ if decorate:
+ consol.Log("Generating level " + level, .5, .5)
+ SaveLoad.files.level.data.current_level = level
+ SaveLoad.save("level")
+ thread.start(self, "level_load", [level, decorate])
+
+
+func level_load(level: Array):
+ just_started = true
+ player.set_moves(0)
+ current_level = level[0]
+ call_deferred("_reset_level", level[1])
+
+
+func _exit_tree():
+ if thread.is_active():
+ thread.wait_to_finish()
+
+
+func _reset_level(decorate):
+ game_over = false
+ player.initialize()
+ delete_children(crates)
+ if decorate:
+ walls.clear()
+ others.clear()
+ delete_children(floors)
+ delete_children(targets)
+
+ if current_level == "":
+ return
+
+ var file = File.new()
+ file.open("res://Levels/%s.sokolvl" % current_level, File.READ)
+
+ var version = 0
+ var row = 0
+ var player_pos
+ level_size = Vector2(0, 0)
+
+ while !file.eof_reached():
+ var line = file.get_line()
+ if line.begins_with(";"):
+ var meta = line.split(": ", false, 1)
+ if meta[0] == ";version":
+ version = int(meta[1])
+ elif line != "":
+ if version != 1:
+ push_error("Not supported .sokolvl version: " + str(version))
+ return
+ var col = 0
+
+ for x in line:
+ var tile_pos = Vector2(col, row) * GRID_SIZE
+
+ if x == "#":
+ if decorate:
+ add_wall(tile_pos)
+ if x in [".", "X", "O", "@", "%", "A"]:
+ if decorate:
+ add_floor(tile_pos)
+ if x in ["@", "A"]:
+ player_pos = tile_pos
+ if x in ["X", "%"]:
+ add_crate(tile_pos)
+ if x in ["O", "%", "A"]:
+ if decorate:
+ add_target(tile_pos)
+
+ col += 1
+ row += 1
+ level_size.y += 1
+ level_size.x = max(level_size.x, col)
+
+ file.close()
+
+ $CanvasLayer/HUD/LevelLabel.text = "Level = %s" % current_level
+
+ var new_zoom = .5
+ new_zoom = clamp(new_zoom, get_parent().min_zoom, get_parent().max_zoom)
+ new_zoom = Vector2(new_zoom, new_zoom)
+ var level_int
+ if level_size.x > level_size.y:
+ level_int = level_size.x
+ else:
+ level_int = level_size.y
+
+ new_zoom += Vector2(level_int / 45, level_int / 45)
+ $Tween.interpolate_property(
+ cam, "zoom", cam.zoom, new_zoom, 2, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
+ )
+ $Tween.start()
+ timer.start(2)
+ if decorate:
+ decorate(-50, 50)
+ initialize_player(player_pos)
+ Utils.unload_loading_screen()
+ yield(timer, "timeout")
+ just_started = false
+ emit_signal("level_made")
+ return
+
+
+static func delete_children(node):
+ for n in node.get_children():
+ node.remove_child(n)
+ n.queue_free()
+
+
+func decorate(x, y):
+ for tile in check_for_empty_tile(Vector2(x, y)):
+ match randi() % 101:
+ 1:
+ add_mushroom(tile)
+ 2:
+ add_rock(tile)
+ 3:
+ add_tree(tile)
+
+
+func _on_Crate_target_updated():
+ var crates_in_place = 0
+
+ for crate in crates.get_children():
+ if crate.target_count > 0:
+ crates_in_place += 1
+
+ if crates_in_place == crates.get_child_count():
+ emit_signal("level_completed")
+
+
+func _on_Player_level_reset_requested():
+ if player.tween.is_active():
+ yield(player.tween, "tween_all_completed")
+ load_level(current_level, false)
+ emit_signal("level_reset")
+
+
+func _on_Crate_game_over():
+ if not game_over:
+ game_over = true
+ emit_signal("game_over")
+
+
+func add_target(tile_pos):
+ var target = target_prefab.instance()
+ target.main = self
+ target.position = tile_pos
+ targets.add_child(target)
+
+
+func add_crate(tile_pos):
+ var crate = crate_prefab.instance()
+ crate.position = tile_pos
+ crate.main = get_parent()
+ crate.connect("target_updated", self, "_on_Crate_target_updated")
+ crate.connect("game_over_detected", self, "_on_Crate_game_over")
+ crates.add_child(crate)
+
+
+func initialize_player(tile_pos):
+ player.position = tile_pos
+ player.world = get_parent()
+
+
+func add_floor(tile_pos):
+ floors.set_cellv(tile_pos / 16, 0)
+ randomize()
+ if randi() % 5 == 2:
+ others.set_cellv(tile_pos / 16, grassDecorationIds[randi() % grassDecorationIds.size()])
+
+
+func add_wall(tile_pos):
+ wall_positions.append(tile_pos)
+ walls.set_cellv(tile_pos / 16, 1)
+ walls.update_bitmask_area(tile_pos / 16)
+
+
+func check_for_empty_tile(size: Vector2 = Vector2(-75, 75)):
+ var empty_tiles: PoolVector2Array = []
+ for x in range(size.x, size.y):
+ for y in range(size.x, size.y):
+ var tile_pos = Vector2(x, y)
+ var lower_tile_pos = tile_pos
+ var left_tile_pos = tile_pos
+ var right_tile_pos = tile_pos
+ var up_tile_pos = tile_pos
+ var down_right_tile_pos = tile_pos
+ var down_left_tile_pos = tile_pos
+ down_right_tile_pos += Vector2.DOWN + Vector2.RIGHT
+ down_left_tile_pos += Vector2.DOWN + Vector2.LEFT
+ lower_tile_pos += Vector2.DOWN
+ left_tile_pos += Vector2.LEFT
+ right_tile_pos += Vector2.RIGHT
+ up_tile_pos += Vector2.UP
+ var tile_positions = [
+ down_left_tile_pos,
+ down_right_tile_pos,
+ lower_tile_pos,
+ left_tile_pos,
+ right_tile_pos,
+ up_tile_pos,
+ tile_pos
+ ]
+ var count2 := 0
+ for tile in tile_positions:
+ var count := 0
+ for tilemap in tilemaps:
+ if empty(tilemap, tile):
+ count += 1
+ if count == tilemaps.size():
+ count2 += 1
+ if count2 == tile_positions.size():
+ empty_tiles.append(tile_pos)
+ return empty_tiles
+
+
+func empty(tilemap, tile) -> bool:
+ if tilemap.get_cellv(tile) != -1:
+ return false
+ return true
+
+
+func add_tree(tile):
+ others.set_cellv(tile, treeDecorationIds[randi() % treeDecorationIds.size()])
+
+
+func add_rock(tile):
+ others.set_cellv(tile, stoneDecorationIds[randi() % stoneDecorationIds.size()])
+
+
+func add_mushroom(tile):
+ others.set_cellv(tile, mushroomDecorationIds[randi() % mushroomDecorationIds.size()])
+
+
+func explode_walls():
+ for positions in wall_positions:
+ Utils.instance_scene_on_main(positions, explosionEffect)
+
+
+func _on_Player_won():
+ emit_signal("level_completed", true)
diff --git a/Level.tscn b/Level.tscn
new file mode 100644
index 0000000..702e479
--- /dev/null
+++ b/Level.tscn
@@ -0,0 +1,197 @@
+[gd_scene load_steps=12 format=2]
+
+[ext_resource path="res://Player.tscn" type="PackedScene" id=1]
+[ext_resource path="res://HUD.tscn" type="PackedScene" id=2]
+[ext_resource path="res://Level.gd" type="Script" id=3]
+[ext_resource path="res://tilemap.tres" type="TileSet" id=4]
+[ext_resource path="res://Back.tscn" type="PackedScene" id=5]
+[ext_resource path="res://Others.tscn" type="PackedScene" id=6]
+[ext_resource path="res://tilemap.png" type="Texture" id=8]
+
+[sub_resource type="TileSet" id=2]
+1/name = "tilemap.png 1"
+1/texture = ExtResource( 8 )
+1/tex_offset = Vector2( 0, 0 )
+1/modulate = Color( 1, 1, 1, 1 )
+1/region = Rect2( 16, 16, 16, 16 )
+1/tile_mode = 0
+1/occluder_offset = Vector2( 0, 0 )
+1/navigation_offset = Vector2( 0, 0 )
+1/shape_offset = Vector2( 0, 0 )
+1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+1/shape_one_way = false
+1/shape_one_way_margin = 0.0
+1/shapes = [ ]
+1/z_index = 0
+
+[sub_resource type="AnimationNodeStateMachinePlayback" id=5]
+
+[sub_resource type="Animation" id=3]
+resource_name = "Animate"
+tracks/0/type = "value"
+tracks/0/path = NodePath("Walls:modulate")
+tracks/0/interp = 2
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 1 ),
+"transitions": PoolRealArray( -2, -2 ),
+"update": 0,
+"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
+}
+tracks/1/type = "method"
+tracks/1/path = NodePath("..")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0.6 ),
+"transitions": PoolRealArray( 1 ),
+"values": [ {
+"args": [ ],
+"method": "explode_walls"
+} ]
+}
+tracks/2/type = "value"
+tracks/2/path = NodePath("Player/RayCast2D:collision_mask")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/keys = {
+"times": PoolRealArray( 0, 0.6 ),
+"transitions": PoolRealArray( 1, 1 ),
+"update": 1,
+"values": [ 1, 0 ]
+}
+tracks/3/type = "method"
+tracks/3/path = NodePath("Player")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/keys = {
+"times": PoolRealArray( 0.6 ),
+"transitions": PoolRealArray( 1 ),
+"values": [ {
+"args": [ ],
+"method": "_over"
+} ]
+}
+
+[sub_resource type="Animation" id=4]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath("Walls:modulate")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ Color( 1, 1, 1, 1 ) ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Player:collision_layer")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ 1 ]
+}
+tracks/2/type = "value"
+tracks/2/path = NodePath("Player:collision_mask")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ 1 ]
+}
+tracks/3/type = "value"
+tracks/3/path = NodePath("Player/RayCast2D:collision_mask")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ 1 ]
+}
+
+[node name="Level" type="Node2D"]
+script = ExtResource( 3 )
+
+[node name="LevelContainer" type="Control" parent="."]
+margin_left = -8.0
+margin_right = 336.0
+margin_bottom = 320.0
+mouse_filter = 2
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Back" parent="LevelContainer" instance=ExtResource( 5 )]
+margin_left = -992.0
+margin_top = -688.0
+margin_right = 1232.0
+margin_bottom = 1048.0
+
+[node name="Floors" type="TileMap" parent="LevelContainer"]
+tile_set = SubResource( 2 )
+cell_size = Vector2( 16, 16 )
+format = 1
+
+[node name="Others" parent="LevelContainer" instance=ExtResource( 6 )]
+tile_data = PoolIntArray( 196622, 15, 0 )
+
+[node name="Targets" type="Node2D" parent="LevelContainer"]
+
+[node name="Player" parent="LevelContainer" instance=ExtResource( 1 )]
+position = Vector2( 168, 80 )
+collision_layer = 1
+collision_mask = 1
+
+[node name="AnimationTree" parent="LevelContainer/Player" index="9"]
+parameters/playback = SubResource( 5 )
+
+[node name="Crates" type="Node2D" parent="LevelContainer"]
+
+[node name="Walls" type="TileMap" parent="LevelContainer"]
+tile_set = ExtResource( 4 )
+cell_size = Vector2( 16, 16 )
+collision_layer = 3
+collision_mask = 3
+format = 1
+tile_data = PoolIntArray( 458766, 1, 3, 524302, 1, 327687, 524303, 1, 196610 )
+
+[node name="LevelComplete" type="AnimationPlayer" parent="LevelContainer"]
+anims/Animate = SubResource( 3 )
+anims/RESET = SubResource( 4 )
+
+[node name="CanvasLayer" type="CanvasLayer" parent="."]
+
+[node name="HUD" parent="CanvasLayer" instance=ExtResource( 2 )]
+visible = false
+
+[node name="Timer" type="Timer" parent="."]
+one_shot = true
+
+[node name="Tween" type="Tween" parent="."]
+
+[connection signal="won" from="LevelContainer/Player" to="." method="_on_Player_won"]
+
+[editable path="LevelContainer/Player"]
diff --git a/Levels/1.sokolvl b/Levels/1.sokolvl
new file mode 100644
index 0000000..90acecc
--- /dev/null
+++ b/Levels/1.sokolvl
@@ -0,0 +1,12 @@
+;version: 1
+;name: 01
+
+ #####
+###...#
+#O@X..#
+###.XO#
+#O##X.#
+#.#.O.##
+#X.%XXO#
+#...O..#
+########
diff --git a/Levels/10.sokolvl b/Levels/10.sokolvl
new file mode 100644
index 0000000..9ea185b
--- /dev/null
+++ b/Levels/10.sokolvl
@@ -0,0 +1,21 @@
+;version: 1
+;name: 10
+
+ #######
+ #..OOO#
+ #####..OOO#
+ #......OOO#
+ #..##..OOO#
+ ##.##..OOO#
+ ###.########
+ #.XXX.##
+ #####..X.X.#####
+##...#X.X...#...#
+#@.X..X....X..X.#
+######.XX.X.#####
+ #.X....#
+ ####.###
+ #..#
+ #..#
+ #..#
+ ####
diff --git a/Levels/11.sokolvl b/Levels/11.sokolvl
new file mode 100644
index 0000000..333f91a
--- /dev/null
+++ b/Levels/11.sokolvl
@@ -0,0 +1,23 @@
+;version: 1
+;name: 11
+
+ ####
+ ######..#
+ #.......#
+ #..####.###
+ ### #####.###....#
+##@####...XXX.#....#
+#.XX...XX.X...#OOOO##
+#..XXX#....X..#OOOOO#
+#.X...#.XX.XX.#OOOOO#
+###...#..X....#OOOOO#
+ #...#.X.X.X.#OOOOO#
+ #.#######.###OOOOO#
+ #...#..X.X..#OOOOO#
+ ###.#.XX.X.X#######
+ #.#..X......#
+ #.#.XXX.XXX.#
+ #.#.......#.#
+ #.#########.#
+ #...........#
+ #############
diff --git a/Levels/12.sokolvl b/Levels/12.sokolvl
new file mode 100644
index 0000000..ec7bfd1
--- /dev/null
+++ b/Levels/12.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 12
+
+ ####
+ #### #..#
+ ###..###X.#
+ ##..X.XX##.##
+ #..#X##.....#
+ #.#.X.XX.#.###
+ #...X.#..#.X.#####
+####....#..XX.#...#
+####.##.X.........#
+#O....###..########
+#OO.OO# ####
+#OOO#O#
+#OOOOO#
+#######
diff --git a/Levels/13.sokolvl b/Levels/13.sokolvl
new file mode 100644
index 0000000..868770b
--- /dev/null
+++ b/Levels/13.sokolvl
@@ -0,0 +1,19 @@
+;version: 1
+;name: 13
+
+ #########
+ #%O%#%O%#
+ #O%O%O%O#
+ #%O%O%O%#
+ #O%O%O%O#
+ #%O%O%O%#
+ ###...###
+ #...#
+######.######
+#...........#
+#.X.X.X.X.X.#
+##.X.X.X.X.##
+ #X.X.X.X.X#
+ #...X@X...#
+ #..#####..#
+ #### ####
diff --git a/Levels/14.sokolvl b/Levels/14.sokolvl
new file mode 100644
index 0000000..f0d7bf3
--- /dev/null
+++ b/Levels/14.sokolvl
@@ -0,0 +1,16 @@
+;version: 1
+;name: 14
+
+ #########
+ ###...##..#####
+###......#..#...####
+#..XX.#X.#..#..OOO.#
+#.#..X#@X##.#.#O#O.#
+#..##.#X..#....OOO.#
+#.X#....X.#.#.#O#O.#
+#....##..##X.X.OOO.#
+#.X.##...#..#X#O#O.#
+##.XX..X...X..XOOO.#
+ #X..######....##..#
+ #...# ##########
+ #####
diff --git a/Levels/15.sokolvl b/Levels/15.sokolvl
new file mode 100644
index 0000000..ae82754
--- /dev/null
+++ b/Levels/15.sokolvl
@@ -0,0 +1,16 @@
+;version: 1
+;name: 15
+
+################
+#..............#
+#.#.######.....#
+#.#..X.X.X.X#..#
+#.#...X@X...##.##
+#.#.#X.X.X###OOO#
+#.#...X.X..##OOO#
+#.###XXX.X.##OOO#
+#.....#.##.##OOO#
+#####...##.##OOO#
+ #####.....###
+ #.....#
+ #######
diff --git a/Levels/16.sokolvl b/Levels/16.sokolvl
new file mode 100644
index 0000000..909cfe6
--- /dev/null
+++ b/Levels/16.sokolvl
@@ -0,0 +1,20 @@
+;version: 1
+;name: 16
+
+ ####
+ ####..#
+ ##..#..#
+ #..X.X.#
+ ###.#X...####
+ #..X..##X...#
+ #..#[email protected].#.X#
+ #..#......X.####
+ ##.####X##.....#
+ #.X#OOOOO#.#...#
+ #..XOOO%O.X#.###
+##..#OOOOO#...#
+#...###.#######
+#.XX..#..#
+#..#.....#
+######...#
+ #####
diff --git a/Levels/17.sokolvl b/Levels/17.sokolvl
new file mode 100644
index 0000000..931d8bb
--- /dev/null
+++ b/Levels/17.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 17
+
+#####
+#...##
+#....# ####
+#.X..####..#
+#..XX.X...X#
+###@.#X....##
+ #..##..X.X.##
+ #.X..##.##.O#
+ #..#X##X..#O#
+ ###...XOO##O#
+ #....#O%OOO#
+ #.XX.#OOOOO#
+ #..#########
+ #..#
+ ####
diff --git a/Levels/18.sokolvl b/Levels/18.sokolvl
new file mode 100644
index 0000000..a6aac2d
--- /dev/null
+++ b/Levels/18.sokolvl
@@ -0,0 +1,19 @@
+;version: 1
+;name: 18
+
+ #######
+ #######.....#
+ #.....#.X@X.#
+ #XX.#...#########
+ #.###OOOOOO##...#
+ #...XOOOOOO##.#.#
+ #.###OOOOOO.....#
+##...####.###.#X##
+#..#X...#..X..#.#
+#..X.XXX..#.X##.#
+#...X.X.###XX.#.#
+#####.....X...#.#
+ ###.###...#.#
+ #.....#...#
+ ########..#
+ ####
diff --git a/Levels/19.sokolvl b/Levels/19.sokolvl
new file mode 100644
index 0000000..35c8163
--- /dev/null
+++ b/Levels/19.sokolvl
@@ -0,0 +1,16 @@
+;version: 1
+;name: 19
+
+ ############
+ #..O..##...#
+ #.#O.....@.#
+ ######.##OOO#.####
+##..##OOO####.....####
+#.X.##OOO....X.#..X..#
+#.....OO.##.#.##.##..#
+####X###X#.X..#...#.##
+ ###..#....##X.XX.#.#
+ #...XX.#.#.X.#.X##.#
+ #..................#
+ #################..#
+ ####
diff --git a/Levels/2.sokolvl b/Levels/2.sokolvl
new file mode 100644
index 0000000..9cdeca2
--- /dev/null
+++ b/Levels/2.sokolvl
@@ -0,0 +1,14 @@
+;version: 1
+;name: 02
+
+ #####
+ #...#
+ #X..#
+ ###..X###
+ #..X..X.#
+###.#.###.# ######
+#...#.###.#######..OO#
+#.X..X.............OO#
+#####.####.#@####..OO#
+ #......### ######
+ ########
diff --git a/Levels/20.sokolvl b/Levels/20.sokolvl
new file mode 100644
index 0000000..60df746
--- /dev/null
+++ b/Levels/20.sokolvl
@@ -0,0 +1,23 @@
+;version: 1
+;name: 20
+
+ ######
+ #...@####
+ #####.X...#
+ #...##....####
+ #.X##..##....#
+ #...#..#####.#
+ #.#XX.X....#.#
+ #..X.X.###.#.#
+ #.#...X..#.#.#
+ #.#..#X#...#.#
+ ##.####...#.#.#
+ #..X..#####.#.# ####
+ ##....X.....X..###..####
+#####..###.X.X#.X.#...OOOOO#
+#.....##......#..##..#OOOOO#
+#.XXXX....######X##...#O##O#
+##....##..............#OOOO#
+ ##..###############...OOOO#
+ #..# #####..##
+ #### ####
diff --git a/Levels/21.sokolvl b/Levels/21.sokolvl
new file mode 100644
index 0000000..8d09253
--- /dev/null
+++ b/Levels/21.sokolvl
@@ -0,0 +1,23 @@
+;version: 1
+;name: 21
+
+ ############
+ #OOOOOOOOOO#
+ ###O#O#O#O#OO#
+ #...OOOOOOOOO#
+ #@.X.X.X.%O%O#
+ #######.#######
+ ####...#....##..#
+##....X.#....#.X.##
+#..#X#.###.###X...##
+#.X..X.X...#.X.X.X.#
+#..#.X.##.......#X.#
+#...X####X####X##..#
+####..##...#....#..#
+ #X.##...#.#.XX..#
+ #...#.X.#..X....#
+ ###.#.XX.#..X.###
+ #.#....#.X.##
+ #.########.#
+ #..........#
+ ############
diff --git a/Levels/22.sokolvl b/Levels/22.sokolvl
new file mode 100644
index 0000000..8e092ba
--- /dev/null
+++ b/Levels/22.sokolvl
@@ -0,0 +1,17 @@
+;version: 1
+;name: 22
+
+ ##########
+ #OO..#...#
+ #OO......#
+ #OO..#..####
+ #######..#..##
+ #............#
+ #..#..##..#..#
+####.##..####.##
+#..X..#####.#..#
+#.#.X..X..#.X..#
+####.##.#######
+ #....#
+ ######
diff --git a/Levels/23.sokolvl b/Levels/23.sokolvl
new file mode 100644
index 0000000..9efc772
--- /dev/null
+++ b/Levels/23.sokolvl
@@ -0,0 +1,23 @@
+;version: 1
+;name: 23
+
+ ####
+ ############..#####
+ #....#..#..X..#...##
+ #.X.X.X..X.#.X.X...#
+ ##X.X...#.@#.X...X.#
+###...############.##
+#..X.X#..#OOOOOO#.X#
+#.#...#..#OOOOOO##.#
+#..##.##.#.OOOOO#..#
+#.#......XOOOOOO.X.#
+#.#.X.##.#OOOOOO#..#
+#..X.X#..#OOOOOO#.X#
+#.X...#..##X#####..#
+#.X.X.####.X.X..X.X#
+##.#.....X.X.X.X...###
+ #..######.X....X....#
+ #.........#.#######.#
+ #######.#X..........#
+ #...###########
+ #####
diff --git a/Levels/24.sokolvl b/Levels/24.sokolvl
new file mode 100644
index 0000000..a73988c
--- /dev/null
+++ b/Levels/24.sokolvl
@@ -0,0 +1,17 @@
+;version: 1
+;name: 24
+
+ #######
+ #..#..####
+ #.X#X.#..##
+########..#..#...########
+#OOOO..#.X#X.#..X#..#...#
+#OOOO#.#.....#X..#......#
+#OO#O....X#..#.X....#X..#
+#OOO.@##..#X.#X..#..#...#
+#OOOO.##.X#.....X########
+########..#XX#X..#
+ #.X#..#..X#
+ #..#..#...#
+ ####..#####
+ ####
diff --git a/Levels/25.sokolvl b/Levels/25.sokolvl
new file mode 100644
index 0000000..aea578d
--- /dev/null
+++ b/Levels/25.sokolvl
@@ -0,0 +1,22 @@
+;version: 1
+;name: 25
+
+ ##########
+ #OOOOOOOO####
+ #O#O#OOOO#..#
+ #OOOOOOOOXX.#
+ #.....O###..####
+ #########..X.#...#
+ #.....X...X.X..X.#
+ #..#....#..X.X#..#
+ ##.#####...#..#..#
+ #.X.....#...####.#
+##..X#...#.##..#..#
+#....##X###....#..##
+#.X....X.#..#..#...#
+#####....#.##.#.##.##
+ #X#.#..X..X.X...#
+ #@#..X#XXX..#...#
+ ###..X......#####
+ ##..#..#..#
+ ##########
diff --git a/Levels/26.sokolvl b/Levels/26.sokolvl
new file mode 100644
index 0000000..534b0e1
--- /dev/null
+++ b/Levels/26.sokolvl
@@ -0,0 +1,20 @@
+;version: 1
+;name: 26
+
+ ####
+ ######..#####
+ #######.......#...#
+ #......X.X.##.#.#.#
+ #..####.X..#.....O#
+ #......X.#.#.##O#O#
+ ##X####X.X.X.##O#O#
+ #.....#....####O###
+ #.X...######..#O#O#
+######XXX##......@#O#O#
+#......#....#X#X###O.O#
+#.####.#XXXXX....#.OOO#
+#.#....X.....#...#.OOO#
+#.#...##.##.....###OOO#
+#.######X######..######
+#........# #..#
+########## ####
diff --git a/Levels/27.sokolvl b/Levels/27.sokolvl
new file mode 100644
index 0000000..a84c364
--- /dev/null
+++ b/Levels/27.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 27
+
+#########
+#.......#
+#.......####
+##.####.#..#
+##.#@##....#
+#.XXX.X..XX#
+#..#.##.X..#
+#..#.##..X.####
+####..XXX.X#..#
+ #...##...OOOO#
+ #.#...#.#OO.O#
+ #...#.#.##OOO#
+ #####.X..#OOO#
+ ##...#####
+ #####
diff --git a/Levels/28.sokolvl b/Levels/28.sokolvl
new file mode 100644
index 0000000..1e08ed4
--- /dev/null
+++ b/Levels/28.sokolvl
@@ -0,0 +1,16 @@
+;version: 1
+;name: 28
+
+ #################
+ #OOO...#....#...###
+##OOOOO..X##.#.#.X.#
+#OOOOOO#..X..#..X..#
+#OOOOOO#..#..#.#.#.##
+#########.X..X.#.#..###
+ #.....#X##X.##.##...#
+ ##...X....#.X..X...#.#
+ #..##.###.#..#####X#.#
+ #.X.XX.....X...X.....#
+ #.X....X##X.########.#
+ #######..@.## ###
+ ######
diff --git a/Levels/29.sokolvl b/Levels/29.sokolvl
new file mode 100644
index 0000000..b1f4b20
--- /dev/null
+++ b/Levels/29.sokolvl
@@ -0,0 +1,20 @@
+;version: 1
+;name: 29
+
+ #######
+ #@.#..#
+ #.X...#
+ ###.##.#
+ ####.X..#.##
+ #.......#..##
+ #.X.X####.X.#
+ #.XX.#..#..X#
+ #X..X...#X..#
+##..XX#...XX.##
+#.XX..#..#..X.#
+#.....####.X..#
+#..#X##OO##...#
+###.O#OOOO#####
+ #.OOOOOOO##
+ #OOOO...OO#
+ ###########
diff --git a/Levels/3.sokolvl b/Levels/3.sokolvl
new file mode 100644
index 0000000..859b3ea
--- /dev/null
+++ b/Levels/3.sokolvl
@@ -0,0 +1,13 @@
+;version: 1
+;name: 03
+
+############
+#OO..#.....###
+#OO..#.X..X..#
+#OO..#X####..#
+#OO....@.##..#
+#OO..#.#..X.##
+######.##X.X.#
+ #.X..X.X.X.#
+ #....#.....#
+ ############
diff --git a/Levels/30.sokolvl b/Levels/30.sokolvl
new file mode 100644
index 0000000..0f7538f
--- /dev/null
+++ b/Levels/30.sokolvl
@@ -0,0 +1,14 @@
+;version: 1
+;name: 30
+
+ #####
+ ###### ###...####
+ #####....###.X.X..X.#
+####..##.#X.X....X.#...#
+#OOOO...XX.X.X..X...#X##
+#OO.#.##.#...###X##.#..#
+#OOOO....#.###....#....#
+#OOOO....#.##..X..###X.#
+#OO######..X..#..####.##
+#### #...###....@..#
+ ###############
diff --git a/Levels/31.sokolvl b/Levels/31.sokolvl
new file mode 100644
index 0000000..d463d78
--- /dev/null
+++ b/Levels/31.sokolvl
@@ -0,0 +1,23 @@
+;version: 1
+;name: 31
+
+ #####
+ #...#######
+ #.X.###...#
+ #.X....XX.#
+ ##.####...#
+###.#..#.###
+#...#..#@##
+#.XX....X.#
+#...#.#.X.####
+#####.#...#..#
+ #...X####...#
+ #..X.....X..#
+ ##...#####.##
+ ##########..#
+##OOOO#.X..X.#
+#OOOOO#.XX#..#
+#OO.OO#.X..X.#
+#OOOOOX...#..#
+##..##########
+ ####
diff --git a/Levels/32.sokolvl b/Levels/32.sokolvl
new file mode 100644
index 0000000..49824c2
--- /dev/null
+++ b/Levels/32.sokolvl
@@ -0,0 +1,15 @@
+;version: 1
+;name: 32
+
+ #######
+ #..#..#####
+##..#..#OOO###
+#..X#..#OOO..#
+#.X.#XX.OOO..#
+#..X#..#OOO.O#
+#...#.X########
+##X.......X.X.#
+##..#..XX.#...#
+ ######..##XX@#
+ #......##
+ ########
diff --git a/Levels/33.sokolvl b/Levels/33.sokolvl
new file mode 100644
index 0000000..4328d01
--- /dev/null
+++ b/Levels/33.sokolvl
@@ -0,0 +1,19 @@
+;version: 1
+;name: 33
+
+ ####
+ #..#########
+ ##..##.@#...#
+ #..X#.X.X...####
+ #X..X..#.X.X#..##
+##..X##.#X.X.....#
+#..#..#.#...XXX..#
+#.X....X..X##.####
+#.X.X.#X#..#..#
+##..###..###X.#
+ #..#OOOO.....#
+ ####OOOOOO####
+ #OOOO####
+ #OOO##
+ #OOO#
+ #####
diff --git a/Levels/34.sokolvl b/Levels/34.sokolvl
new file mode 100644
index 0000000..b3663d0
--- /dev/null
+++ b/Levels/34.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 34
+
+ ####
+ #####..#
+ ##.....X#
+##.X..##.###
+#@X.X.#.X..#
+####.##...X#
+ #OOOO#X.X.#
+ #OOOO#...X#
+ #OOOO..XX.##
+ #OOO.#.X...#
+ ######X.X..#
+ #...###
+ #X.###
+ #..#
+ ####
diff --git a/Levels/35.sokolvl b/Levels/35.sokolvl
new file mode 100644
index 0000000..3a4307b
--- /dev/null
+++ b/Levels/35.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 35
+
+############
+##.....##..#
+##...X...X.#
+####.##.XX.#
+#...X.#....#
+#.XXX.#.####
+#...#.#.X.##
+#..#..#..X.#
+#.X#.X#....#
+#...OO#.####
+####OO.X.#@#
+#OOOOO#.X#.#
+##OOOO#..X.#
+###OO##....#
+############
diff --git a/Levels/36.sokolvl b/Levels/36.sokolvl
new file mode 100644
index 0000000..a0e5f3f
--- /dev/null
+++ b/Levels/36.sokolvl
@@ -0,0 +1,19 @@
+;version: 1
+;name: 36
+
+############ ######
+#...#....#@####OOOO#
+#...XX#.......OOOOO#
+#...#.###...##.OOOO#
+##.##.###..#...OOOO#
+ #.X.X.....#.##.####
+ #..X.X##..#.......#
+####.#..####.##.##.#
+#..#.#X...##.##....#
+#.X..X..#.##.#######
+#.#.X.X....#.#
+#..X.##.##.#.#
+#.XX.....XX..#
+##.##.###.X..#
+ #....# #....#
+ ###### ######
diff --git a/Levels/37.sokolvl b/Levels/37.sokolvl
new file mode 100644
index 0000000..8f14e87
--- /dev/null
+++ b/Levels/37.sokolvl
@@ -0,0 +1,22 @@
+;version: 1
+;name: 37
+
+ ####
+ ###..##
+####..X..#
+#...X.X..####
+#.X...#.X...# ####
+#..#..#...X.# #OO#
+##X#X.####X####OO#
+ #...#####.##.OOO#
+ #X#.##@##.##..OO#
+ #.#....X.....OOO#
+ #...####.###..OO#
+ ###.##.#..##.OOO#
+ ##X.####X.###OO#
+ #...##....# #OO#
+ ##.XX##..X.# ####
+ #.....XXXX.#
+ #.X.###....#
+ #...# ######
+ #####
diff --git a/Levels/38.sokolvl b/Levels/38.sokolvl
new file mode 100644
index 0000000..ad3d177
--- /dev/null
+++ b/Levels/38.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 38
+
+###########
+#OOOOOO...#########
+#OOOOOO...#..##...#
+#OO###.X....X.....#
+#OOO.X.X.#..###...#
+#OOO#X#####....#..#
+###....#...#X..#.X###
+ #..XX.X.X..X##..X.#
+ #..X...#X#..##....#
+ ###.##.#..X.#######
+ #..X.X.##.##
+ #....X..X..#
+ ##...#.#...#
+ #####@#####
+ ###
diff --git a/Levels/39.sokolvl b/Levels/39.sokolvl
new file mode 100644
index 0000000..1d73a29
--- /dev/null
+++ b/Levels/39.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 39
+
+ #########
+ #OOOO...##
+ #O#O#..X.##
+##OOOO#.#.@##
+#.OOOO#..#..##
+#.....#X.##X.#
+##.###..X....#
+ #X..X.X.X#..#
+ #.#..X.X.##.#
+ #..###..##..#
+ #....##.##.##
+ #..X.#..X..#
+ ###X.X...###
+ #..#####
+ ####
diff --git a/Levels/4.sokolvl b/Levels/4.sokolvl
new file mode 100644
index 0000000..4906f57
--- /dev/null
+++ b/Levels/4.sokolvl
@@ -0,0 +1,13 @@
+;version: 1
+;name: 04
+
+ ########
+ #.....@#
+ #.X#X.##
+ #.X..X#
+ ##X.X.#
+#########.X.#.###
+#OOOO..##.X..X..#
+##OOO....X..X...#
+#OOOO..##########
+########
diff --git a/Levels/40.sokolvl b/Levels/40.sokolvl
new file mode 100644
index 0000000..f91dfbe
--- /dev/null
+++ b/Levels/40.sokolvl
@@ -0,0 +1,21 @@
+;version: 1
+;name: 40
+
+ ###
+ ##O###
+ #OOOO#
+ #############OOOO#
+##...##.....##OOOO#####
+#..XX##..X.@##OOOO....#
+#......XX.X#..OOOO#...#
+#..X.##.XX.#.#OOOO#..##
+#..X.##.X..#.##.###..#
+##.#####.###.........#
+##...X..X.#####.###..#
+#.X###..#.#####.# ####
+#...X...#.......#
+#..X.#X.X.X###..#
+#.XXX#.X...# ####
+#....#..XX.#
+######...###
+ #####
diff --git a/Levels/41.sokolvl b/Levels/41.sokolvl
new file mode 100644
index 0000000..ff7301c
--- /dev/null
+++ b/Levels/41.sokolvl
@@ -0,0 +1,14 @@
+;version: 1
+;name: 41
+
+ ####
+#######.@#
+#.....X..#
+#...X##.X#
+##X#OOO#.#
+ #.XOOO..#
+ #.#O.O#.##
+ #...#.#X.#
+ #X..X....#
+ #..#######
+ ####
diff --git a/Levels/42.sokolvl b/Levels/42.sokolvl
new file mode 100644
index 0000000..86c9317
--- /dev/null
+++ b/Levels/42.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 42
+
+ #####
+ ##...##
+ ##.....#
+ ##..XX..#
+ ##.XX..X.#
+ #.X....X.#
+#### #...XX.#####
+#..########.##....#
+#OO...........XXX@#
+#O#.#######.##...##
+#O#.#######O.#X.X###
+#OOOOOOOOOOO.#...X.#
+##############..X..#
+ ##..###
+ ####
diff --git a/Levels/43.sokolvl b/Levels/43.sokolvl
new file mode 100644
index 0000000..65efd25
--- /dev/null
+++ b/Levels/43.sokolvl
@@ -0,0 +1,21 @@
+;version: 1
+;name: 43
+
+ ########
+ #@##...####
+ #.X...X...#
+ #..X.X.XXX#
+ #.XX#.#...#
+##X....X...#
+#..X..XXXXX##
+#.X####.#...#
+#..XOOOO#...#
+#.##OOOO#XX.#
+#.##OOOO...##
+#...OOOO#..#
+##.#OOOO#XX#
+ #.#OOOO#..#
+ #.........#
+ ####.##X###
+ #....#
+ ######
diff --git a/Levels/44.sokolvl b/Levels/44.sokolvl
new file mode 100644
index 0000000..447b92c
--- /dev/null
+++ b/Levels/44.sokolvl
@@ -0,0 +1,19 @@
+;version: 1
+;name: 44
+
+ ############
+ #..........##
+ #..#.#XX.X..#
+ #X.#X#..##.@#
+ ##.##.#.X.#.##
+ #...X.#X..#.#
+ #...#.X...#.#
+ ##.X.X...##.#
+ #..#..##..X.#
+ #....##.XX#.#
+######XX...#...#
+#OOOO#..########
+#O#OOO.##
+#OOOO...#
+#OOOO...#
+#########
diff --git a/Levels/45.sokolvl b/Levels/45.sokolvl
new file mode 100644
index 0000000..8196ccd
--- /dev/null
+++ b/Levels/45.sokolvl
@@ -0,0 +1,22 @@
+;version: 1
+;name: 45
+
+ ######
+ #####...#
+ #...#.#.#####
+ #.X.#..X....######
+ ##X..###.##.......#
+###..XX.X.X.#..##...#####
+#.......X...######.##...#
+#..########.#@...#.#..#.#
+##.###......####.#X#.#..#
+ #.###.####.##OO.#...X.##
+ #..X..X..#X##OO.#X##..##
+ #..#.#.#.....OO##.##.X.#
+ ####...#.##.#OO#....X..#
+ #####....#OO#.#.#..##
+ ######OO#...#.##
+ #OO#####..#
+ #OO.......#
+ ##..###..##
+ #########
diff --git a/Levels/46.sokolvl b/Levels/46.sokolvl
new file mode 100644
index 0000000..e662e7e
--- /dev/null
+++ b/Levels/46.sokolvl
@@ -0,0 +1,14 @@
+;version: 1
+;name: 46
+
+ #######
+ #####..#..####
+ #...#...X....#
+ ####.#XX.##.##..#
+##......#.#..##.###
+#..###.X#X..X..X..#
+#OOO....#.##..#...#
+#OOO#....@.#.###.##
+#OOO#..###..X..X..#
+######## ##...#...#
+ #########
diff --git a/Levels/47.sokolvl b/Levels/47.sokolvl
new file mode 100644
index 0000000..369ce7f
--- /dev/null
+++ b/Levels/47.sokolvl
@@ -0,0 +1,20 @@
+;version: 1
+;name: 47
+
+ ######### ####
+ #...##..####..#
+ #...X...#..X..#
+ #..#.##.#.....####
+ ##.X...X.XX#.#...#
+ ####..#..#.X.X...#
+#####..####....###OOO#
+#...#X.#..#.####OOOOO#
+#......#..#.#.##OOOOO#
+######.#..#X...###OOO#
+ #...##.#.X#...#OOO#
+ ##.......X..X#.#####
+ ##.XXX##..#.X...#
+ #...#..#.###..###
+ #...X..#X.@####
+ #####..#...#
+ ########
diff --git a/Levels/48.sokolvl b/Levels/48.sokolvl
new file mode 100644
index 0000000..cbf36f4
--- /dev/null
+++ b/Levels/48.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 48
+
+ #####
+ #...#
+ #.#.######
+ #......X@######
+ #.X.##X.###...#
+ #.####.X....X.#
+ #.#####.#..#X.####
+##..####.##X......#
+#..X#..X..#.##.##.#
+#.........#.#OOO#.#
+######..###..OOO..#
+ #### #.#OOO#.#
+ #.###.#.#
+ #.......#
+ #########
diff --git a/Levels/49.sokolvl b/Levels/49.sokolvl
new file mode 100644
index 0000000..ace7079
--- /dev/null
+++ b/Levels/49.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 49
+
+ ####
+ #..##
+ #...##
+ #.XX.##
+ ###X..X.##
+ ####....X...#
+###..#.#####..#
+#....#.#OOOOX.#
+#.#...X.OOOO#.#
+#..X.#.#O%OO#.#
+###..####.###.#
+ ####.@X..##X##
+ ###.X.....#
+ #..##...#
+ #########
diff --git a/Levels/5.sokolvl b/Levels/5.sokolvl
new file mode 100644
index 0000000..9a0b469
--- /dev/null
+++ b/Levels/5.sokolvl
@@ -0,0 +1,16 @@
+;version: 1
+;name: 05
+
+ ########
+ #..OOOO#
+ ############..OOOO#
+ #....#..X.X...OOOO#
+ #.XXX#X..X.#..OOOO#
+ #..X.....X.#..OOOO#
+ #.XX.#X.X.X########
+####..X.#.....#
+#...#.#########
+#....X..##
+#.XX#XX.@#
+#...#...##
+#########
diff --git a/Levels/50.sokolvl b/Levels/50.sokolvl
new file mode 100644
index 0000000..f87a302
--- /dev/null
+++ b/Levels/50.sokolvl
@@ -0,0 +1,19 @@
+;version: 1
+;name: 50
+
+ ############
+ ##OO....#...#
+ ##OO%.X....X.#
+ ##OO%O#.#.#X.##
+ #OO%O#.#.#.X..#
+####OOO#..#....#.#
+#..##.#..........#
+#[email protected].###..#.#.##
+#.X...X...#.#...#
+###XX...#.#.#.#.#
+ #...X...#.#.#####
+ #.X#.#####......#
+ #X...# #...#..#
+ #..### ##.....#
+ #..# #....##
+ #### ######
diff --git a/Levels/51.sokolvl b/Levels/51.sokolvl
new file mode 100644
index 0000000..65b69e4
--- /dev/null
+++ b/Levels/51.sokolvl
@@ -0,0 +1,19 @@
+;version: 1
+;name: 51
+
+ #############
+ #....###....#
+ #.....X.X..####
+ ####.#...X.X....#
+ ##.X..#X####.X.X.#
+###...#.#...###..X.#
+#.X..X..#..X..#.####
+#.##X####.#X#..X..###
+#.##..###.#.#.#..X..#
+#[email protected]...#.X.#.#
+#####..#..##..#.X#..#
+ #OOO.#####X..#..#.#
+ #OOOOOOO#.XX.#X.#.#
+ #OOOOOOO#.........#
+ #OOOOOOO#######..##
+ ######### ####
diff --git a/Levels/52.sokolvl b/Levels/52.sokolvl
new file mode 100644
index 0000000..25feb75
--- /dev/null
+++ b/Levels/52.sokolvl
@@ -0,0 +1,17 @@
+;version: 1
+;name: 52
+
+##### ####
+#OOO# #..####
+#OOO###..X..#
+#OOOO##.X..X###
+##OOOO##...X..#
+###OOO.##.X.X.#
+#.##....#..X..#
+#..##.#.###.####
+#.X.#.#X..X....#
+#...#.X.XX.X.###
+#..######..###
+#.## ####
+###
diff --git a/Levels/53.sokolvl b/Levels/53.sokolvl
new file mode 100644
index 0000000..cdca43e
--- /dev/null
+++ b/Levels/53.sokolvl
@@ -0,0 +1,17 @@
+;version: 1
+;name: 53
+
+ ####
+##..#####
+#.......# #####
+#.X###..###...#
+#OO#..X#.#..#.#
+#OO#......XX#.###
+#O%#.#..#X.X....#####
+#OO#..##.....##X#...#
+#O%X..X.#.##..X.....#
+#OO##..X...#...######
+#O%##X##...#####
+#OO..X.#####
+#..#.@.#
+########
diff --git a/Levels/54.sokolvl b/Levels/54.sokolvl
new file mode 100644
index 0000000..1585776
--- /dev/null
+++ b/Levels/54.sokolvl
@@ -0,0 +1,22 @@
+;version: 1
+;name: 54
+
+ ##########
+ #..###...#
+ #.X...X..#
+ #..####X##
+ ##.#..#..#
+ ##..#O%...#
+ #..##OO#..#
+ #.@.#O%#.##
+ #.#X#OO#X.#
+ #.X.#OO#..#
+ #.#.#%%#..#
+ #.X.#OO#X##
+ #....O%#..#
+ ###..#..#..#
+##....####..#
+#..#######X##
+#.X......X..#
+#..##...#...#
+#############
diff --git a/Levels/55.sokolvl b/Levels/55.sokolvl
new file mode 100644
index 0000000..27e07bc
--- /dev/null
+++ b/Levels/55.sokolvl
@@ -0,0 +1,23 @@
+;version: 1
+;name: 55
+
+ #####################
+ #...##..#...#...#...#
+ #.X.....X...X...X...##
+#####.#..#...###.##X###
+#...#.##X######...#...#
+#.X...#.OOOOOO#...#.X.#
+##.#..#.OOOOOO#####...#
+##.#########OO#...#.###
+#..........#OO#.X...#
+#.##.###.###OO##.#..###
+#.#...#...##OO##.###..#
+#.#...#...##..#...##..#
+#####.##############.##
+#..........#...#....X.#
+#.X..#.X.X.X...#.#....#
+#.#X##.X#..##.##....#.#
+#..X.XX.####.X..X.#.#.#
+#..........#...#......#
+#######################
diff --git a/Levels/56.sokolvl b/Levels/56.sokolvl
new file mode 100644
index 0000000..c1be432
--- /dev/null
+++ b/Levels/56.sokolvl
@@ -0,0 +1,18 @@
+;version: 1
+;name: 56
+
+ #####################
+##...................#
+#....X.#......##.#...#
+#..######.###..#X##.##
+##X#...##X#OOOO...#.#
+#..#....X.#OOOO##.#.#
+#.X.#.#.#.#OOOO##...#
+#.X.#XX...#OOOO##X#.#
+#.#.X@X##X#OOOO##...#
+#...XXX...#OOOO#....#
+#..X#...#.######.X###
+##..#.###XX..X...X.#
+##.....#.X..X.##...#
+ #####...#...#######
+ #########
diff --git a/Levels/57.sokolvl b/Levels/57.sokolvl
new file mode 100644
index 0000000..545e170
--- /dev/null
+++ b/Levels/57.sokolvl
@@ -0,0 +1,19 @@
+;version: 1
+;name: 57
+
+##########
+#........####
+#.######.#..##
+#.#.X.X.X..X.#
+#.......#X...#
+###X..XX#..###
+ #..##.#.X##
+ ##X#...X.@#
+ #..X.X.###
+ #.#...X..#
+ #.##...#.#
+ ##..#####.#
+ #.........#
+ #OOOOOOO###
+ #OOOOOOO#
+ #########
diff --git a/Levels/58.sokolvl b/Levels/58.sokolvl
new file mode 100644
index 0000000..2a8ba3e
--- /dev/null
+++ b/Levels/58.sokolvl
@@ -0,0 +1,14 @@
+;version: 1
+;name: 58
+
+ ####
+ #########..##
+##..X......X.#####
+#...##.##...##OOO#
+#.#XX.X.XX#X##OOO#
+#.#....@..#...OOO#
+#..X#.###XX...OOO#
+#.X..XX..X.##OOOO#
+###X.......#######
+ #..#######
+ ####
diff --git a/Levels/59.sokolvl b/Levels/59.sokolvl
new file mode 100644
index 0000000..ec608c0
--- /dev/null
+++ b/Levels/59.sokolvl
@@ -0,0 +1,23 @@
+;version: 1
+;name: 59
+
+ ######
+ #####....#
+ #..##.#..#####
+ #...%O#OO#...#
+ ##### ####.X#O#OOO....#
+ #...###..##.#%OOOO##.##
+ #.X......##.#OO#OO##.#
+######.#...#.#%O#####.#
+#...#.X#X#.#.#OO#####.#
+#.X..X.....#.#%O....#.#
+##.##..X.###.#..##..#.#
+ #..X..X.###.#####.##.#
+ ###X###X###..####.##.#
+####.#.........###..#.#
+#..X.#..X####..###XX#@#####
+#......X.# #..####..#X#...#
+####.#..X# #..............#
+ #..X..# ##..##..########
+ ##..### ########
+ ####
diff --git a/Levels/6.sokolvl b/Levels/6.sokolvl
new file mode 100644
index 0000000..cfbf101
--- /dev/null
+++ b/Levels/6.sokolvl
@@ -0,0 +1,16 @@
+;version: 1
+;name: 06
+
+ #####
+ #...#####
+ #.#X##..#
+ #.....X.#
+#########.###...#
+#OOOO..##.X..X###
+#OOOO....X.XX.##
+#OOOO..##X..X.@#
+#########..X..##
+ #.X.X..#
+ ###.##.#
+ #....#
+ ######
diff --git a/Levels/60.sokolvl b/Levels/60.sokolvl
new file mode 100644
index 0000000..19f2fb6
--- /dev/null
+++ b/Levels/60.sokolvl
@@ -0,0 +1,23 @@
+;version: 1
+;name: 60
+
+ ####
+ #..#
+ #..########
+ #######..#......#
+ #...#.#.#.#.#...##
+ #.X.....X..##..X.#
+ ###.X#.#..#.#.....#########
+ #..X..#..X#.#.XX.#...#.#..#
+ ##.#...#.....###....X.#.#..#
+ #..#X...#.###..#..#.XX#.#..#
+ #....X##.X..#...##.X..#.#.##
+####X.X.#....##..#...X....OO#
+#..#....###.#.X.X.###..###O%#
+#.....##[email protected].....##OOOO#
+#..##..##...X..#X#..##OOOO%O#
+##.#..X..#.#.X##..##OOOO%O###
+##.##..X..#.X.#..#OOOO%O###
+#....X.####...#.OOOO%O###
+#...#..# #..#..OO%O###
+######## ###########
diff --git a/Levels/7.sokolvl b/Levels/7.sokolvl
new file mode 100644
index 0000000..ffcc960
--- /dev/null
+++ b/Levels/7.sokolvl
@@ -0,0 +1,14 @@
+;version: 1
+;name: 07
+
+###### ###
+#OO..# ##@##
+#OO..###...#
+#OO.....XX.#
+#OO..#.#.X.#
+#OO###.#.X.#
+####.X.#X..#
+ #..X#.X.#
+ #.X..X..#
+ #..##...#
+ #########
diff --git a/Levels/8.sokolvl b/Levels/8.sokolvl
new file mode 100644
index 0000000..ba64172
--- /dev/null
+++ b/Levels/8.sokolvl
@@ -0,0 +1,15 @@
+;version: 1
+;name: 08
+
+ #####
+ #######...##
+##.#.@##.XX.#
+#....X......#
+#..X..###...#
+###.#####X###
+#.X..###.OO#
+#.X.X.X.OOO#
+#....###OOO#
+#.XX.# #OOO#
+#..### #####
+####
diff --git a/Levels/9.sokolvl b/Levels/9.sokolvl
new file mode 100644
index 0000000..62eeb72
--- /dev/null
+++ b/Levels/9.sokolvl
@@ -0,0 +1,20 @@
+;version: 1
+;name: 09
+
+ ####
+ #..###########
+ #....X...X.X.#
+ #.X#.X.#..X..#
+ #..X.X..#....#
+###.X#.#..####.#
+#@#X.X.X..##...#
+#....X.#X#...#.#
+##..X....X.X.X.#
+ ####..#########
+ ###..###
+ #......#
+ #......#
+ #OOOOOO#
+ #OOOOOO#
+ #OOOOOO#
+ ########
diff --git a/Levels/levels.py b/Levels/levels.py
new file mode 100644
index 0000000..e6fc841
--- /dev/null
+++ b/Levels/levels.py
@@ -0,0 +1,52 @@
+# Level data stolen from: https://www.mathsisfun.com/games/sokoban.html
+# (https://www.mathsisfun.com/games/a/sokoban/js/maps.js)
+maps=[[[0,0,1,1,1,1,1,0],[1,1,1,2,2,2,1,0],[1,3,6,4,2,2,1,0],[1,1,1,2,4,3,1,0],[1,3,1,1,4,2,1,0],[1,2,1,2,3,2,1,1],[1,4,2,5,4,4,3,1],[1,2,2,2,3,2,2,1],[1,1,1,1,1,1,1,1]],[[2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,1,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,1,4,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,1,1,1,2,2,4,1,1,1,2,2,2,2,2,2,2,2,2,2,2],[2,2,1,2,2,4,2,2,4,2,1,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,2,1,2,1,1,1,2,1,2,2,2,2,2,1,1,1,1,1,1],[1,2,2,2,1,2,1,1,1,2,1,1,1,1,1,1,1,2,2,3,3,1],[1,2,4,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,1],[1,1,1,1,1,2,1,1,1,1,2,1,6,1,1,1,1,2,2,3,3,1],[2,2,2,2,1,2,2,2,2,2,2,1,1,1,2,2,1,1,1,1,1,1],[2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]],[[1,1,1,1,1,1,1,1,1,1,1,1,2,2],[1,3,3,2,2,1,2,2,2,2,2,1,1,1],[1,3,3,2,2,1,2,4,2,2,4,2,2,1],[1,3,3,2,2,1,4,1,1,1,1,2,2,1],[1,3,3,2,2,2,2,6,2,1,1,2,2,1],[1,3,3,2,2,1,2,1,2,2,4,2,1,1],[1,1,1,1,1,1,2,1,1,4,2,4,2,1],[2,2,1,2,4,2,2,4,2,4,2,4,2,1],[2,2,1,2,2,2,2,1,2,2,2,2,2,1],[2,2,1,1,1,1,1,1,1,1,1,1,1,1]],[[2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,2],[2,2,2,2,2,2,2,2,1,2,2,2,2,2,6,1,2],[2,2,2,2,2,2,2,2,1,2,4,1,4,2,1,1,2],[2,2,2,2,2,2,2,2,1,2,4,2,2,4,1,2,2],[2,2,2,2,2,2,2,2,1,1,4,2,4,2,1,2,2],[1,1,1,1,1,1,1,1,1,2,4,2,1,2,1,1,1],[1,3,3,3,3,2,2,1,1,2,4,2,2,4,2,2,1],[1,1,3,3,3,2,2,2,2,4,2,2,4,2,2,2,1],[1,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,3,3,3,3,1],[2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,1],[2,2,2,1,2,2,2,2,1,2,2,4,2,4,2,2,2,3,3,3,3,1],[2,2,2,1,2,4,4,4,1,4,2,2,4,2,1,2,2,3,3,3,3,1],[2,2,2,1,2,2,4,2,2,2,2,2,4,2,1,2,2,3,3,3,3,1],[2,2,2,1,2,4,4,2,1,4,2,4,2,4,1,1,1,1,1,1,1,1],[1,1,1,1,2,2,4,2,1,2,2,2,2,2,1,2,2,2,2,2,2,2],[1,2,2,2,1,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2],[1,2,2,2,2,4,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,2,4,4,1,4,4,2,6,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,2,1,1,1,1,1],[2,2,2,2,2,2,2,2,1,2,1,4,1,1,2,2,1],[2,2,2,2,2,2,2,2,1,2,2,2,2,2,4,2,1],[1,1,1,1,1,1,1,1,1,2,1,1,1,2,2,2,1],[1,3,3,3,3,2,2,1,1,2,4,2,2,4,1,1,1],[1,3,3,3,3,2,2,2,2,4,2,4,4,2,1,1,2],[1,3,3,3,3,2,2,1,1,4,2,2,4,2,6,1,2],[1,1,1,1,1,1,1,1,1,2,2,4,2,2,1,1,2],[2,2,2,2,2,2,2,2,1,2,4,2,4,2,2,1,2],[2,2,2,2,2,2,2,2,1,1,1,2,1,1,2,1,2],[2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2]],[[1,1,1,1,1,1,2,2,1,1,1,2],[1,3,3,2,2,1,2,1,1,6,1,1],[1,3,3,2,2,1,1,1,2,2,2,1],[1,3,3,2,2,2,2,2,4,4,2,1],[1,3,3,2,2,1,2,1,2,4,2,1],[1,3,3,1,1,1,2,1,2,4,2,1],[1,1,1,1,2,4,2,1,4,2,2,1],[2,2,2,1,2,2,4,1,2,4,2,1],[2,2,2,1,2,4,2,2,4,2,2,1],[2,2,2,1,2,2,1,1,2,2,2,1],[2,2,2,1,1,1,1,1,1,1,1,1]],[[2,2,2,2,2,2,2,1,1,1,1,1,2],[2,1,1,1,1,1,1,1,2,2,2,1,1],[1,1,2,1,2,6,1,1,2,4,4,2,1],[1,2,2,2,2,4,2,2,2,2,2,2,1],[1,2,2,4,2,2,1,1,1,2,2,2,1],[1,1,1,2,1,1,1,1,1,4,1,1,1],[1,2,4,2,2,1,1,1,2,3,3,1,2],[1,2,4,2,4,2,4,2,3,3,3,1,2],[1,2,2,2,2,1,1,1,3,3,3,1,2],[1,2,4,4,2,1,2,1,3,3,3,1,2],[1,2,2,1,1,1,2,1,1,1,1,1,2],[1,1,1,1,2,2,2,2,2,2,2,2,2]],[[2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2],[2,2,1,2,2,1,1,1,1,1,1,1,1,1,1,1],[2,2,1,2,2,2,2,4,2,2,2,4,2,4,2,1],[2,2,1,2,4,1,2,4,2,1,2,2,4,2,2,1],[2,2,1,2,2,4,2,4,2,2,1,2,2,2,2,1],[1,1,1,2,4,1,2,1,2,2,1,1,1,1,2,1],[1,6,1,4,2,4,2,4,2,2,1,1,2,2,2,1],[1,2,2,2,2,4,2,1,4,1,2,2,2,1,2,1],[1,1,2,2,4,2,2,2,2,4,2,4,2,4,2,1],[2,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1],[2,2,1,1,1,2,2,1,1,1,2,2,2,2,2,2],[2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2],[2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2],[2,2,1,3,3,3,3,3,3,1,2,2,2,2,2,2],[2,2,1,3,3,3,3,3,3,1,2,2,2,2,2,2],[2,2,1,3,3,3,3,3,3,1,2,2,2,2,2,2],[2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1],[2,2,2,2,2,2,2,2,2,2,1,2,2,3,3,3,1],[2,2,2,2,2,2,1,1,1,1,1,2,2,3,3,3,1],[2,2,2,2,2,2,1,2,2,2,2,2,2,3,3,3,1],[2,2,2,2,2,2,1,2,2,1,1,2,2,3,3,3,1],[2,2,2,2,2,2,1,1,2,1,1,2,2,3,3,3,1],[2,2,2,2,2,1,1,1,2,1,1,1,1,1,1,1,1],[2,2,2,2,2,1,2,4,4,4,2,1,1,2,2,2,2],[2,1,1,1,1,1,2,2,4,2,4,2,1,1,1,1,1],[1,1,2,2,2,1,4,2,4,2,2,2,1,2,2,2,1],[1,6,2,4,2,2,4,2,2,2,2,4,2,2,4,2,1],[1,1,1,1,1,1,2,4,4,2,4,2,1,1,1,1,1],[2,2,2,2,2,1,2,4,2,2,2,2,1,2,2,2,2],[2,2,2,2,2,1,1,1,1,2,1,1,1,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2],[2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,1,2,2,2],[2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2],[2,2,2,2,2,2,2,2,2,1,2,2,1,1,1,1,2,1,1,1,2],[2,1,1,1,2,2,1,1,1,1,1,2,1,1,1,2,2,2,2,1,2],[1,1,6,1,1,1,1,2,2,2,4,4,4,2,1,2,2,2,2,1,2],[1,2,4,4,2,2,2,4,4,2,4,2,2,2,1,3,3,3,3,1,1],[1,2,2,4,4,4,1,2,2,2,2,4,2,2,1,3,3,3,3,3,1],[1,2,4,2,2,2,1,2,4,4,2,4,4,2,1,3,3,3,3,3,1],[1,1,1,2,2,2,1,2,2,4,2,2,2,2,1,3,3,3,3,3,1],[2,2,1,2,2,2,1,2,4,2,4,2,4,2,1,3,3,3,3,3,1],[2,2,1,2,1,1,1,1,1,1,1,2,1,1,1,3,3,3,3,3,1],[2,2,1,2,2,2,1,2,2,4,2,4,2,2,1,3,3,3,3,3,1],[2,2,1,1,1,2,1,2,4,4,2,4,2,4,1,1,1,1,1,1,1],[2,2,2,2,1,2,1,2,2,4,2,2,2,2,2,2,1,2,2,2,2],[2,2,2,2,1,2,1,2,4,4,4,2,4,4,4,2,1,2,2,2,2],[2,2,2,2,1,2,1,2,2,2,2,2,2,2,1,2,1,2,2,2,2],[2,2,2,2,1,2,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2],[2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2],[2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2],[2,2,2,2,2,1,1,1,1,2,1,2,2,1,2,2,2,2,2],[2,2,2,1,1,1,2,2,1,1,1,4,2,1,2,2,2,2,2],[2,2,1,1,2,2,2,6,2,2,4,2,2,1,2,2,2,2,2],[2,1,1,2,2,4,2,4,4,1,1,2,1,1,2,2,2,2,2],[2,1,2,2,1,4,1,1,2,2,2,2,2,1,2,2,2,2,2],[2,1,2,1,2,4,2,4,4,2,1,2,1,1,1,2,2,2,2],[2,1,2,2,2,4,2,1,2,2,1,2,4,2,1,1,1,1,1],[1,1,1,1,2,2,2,2,1,2,2,4,4,2,1,2,2,2,1],[1,1,1,1,2,1,1,2,4,2,2,2,2,2,2,2,2,2,1],[1,3,2,2,2,2,1,1,1,2,2,1,1,1,1,1,1,1,1],[1,3,3,2,3,3,1,2,1,1,1,1,2,2,2,2,2,2,2],[1,3,3,3,1,3,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,3,3,3,3,3,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,1,1,1,1,1,1,1,1,1,2,2],[2,2,1,5,3,5,1,5,3,5,1,2,2],[2,2,1,3,5,3,5,3,5,3,1,2,2],[2,2,1,5,3,5,3,5,3,5,1,2,2],[2,2,1,3,5,3,5,3,5,3,1,2,2],[2,2,1,5,3,5,3,5,3,5,1,2,2],[2,2,1,1,1,2,2,2,1,1,1,2,2],[2,2,2,2,1,2,2,2,1,2,2,2,2],[1,1,1,1,1,1,2,1,1,1,1,1,1],[1,2,2,2,2,2,2,2,2,2,2,2,1],[1,2,4,2,4,2,4,2,4,2,4,2,1],[1,1,2,4,2,4,2,4,2,4,2,1,1],[2,1,4,2,4,2,4,2,4,2,4,1,2],[2,1,2,2,2,4,6,4,2,2,2,1,2],[2,1,2,2,1,1,1,1,1,2,2,1,2],[2,1,1,1,1,2,2,2,1,1,1,1,2]],[[2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2],[2,2,1,1,1,2,2,2,1,1,2,2,1,1,1,1,1,2,2,2],[1,1,1,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,1],[1,2,2,4,4,2,1,4,2,1,2,2,1,2,2,3,3,3,2,1],[1,2,1,2,2,4,1,6,4,1,1,2,1,2,1,3,1,3,2,1],[1,2,2,1,1,2,1,4,2,2,1,2,2,2,2,3,3,3,2,1],[1,2,4,1,2,2,2,2,4,2,1,2,1,2,1,3,1,3,2,1],[1,2,2,2,2,1,1,2,2,1,1,4,2,4,2,3,3,3,2,1],[1,2,4,2,1,1,2,2,2,1,2,2,1,4,1,3,1,3,2,1],[1,1,2,4,4,2,2,4,2,2,2,4,2,2,4,3,3,3,2,1],[2,1,4,2,2,1,1,1,1,1,1,2,2,2,2,1,1,2,2,1],[2,1,2,2,2,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1],[2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2],[1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2],[1,2,1,2,1,1,1,1,1,1,2,2,2,2,2,1,2],[1,2,1,2,2,4,2,4,2,4,2,4,1,2,2,1,2],[1,2,1,2,2,2,4,6,4,2,2,2,1,1,2,1,1],[1,2,1,2,1,4,2,4,2,4,1,1,1,3,3,3,1],[1,2,1,2,2,2,4,2,4,2,2,1,1,3,3,3,1],[1,2,1,1,1,4,4,4,2,4,2,1,1,3,3,3,1],[1,2,2,2,2,2,1,2,1,1,2,1,1,3,3,3,1],[1,1,1,1,1,2,2,2,1,1,2,1,1,3,3,3,1],[2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,1],[2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,2],[2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2]],[[2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2],[2,2,2,2,1,1,1,1,2,2,1,2,2,2,2,2,2],[2,2,2,1,1,2,2,1,2,2,1,2,2,2,2,2,2],[2,2,2,1,2,2,4,2,4,2,1,2,2,2,2,2,2],[2,1,1,1,2,1,4,2,2,2,1,1,1,1,2,2,2],[2,1,2,2,4,2,2,1,1,4,2,2,2,1,2,2,2],[2,1,2,2,1,2,6,2,4,2,1,2,4,1,2,2,2],[2,1,2,2,1,2,2,2,2,2,2,4,2,1,1,1,1],[2,1,1,2,1,1,1,1,4,1,1,2,2,2,2,2,1],[2,1,2,4,1,3,3,3,3,3,1,2,1,2,2,2,1],[2,1,2,2,4,3,3,3,5,3,2,4,1,2,1,1,1],[1,1,2,2,1,3,3,3,3,3,1,2,2,2,1,2,2],[1,2,2,2,1,1,1,2,1,1,1,1,1,1,1,2,2],[1,2,4,4,2,2,1,2,2,1,2,2,2,2,2,2,2],[1,2,2,1,2,2,2,2,2,1,2,2,2,2,2,2,2],[1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,2,2],[2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2]],[[1,1,1,1,1,2,2,2,2,2,2,2,2,2],[1,2,2,2,1,1,2,2,2,2,2,2,2,2],[1,2,2,2,2,1,2,2,1,1,1,1,2,2],[1,2,4,2,2,1,1,1,1,2,2,1,2,2],[1,2,2,4,4,2,4,2,2,2,4,1,2,2],[1,1,1,6,2,1,4,2,2,2,2,1,1,2],[2,1,2,2,1,1,2,2,4,2,4,2,1,1],[2,1,2,4,2,2,1,1,2,1,1,2,3,1],[2,1,2,2,1,4,1,1,4,2,2,1,3,1],[2,1,1,1,2,2,2,4,3,3,1,1,3,1],[2,2,1,2,2,2,2,1,3,5,3,3,3,1],[2,2,1,2,4,4,2,1,3,3,3,3,3,1],[2,2,1,2,2,1,1,1,1,1,1,1,1,1],[2,2,1,2,2,1,2,2,2,2,2,2,2,2],[2,2,1,1,1,1,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2],[2,1,1,1,1,1,1,1,2,2,2,2,2,1,2,2,2,2],[2,1,2,2,2,2,2,1,2,4,6,4,2,1,2,2,2,2],[2,1,4,4,2,1,2,2,2,1,1,1,1,1,1,1,1,1],[2,1,2,1,1,1,3,3,3,3,3,3,1,1,2,2,2,1],[2,1,2,2,2,4,3,3,3,3,3,3,1,1,2,1,2,1],[2,1,2,1,1,1,3,3,3,3,3,3,2,2,2,2,2,1],[1,1,2,2,2,1,1,1,1,2,1,1,1,2,1,4,1,1],[1,2,2,1,4,2,2,2,1,2,2,4,2,2,1,2,1,2],[1,2,2,4,2,4,4,4,2,2,1,2,4,1,1,2,1,2],[1,2,2,2,4,2,4,2,1,1,1,4,4,2,1,2,1,2],[1,1,1,1,1,2,2,2,2,2,4,2,2,2,1,2,1,2],[2,2,2,2,1,1,1,2,1,1,1,2,2,2,1,2,1,2],[2,2,2,2,2,2,1,2,2,2,2,2,1,2,2,2,1,2],[2,2,2,2,2,2,1,1,1,1,1,1,1,1,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2]],[[2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2],[2,2,2,2,2,2,1,2,2,3,2,2,1,1,2,2,2,1,2,2,2,2],[2,2,2,2,2,2,1,2,1,3,2,2,2,2,2,6,2,1,2,2,2,2],[2,1,1,1,1,1,1,2,1,1,3,3,3,1,2,1,1,1,1,2,2,2],[1,1,2,2,1,1,3,3,3,1,1,1,1,2,2,2,2,2,1,1,1,1],[1,2,4,2,1,1,3,3,3,2,2,2,2,4,2,1,2,2,4,2,2,1],[1,2,2,2,2,2,3,3,2,1,1,2,1,2,1,1,2,1,1,2,2,1],[1,1,1,1,4,1,1,1,4,1,2,4,2,2,1,2,2,2,1,2,1,1],[2,1,1,1,2,2,1,2,2,2,2,1,1,4,2,4,4,2,1,2,1,2],[2,1,2,2,2,4,4,2,1,2,1,2,4,2,1,2,4,1,1,2,1,2],[2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2],[2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2]],[[2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,2,2,2,6,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,1,1,1,1,2,4,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,4,1,1,2,2,1,1,2,2,2,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,2,2,1,2,2,1,1,1,1,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,1,4,4,2,4,2,2,2,2,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,2,4,2,4,2,1,1,1,2,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,1,2,2,2,4,2,2,1,2,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,1,2,1,2,2,1,4,1,2,2,2,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,1,1,2,1,1,1,1,2,2,2,1,2,1,2,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,1,2,2,4,2,2,1,1,1,1,1,2,1,2,1,2,1,1,1,1,2,2,2],[2,2,2,2,1,1,2,2,2,2,4,2,2,2,2,2,4,2,2,1,1,1,2,2,1,1,1,1],[1,1,1,1,1,2,2,1,1,1,2,4,2,4,1,2,4,2,1,2,2,2,3,3,3,3,3,1],[1,2,2,2,2,2,1,1,2,2,2,2,2,2,1,2,2,1,1,2,2,1,3,3,3,3,3,1],[1,2,4,4,4,4,2,2,2,2,1,1,1,1,1,1,4,1,1,2,2,2,1,3,1,1,3,1],[1,1,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,3,3,3,3,1],[2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,1],[2,2,1,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,1,1],[2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2]],[[2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2],[2,2,2,2,2,2,2,1,3,3,3,3,3,3,3,3,3,3,1,2],[2,2,2,2,2,1,1,1,3,1,3,1,3,1,3,1,3,3,1,2],[2,2,2,2,2,1,2,2,2,3,3,3,3,3,3,3,3,3,1,2],[2,2,2,2,2,1,6,2,4,2,4,2,4,2,5,3,5,3,1,2],[2,2,2,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2],[2,1,1,1,1,2,2,2,1,2,2,2,2,1,1,2,2,1,2,2],[1,1,2,2,2,2,4,2,1,2,2,2,2,1,2,4,2,1,1,2],[1,2,2,1,4,1,2,1,1,1,2,1,1,1,4,2,2,2,1,1],[1,2,4,2,2,4,2,4,2,2,2,1,2,4,2,4,2,4,2,1],[1,2,2,1,2,4,2,1,1,2,2,2,2,2,2,2,1,4,2,1],[1,2,2,2,4,1,1,1,1,4,1,1,1,1,4,1,1,2,2,1],[1,1,1,1,2,2,1,1,2,2,2,1,2,2,2,2,1,2,2,1],[2,2,2,1,4,2,1,1,2,2,2,1,2,1,2,4,4,2,2,1],[2,2,2,1,2,2,2,1,2,4,2,1,2,2,4,2,2,2,2,1],[2,2,2,1,1,1,2,1,2,4,4,2,1,2,2,4,2,1,1,1],[2,2,2,2,2,1,2,1,2,2,2,2,1,2,4,2,1,1,2,2],[2,2,2,2,2,1,2,1,1,1,1,1,1,1,1,2,1,2,2,2],[2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,1,2,2,2],[2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2]],[[2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2],[2,2,2,1,3,3,2,2,1,2,2,2,1,2,2,2],[2,2,2,1,3,3,2,2,2,2,2,2,1,2,2,2],[2,2,2,1,3,3,2,2,1,2,2,1,1,1,1,2],[2,2,1,1,1,1,1,1,1,2,2,1,2,2,1,1],[2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,1],[2,2,1,2,2,1,2,2,1,1,2,2,1,2,2,1],[1,1,1,1,2,1,1,2,2,1,1,1,1,2,1,1],[1,2,2,4,2,2,1,1,1,1,1,2,1,2,2,1],[1,2,1,2,4,2,2,4,2,2,1,2,4,2,2,1],[1,2,6,4,2,2,4,2,2,2,1,2,2,2,1,1],[1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2],[2,2,2,1,2,2,2,2,1,2,2,2,2,2,2,2],[2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2],[2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,2,2],[2,1,2,2,2,2,1,2,2,1,2,2,4,2,2,1,2,2,2,1,1,2],[2,1,2,4,2,4,2,4,2,2,4,2,1,2,4,2,4,2,2,2,1,2],[2,1,1,4,2,4,2,2,2,1,2,6,1,2,4,2,2,2,4,2,1,2],[1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,2],[1,2,2,4,2,4,1,2,2,1,3,3,3,3,3,3,1,2,4,1,2,2],[1,2,1,2,2,2,1,2,2,1,3,3,3,3,3,3,1,1,2,1,2,2],[1,2,2,1,1,2,1,1,2,1,2,3,3,3,3,3,1,2,2,1,2,2],[1,2,1,2,2,2,2,2,2,4,3,3,3,3,3,3,2,4,2,1,2,2],[1,2,1,2,4,2,1,1,2,1,3,3,3,3,3,3,1,2,2,1,2,2],[1,2,2,4,2,4,1,2,2,1,3,3,3,3,3,3,1,2,4,1,2,2],[1,2,4,2,2,2,1,2,2,1,1,4,1,1,1,1,1,2,2,1,2,2],[1,2,4,2,4,2,1,1,1,1,2,4,2,4,2,2,4,2,4,1,2,2],[1,1,2,1,2,2,2,2,2,4,2,4,2,4,2,4,2,2,2,1,1,1],[2,1,2,2,1,1,1,1,1,1,2,4,2,2,2,2,4,2,2,2,2,1],[2,1,2,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,2,1],[2,1,1,1,1,1,1,1,2,1,4,2,2,2,2,2,2,2,2,2,2,1],[2,2,2,2,2,2,2,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1],[2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,1,2,4,1,4,2,1,2,2,1,1,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,2,2,1,2,2,1,2,2,2,1,1,1,1,1,1,1,1],[1,3,3,3,3,2,2,1,2,4,1,4,2,1,2,2,4,1,2,2,1,2,2,2,1],[1,3,3,3,3,1,2,1,2,2,2,2,2,1,4,2,2,1,2,2,2,2,2,2,1],[1,3,3,1,3,2,2,2,2,4,1,2,2,1,2,4,2,2,2,2,1,4,2,2,1],[1,3,3,3,2,6,1,1,2,2,1,4,2,1,4,2,2,1,2,2,1,2,2,2,1],[1,3,3,3,3,2,1,1,2,4,1,2,2,2,2,2,4,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,2,2,1,4,4,1,4,2,2,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,1,2,4,1,2,2,1,2,2,4,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,1,2,2,1,2,2,1,2,2,2,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,1,1,1,1,2,2,1,1,1,1,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2],[2,2,2,1,3,3,3,3,3,3,3,3,1,1,1,1,2,2,2,2,2],[2,2,2,1,3,1,3,1,3,3,3,3,1,2,2,1,2,2,2,2,2],[2,2,2,1,3,3,3,3,3,3,3,3,4,4,2,1,2,2,2,2,2],[2,2,2,1,2,2,2,2,2,3,1,1,1,2,2,1,1,1,1,2,2],[2,1,1,1,1,1,1,1,1,1,2,2,4,2,1,2,2,2,1,2,2],[2,1,2,2,2,2,2,4,2,2,2,4,2,4,2,2,4,2,1,2,2],[2,1,2,2,1,2,2,2,2,1,2,2,4,2,4,1,2,2,1,2,2],[2,1,1,2,1,1,1,1,1,2,2,2,1,2,2,1,2,2,1,2,2],[2,1,2,4,2,2,2,2,2,1,2,2,2,1,1,1,1,2,1,2,2],[1,1,2,2,4,1,2,2,2,1,2,1,1,2,2,1,2,2,1,2,2],[1,2,2,2,2,1,1,4,1,1,1,2,2,2,2,1,2,2,1,1,2],[1,2,4,2,2,2,2,4,2,1,2,2,1,2,2,1,2,2,2,1,2],[1,1,1,1,1,2,2,2,2,1,2,1,1,2,1,2,1,1,2,1,1],[2,2,2,2,1,4,1,2,1,2,2,4,2,2,4,2,4,2,2,2,1],[2,2,2,2,1,6,1,2,2,4,1,4,4,4,2,2,1,2,2,2,1],[2,2,2,2,1,1,1,2,2,4,2,2,2,2,2,2,1,1,1,1,1],[2,2,2,2,2,2,1,1,2,2,1,2,2,1,2,2,1,2,2,2,2],[2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,1,1,1,1,1],[2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,2,2,2,1],[2,2,2,2,1,2,2,2,2,2,2,4,2,4,2,1,1,2,1,2,1,2,1],[2,2,2,2,1,2,2,1,1,1,1,2,4,2,2,1,2,2,2,2,2,3,1],[2,2,2,2,1,2,2,2,2,2,2,4,2,1,2,1,2,1,1,3,1,3,1],[2,2,2,2,1,1,4,1,1,1,1,4,2,4,2,4,2,1,1,3,1,3,1],[2,2,2,2,1,2,2,2,2,2,1,2,2,2,2,1,1,1,1,3,1,1,1],[2,2,2,2,1,2,4,2,2,2,1,1,1,1,1,1,2,2,1,3,1,3,1],[1,1,1,1,1,1,4,4,4,1,1,2,2,2,2,2,2,6,1,3,1,3,1],[1,2,2,2,2,2,2,1,2,2,2,2,1,4,1,4,1,1,1,3,2,3,1],[1,2,1,1,1,1,2,1,4,4,4,4,4,2,2,2,2,1,2,3,3,3,1],[1,2,1,2,2,2,2,4,2,2,2,2,2,1,2,2,2,1,2,3,3,3,1],[1,2,1,2,2,2,1,1,2,1,1,2,2,2,2,2,1,1,1,3,3,3,1],[1,2,1,1,1,1,1,1,4,1,1,1,1,1,1,2,2,1,1,1,1,1,1],[1,2,2,2,2,2,2,2,2,1,2,2,2,2,1,2,2,1,2,2,2,2,2],[1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2,2]],[[1,1,1,1,1,1,1,1,1,2,2,2,2,2,2],[1,2,2,2,2,2,2,2,1,2,2,2,2,2,2],[1,2,2,2,2,2,2,2,1,1,1,1,2,2,2],[1,1,2,1,1,1,1,2,1,2,2,1,2,2,2],[1,1,2,1,6,1,1,2,2,2,2,1,2,2,2],[1,2,4,4,4,2,4,2,2,4,4,1,2,2,2],[1,2,2,1,2,1,1,2,4,2,2,1,2,2,2],[1,2,2,1,2,1,1,2,2,4,2,1,1,1,1],[1,1,1,1,2,2,4,4,4,2,4,1,2,2,1],[2,1,2,2,2,1,1,2,2,2,3,3,3,3,1],[2,1,2,1,2,2,2,1,2,1,3,3,2,3,1],[2,1,2,2,2,1,2,1,2,1,1,3,3,3,1],[2,1,1,1,1,1,2,4,2,2,1,3,3,3,1],[2,2,2,2,2,1,1,2,2,2,1,1,1,1,1],[2,2,2,2,2,2,1,1,1,1,1,2,2,2,2]],[[2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2],[2,1,3,3,3,2,2,2,1,2,2,2,2,1,2,2,2,1,1,1,2,2,2],[1,1,3,3,3,3,3,2,2,4,1,1,2,1,2,1,2,4,2,1,2,2,2],[1,3,3,3,3,3,3,1,2,2,4,2,2,1,2,2,4,2,2,1,2,2,2],[1,3,3,3,3,3,3,1,2,2,1,2,2,1,2,1,2,1,2,1,1,2,2],[1,1,1,1,1,1,1,1,1,2,4,2,2,4,2,1,2,1,2,2,1,1,1],[2,2,1,2,2,2,2,2,1,4,1,1,4,2,1,1,2,1,1,2,2,2,1],[2,1,1,2,2,2,4,2,2,2,2,1,2,4,2,2,4,2,2,2,1,2,1],[2,1,2,2,1,1,2,1,1,1,2,1,2,2,1,1,1,1,1,4,1,2,1],[2,1,2,4,2,4,4,2,2,2,2,2,4,2,2,2,4,2,2,2,2,2,1],[2,1,2,4,2,2,2,2,4,1,1,4,2,1,1,1,1,1,1,1,1,2,1],[2,1,1,1,1,1,1,1,2,2,6,2,1,1,2,2,2,2,2,2,1,1,1],[2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,1,1,1,1,1,1,1,2,2,2],[2,2,2,2,2,1,6,2,1,2,2,1,2,2,2],[2,2,2,2,2,1,2,4,2,2,2,1,2,2,2],[2,2,2,2,1,1,1,2,1,1,2,1,2,2,2],[2,1,1,1,1,2,4,2,2,1,2,1,1,2,2],[2,1,2,2,2,2,2,2,2,1,2,2,1,1,2],[2,1,2,4,2,4,1,1,1,1,2,4,2,1,2],[2,1,2,4,4,2,1,2,2,1,2,2,4,1,2],[2,1,4,2,2,4,2,2,2,1,4,2,2,1,2],[1,1,2,2,4,4,1,2,2,2,4,4,2,1,1],[1,2,4,4,2,2,1,2,2,1,2,2,4,2,1],[1,2,2,2,2,2,1,1,1,1,2,4,2,2,1],[1,2,2,1,4,1,1,3,3,1,1,2,2,2,1],[1,1,1,2,3,1,3,3,3,3,1,1,1,1,1],[2,2,1,2,3,3,3,3,3,3,3,1,1,2,2],[2,2,1,3,3,3,3,2,2,2,3,3,1,2,2],[2,2,1,1,1,1,1,1,1,1,1,1,1,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2],[2,2,2,2,2,2,2,1,1,1,1,1,1,2,1,1,1,2,2,2,1,1,1,1],[2,2,2,1,1,1,1,1,2,2,2,2,1,1,1,2,4,2,4,2,2,4,2,1],[1,1,1,1,2,2,1,1,2,1,4,2,4,2,2,2,2,4,2,1,2,2,2,1],[1,3,3,3,3,2,2,2,4,4,2,4,2,4,2,2,4,2,2,2,1,4,1,1],[1,3,3,2,1,2,1,1,2,1,2,2,2,1,1,1,4,1,1,2,1,2,2,1],[1,3,3,3,3,2,2,2,2,1,2,1,1,1,2,2,2,2,1,2,2,2,2,1],[1,3,3,3,3,2,2,2,2,1,2,1,1,2,2,4,2,2,1,1,1,4,2,1],[1,3,3,1,1,1,1,1,1,2,2,4,2,2,1,2,2,1,1,1,1,2,1,1],[1,1,1,1,2,2,2,2,1,2,2,2,1,1,1,2,2,2,2,6,2,2,1,2],[2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2]],[[2,1,1,1,1,1,2,2,2,2,2,2,2,2],[2,1,2,2,2,1,1,1,1,1,1,1,2,2],[2,1,2,4,2,1,1,1,2,2,2,1,2,2],[2,1,2,4,2,2,2,2,4,4,2,1,2,2],[2,1,1,2,1,1,1,1,2,2,2,1,2,2],[1,1,1,2,1,2,2,1,2,1,1,1,2,2],[1,2,2,2,1,2,2,1,6,1,1,2,2,2],[1,2,4,4,2,2,2,2,4,2,1,2,2,2],[1,2,2,2,1,2,1,2,4,2,1,1,1,1],[1,1,1,1,1,2,1,2,2,2,1,2,2,1],[2,1,2,2,2,4,1,1,1,1,2,2,2,1],[2,1,2,2,4,2,2,2,2,2,4,2,2,1],[2,1,1,2,2,2,1,1,1,1,1,2,1,1],[2,1,1,1,1,1,1,1,1,1,1,2,2,1],[1,1,3,3,3,3,1,2,4,2,2,4,2,1],[1,3,3,3,3,3,1,2,4,4,1,2,2,1],[1,3,3,2,3,3,1,2,4,2,2,4,2,1],[1,3,3,3,3,3,4,2,2,2,1,2,2,1],[1,1,2,2,1,1,1,1,1,1,1,1,1,1],[2,1,1,1,1,2,2,2,2,2,2,2,2,2]],[[2,1,1,1,1,1,1,1,2,2,2,2,2,2,2],[2,1,2,2,1,2,2,1,1,1,1,1,2,2,2],[1,1,2,2,1,2,2,1,3,3,3,1,1,1,2],[1,2,2,4,1,2,2,1,3,3,3,2,2,1,2],[1,2,4,2,1,4,4,2,3,3,3,2,2,1,2],[1,2,2,4,1,2,2,1,3,3,3,2,3,1,2],[1,2,2,2,1,2,4,1,1,1,1,1,1,1,1],[1,1,4,2,2,2,2,2,2,2,4,2,4,2,1],[1,1,2,2,1,2,2,4,4,2,1,2,2,2,1],[2,1,1,1,1,1,1,2,2,1,1,4,4,6,1],[2,2,2,2,2,2,1,2,2,2,2,2,2,1,1],[2,2,2,2,2,2,1,1,1,1,1,1,1,1,2]],[[2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,1,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2],[2,1,1,2,2,1,1,2,6,1,2,2,2,1,2,2,2,2],[2,1,2,2,4,1,2,4,2,4,2,2,2,1,1,1,1,2],[2,1,4,2,2,4,2,2,1,2,4,2,4,1,2,2,1,1],[1,1,2,2,4,1,1,2,1,4,2,4,2,2,2,2,2,1],[1,2,2,1,2,2,1,2,1,2,2,2,4,4,4,2,2,1],[1,2,4,2,2,2,2,4,2,2,4,1,1,2,1,1,1,1],[1,2,4,2,4,2,1,4,1,2,2,1,2,2,1,2,2,2],[1,1,2,2,1,1,1,2,2,1,1,1,4,2,1,2,2,2],[2,1,2,2,1,3,3,3,3,2,2,2,2,2,1,2,2,2],[2,1,1,1,1,3,3,3,3,3,3,1,1,1,1,2,2,2],[2,2,2,1,3,3,3,3,1,1,1,1,2,2,2,2,2,2],[2,2,2,1,3,3,3,1,1,2,2,2,2,2,2,2,2,2],[2,2,2,1,3,3,3,1,2,2,2,2,2,2,2,2,2,2],[2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,1,1,1,1,2,2,2],[2,2,1,1,1,1,1,2,2,1,2,2,2],[2,1,1,2,2,2,2,2,4,1,2,2,2],[1,1,2,4,2,2,1,1,2,1,1,1,2],[1,6,4,2,4,2,1,2,4,2,2,1,2],[1,1,1,1,2,1,1,2,2,2,4,1,2],[2,1,3,3,3,3,1,4,2,4,2,1,2],[2,1,3,3,3,3,1,2,2,2,4,1,2],[2,1,3,3,3,3,2,2,4,4,2,1,1],[2,1,3,3,3,2,1,2,4,2,2,2,1],[2,1,1,1,1,1,1,4,2,4,2,2,1],[2,2,2,2,2,2,1,2,2,2,1,1,1],[2,2,2,2,2,2,1,4,2,1,1,1,2],[2,2,2,2,2,2,1,2,2,1,2,2,2],[2,2,2,2,2,2,1,1,1,1,2,2,2]],[[1,1,1,1,1,1,1,1,1,1,1,1],[1,1,2,2,2,2,2,1,1,2,2,1],[1,1,2,2,2,4,2,2,2,4,2,1],[1,1,1,1,2,1,1,2,4,4,2,1],[1,2,2,2,4,2,1,2,2,2,2,1],[1,2,4,4,4,2,1,2,1,1,1,1],[1,2,2,2,1,2,1,2,4,2,1,1],[1,2,2,1,2,2,1,2,2,4,2,1],[1,2,4,1,2,4,1,2,2,2,2,1],[1,2,2,2,3,3,1,2,1,1,1,1],[1,1,1,1,3,3,2,4,2,1,6,1],[1,3,3,3,3,3,1,2,4,1,2,1],[1,1,3,3,3,3,1,2,2,4,2,1],[1,1,1,3,3,1,1,2,2,2,2,1],[1,1,1,1,1,1,1,1,1,1,1,1]],[[1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1],[1,2,2,2,1,2,2,2,2,1,6,1,1,1,1,3,3,3,3,1],[1,2,2,2,4,4,1,2,2,2,2,2,2,2,3,3,3,3,3,1],[1,2,2,2,1,2,1,1,1,2,2,2,1,1,2,3,3,3,3,1],[1,1,2,1,1,2,1,1,1,2,2,1,2,2,2,3,3,3,3,1],[2,1,2,4,2,4,2,2,2,2,2,1,2,1,1,2,1,1,1,1],[2,1,2,2,4,2,4,1,1,2,2,1,2,2,2,2,2,2,2,1],[1,1,1,1,2,1,2,2,1,1,1,1,2,1,1,2,1,1,2,1],[1,2,2,1,2,1,4,2,2,2,1,1,2,1,1,2,2,2,2,1],[1,2,4,2,2,4,2,2,1,2,1,1,2,1,1,1,1,1,1,1],[1,2,1,2,4,2,4,2,2,2,2,1,2,1,2,2,2,2,2,2],[1,2,2,4,2,1,1,2,1,1,2,1,2,1,2,2,2,2,2,2],[1,2,4,4,2,2,2,2,2,4,4,2,2,1,2,2,2,2,2,2],[1,1,2,1,1,2,1,1,1,2,4,2,2,1,2,2,2,2,2,2],[2,1,2,2,2,2,1,2,1,2,2,2,2,1,2,2,2,2,2,2],[2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,2,2,2,2]],[[2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2],[2,2,2,1,1,1,2,2,1,1,2,2,2,2,2,2,2,2],[1,1,1,1,2,2,4,2,2,1,2,2,2,2,2,2,2,2],[1,2,2,2,4,2,4,2,2,1,1,1,1,2,2,2,2,2],[1,2,4,2,2,2,1,2,4,2,2,2,1,2,1,1,1,1],[1,2,2,1,2,2,1,2,2,2,4,2,1,2,1,3,3,1],[1,1,4,1,4,2,1,1,1,1,4,1,1,1,1,3,3,1],[2,1,2,2,2,1,1,1,1,1,2,1,1,2,3,3,3,1],[2,1,4,1,2,1,1,6,1,1,2,1,1,2,2,3,3,1],[2,1,2,1,2,2,2,2,4,2,2,2,2,2,3,3,3,1],[2,1,2,2,2,1,1,1,1,2,1,1,1,2,2,3,3,1],[2,1,1,1,2,1,1,2,1,2,2,1,1,2,3,3,3,1],[2,2,1,1,4,2,1,1,1,1,4,2,1,1,1,3,3,1],[2,2,1,2,2,2,1,1,2,2,2,2,1,2,1,3,3,1],[2,1,1,2,4,4,1,1,2,2,4,2,1,2,1,1,1,1],[2,1,2,2,2,2,2,4,4,4,4,2,1,2,2,2,2,2],[2,1,2,4,2,1,1,1,2,2,2,2,1,2,2,2,2,2],[2,1,2,2,2,1,2,1,1,1,1,1,1,2,2,2,2,2],[2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2]],[[1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2],[1,3,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,2,2],[1,3,3,3,3,3,3,2,2,2,1,2,2,1,1,2,2,2,1,2,2],[1,3,3,1,1,1,2,4,2,2,2,2,4,2,2,2,2,2,1,2,2],[1,3,3,3,2,4,2,4,2,1,2,2,1,1,1,2,2,2,1,2,2],[1,3,3,3,1,4,1,1,1,1,1,2,2,2,2,1,2,2,1,2,2],[1,1,1,2,2,2,2,1,2,2,2,1,4,2,2,1,2,4,1,1,1],[2,2,1,2,2,4,4,2,4,2,4,2,2,4,1,1,2,2,4,2,1],[2,2,1,2,2,4,2,2,2,1,4,1,2,2,1,1,2,2,2,2,1],[2,2,1,1,1,2,1,1,2,1,2,2,4,2,1,1,1,1,1,1,1],[2,2,2,1,2,2,4,2,4,2,1,1,2,1,1,2,2,2,2,2,2],[2,2,2,1,2,2,2,2,4,2,2,4,2,2,1,2,2,2,2,2,2],[2,2,2,1,1,2,2,2,1,2,1,2,2,2,1,2,2,2,2,2,2],[2,2,2,2,1,1,1,1,1,6,1,1,1,1,1,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2]],[[2,1,1,1,1,1,1,1,1,1,2,2,2,2],[2,1,3,3,3,3,2,2,2,1,1,2,2,2],[2,1,3,1,3,1,2,2,4,2,1,1,2,2],[1,1,3,3,3,3,1,2,1,2,6,1,1,2],[1,2,3,3,3,3,1,2,2,1,2,2,1,1],[1,2,2,2,2,2,1,4,2,1,1,4,2,1],[1,1,2,1,1,1,2,2,4,2,2,2,2,1],[2,1,4,2,2,4,2,4,2,4,1,2,2,1],[2,1,2,1,2,2,4,2,4,2,1,1,2,1],[2,1,2,2,1,1,1,2,2,1,1,2,2,1],[2,1,2,2,2,2,1,1,2,1,1,2,1,1],[2,1,2,2,4,2,1,2,2,4,2,2,1,2],[2,1,1,1,4,2,4,2,2,2,1,1,1,2],[2,2,2,1,2,2,1,1,1,1,1,2,2,2],[2,2,2,1,1,1,1,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,3,1,1,1,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,3,3,3,3,1,2,2,2,2],[2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,1,2,2,2,2],[1,1,2,2,2,1,1,2,2,2,2,2,1,1,3,3,3,3,1,1,1,1,1],[1,2,2,4,4,1,1,2,2,4,2,6,1,1,3,3,3,3,2,2,2,2,1],[1,2,2,2,2,2,2,4,4,2,4,1,2,2,3,3,3,3,1,2,2,2,1],[1,2,2,4,2,1,1,2,4,4,2,1,2,1,3,3,3,3,1,2,2,1,1],[1,2,2,4,2,1,1,2,4,2,2,1,2,1,1,2,1,1,1,2,2,1,2],[1,1,2,1,1,1,1,1,2,1,1,1,2,2,2,2,2,2,2,2,2,1,2],[1,1,2,2,2,4,2,2,4,2,1,1,1,1,1,2,1,1,1,2,2,1,2],[1,2,4,1,1,1,2,2,1,2,1,1,1,1,1,2,1,2,1,1,1,1,2],[1,2,2,2,4,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2],[1,2,2,4,2,1,4,2,4,2,4,1,1,1,2,2,1,2,2,2,2,2,2],[1,2,4,4,4,1,2,4,2,2,2,1,2,1,1,1,1,2,2,2,2,2,2],[1,2,2,2,2,1,2,2,4,4,2,1,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,1,1,1,1,2],[1,1,1,1,1,1,1,2,6,1,2],[1,2,2,2,2,2,4,2,2,1,2],[1,2,2,2,4,1,1,2,4,1,2],[1,1,4,1,3,3,3,1,2,1,2],[2,1,2,4,3,3,3,2,2,1,2],[2,1,2,1,3,2,3,1,2,1,1],[2,1,2,2,2,1,2,1,4,2,1],[2,1,4,2,2,4,2,2,2,2,1],[2,1,2,2,1,1,1,1,1,1,1],[2,1,1,1,1,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,1,1,2,2,2],[2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,1,2,2,2],[2,2,2,2,2,2,2,2,1,1,2,2,4,4,2,2,1,2,2,2],[2,2,2,2,2,2,2,1,1,2,4,4,2,2,4,2,1,2,2,2],[2,2,2,2,2,2,2,1,2,4,2,2,2,2,4,2,1,2,2,2],[1,1,1,1,2,2,2,1,2,2,2,4,4,2,1,1,1,1,1,2],[1,2,2,1,1,1,1,1,1,1,1,2,1,1,2,2,2,2,1,2],[1,3,3,2,2,2,2,2,2,2,2,2,2,2,4,4,4,6,1,2],[1,3,1,2,1,1,1,1,1,1,1,2,1,1,2,2,2,1,1,2],[1,3,1,2,1,1,1,1,1,1,1,3,2,1,4,2,4,1,1,1],[1,3,3,3,3,3,3,3,3,3,3,3,2,1,2,2,2,4,2,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,4,2,2,1],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,1,1,1],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2]],[[2,1,1,1,1,1,1,1,1,2,2,2,2],[2,1,6,1,1,2,2,2,1,1,1,1,2],[2,1,2,4,2,2,2,4,2,2,2,1,2],[2,1,2,2,4,2,4,2,4,4,4,1,2],[2,1,2,4,4,1,2,1,2,2,2,1,2],[1,1,4,2,2,2,2,4,2,2,2,1,2],[1,2,2,4,2,2,4,4,4,4,4,1,1],[1,2,4,1,1,1,1,2,1,2,2,2,1],[1,2,2,4,3,3,3,3,1,2,2,2,1],[1,2,1,1,3,3,3,3,1,4,4,2,1],[1,2,1,1,3,3,3,3,2,2,2,1,1],[1,2,2,2,3,3,3,3,1,2,2,1,2],[1,1,2,1,3,3,3,3,1,4,4,1,2],[2,1,2,1,3,3,3,3,1,2,2,1,2],[2,1,2,2,2,2,2,2,2,2,2,1,2],[2,1,1,1,1,2,1,1,4,1,1,1,2],[2,2,2,2,1,2,2,2,2,1,2,2,2],[2,2,2,2,1,1,1,1,1,1,2,2,2]],[[2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2],[2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,1,1],[2,2,2,2,1,2,2,1,2,1,4,4,2,4,2,2,1],[2,2,2,2,1,4,2,1,4,1,2,2,1,1,2,6,1],[2,2,2,1,1,2,1,1,2,1,2,4,2,1,2,1,1],[2,2,2,1,2,2,2,4,2,1,4,2,2,1,2,1,2],[2,2,2,1,2,2,2,1,2,4,2,2,2,1,2,1,2],[2,2,2,1,1,2,4,2,4,2,2,2,1,1,2,1,2],[2,2,2,1,2,2,1,2,2,1,1,2,2,4,2,1,2],[2,2,2,1,2,2,2,2,1,1,2,4,4,1,2,1,2],[1,1,1,1,1,1,4,4,2,2,2,1,2,2,2,1,2],[1,3,3,3,3,1,2,2,1,1,1,1,1,1,1,1,2],[1,3,1,3,3,3,2,1,1,2,2,2,2,2,2,2,2],[1,3,3,3,3,2,2,2,1,2,2,2,2,2,2,2,2],[1,3,3,3,3,2,2,2,1,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,1,1,1,1,1,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,1,2,2,2,1,2,1,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2],[2,2,2,1,2,4,2,1,2,2,4,2,2,2,2,1,1,1,1,1,1,2,2,2,2],[2,2,1,1,4,2,2,1,1,1,2,1,1,2,2,2,2,2,2,2,1,2,2,2,2],[1,1,1,2,2,4,4,2,4,2,4,2,1,2,2,1,1,2,2,2,1,1,1,1,1],[1,2,2,2,2,2,2,2,4,2,2,2,1,1,1,1,1,1,2,1,1,2,2,2,1],[1,2,2,1,1,1,1,1,1,1,1,2,1,6,2,2,2,1,2,1,2,2,1,2,1],[1,1,2,1,1,1,2,2,2,2,2,2,1,1,1,1,2,1,4,1,2,1,2,2,1],[2,1,2,1,1,1,2,1,1,1,1,2,1,1,3,3,2,1,2,2,2,4,2,1,1],[2,1,2,2,4,2,2,4,2,2,1,4,1,1,3,3,2,1,4,1,1,2,2,1,1],[2,1,2,2,1,2,1,2,1,2,2,2,2,2,3,3,1,1,2,1,1,2,4,2,1],[2,1,1,1,1,2,2,2,1,2,1,1,2,1,3,3,1,2,2,2,2,4,2,2,1],[2,2,2,2,1,1,1,1,1,2,2,2,2,1,3,3,1,2,1,2,1,2,2,1,1],[2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,1,2,2,2,1,2,1,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,3,3,1,1,1,1,1,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,3,3,2,2,2,2,2,2,2,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,1,1,1,2,2,1,1,2],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2]],[[2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2],[2,2,2,2,1,1,1,1,1,2,2,1,2,2,1,1,1,1,2],[2,2,2,2,1,2,2,2,1,2,2,2,4,2,2,2,2,1,2],[2,1,1,1,1,2,1,4,4,2,1,1,2,1,1,2,2,1,2],[1,1,2,2,2,2,2,2,1,2,1,2,2,1,1,2,1,1,1],[1,2,2,1,1,1,2,4,1,4,2,2,4,2,2,4,2,2,1],[1,3,3,3,2,2,2,2,1,2,1,1,2,2,1,2,2,2,1],[1,3,3,3,1,2,2,2,2,6,2,1,2,1,1,1,2,1,1],[1,3,3,3,1,2,2,1,1,1,2,2,4,2,2,4,2,2,1],[1,1,1,1,1,1,1,1,2,1,1,2,2,2,1,2,2,2,1],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1]],[[2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,2,2,2],[2,2,2,2,1,2,2,2,1,1,2,2,1,1,1,1,2,2,1,2,2,2],[2,2,2,2,1,2,2,2,4,2,2,2,1,2,2,4,2,2,1,2,2,2],[2,2,2,2,1,2,2,1,2,1,1,2,1,2,2,2,2,2,1,1,1,1],[2,2,2,2,1,1,2,4,2,2,2,4,2,4,4,1,2,1,2,2,2,1],[2,2,2,2,1,1,1,1,2,2,1,2,2,1,2,4,2,4,2,2,2,1],[1,1,1,1,1,2,2,1,1,1,1,2,2,2,2,1,1,1,3,3,3,1],[1,2,2,2,1,4,2,1,2,2,1,2,1,1,1,1,3,3,3,3,3,1],[1,2,2,2,2,2,2,1,2,2,1,2,1,2,1,1,3,3,3,3,3,1],[1,1,1,1,1,1,2,1,2,2,1,4,2,2,2,1,1,1,3,3,3,1],[2,2,2,1,2,2,2,1,1,2,1,2,4,1,2,2,2,1,3,3,3,1],[2,2,1,1,2,2,2,2,2,2,2,4,2,2,4,1,2,1,1,1,1,1],[2,1,1,2,4,4,4,1,1,2,2,1,2,4,2,2,2,1,2,2,2,2],[2,1,2,2,2,1,2,2,1,2,1,1,1,2,2,1,1,1,2,2,2,2],[2,1,2,2,2,4,2,2,1,4,2,6,1,1,1,1,2,2,2,2,2,2],[2,1,1,1,1,1,2,2,1,2,2,2,1,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2]],[[2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,1,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,1,2,1,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2],[2,1,2,2,2,2,2,2,4,6,1,1,1,1,1,1,2,2,2],[2,1,2,4,2,1,1,4,2,1,1,1,2,2,2,1,2,2,2],[2,1,2,1,1,1,1,2,4,2,2,2,2,4,2,1,2,2,2],[2,1,2,1,1,1,1,1,2,1,2,2,1,4,2,1,1,1,1],[1,1,2,2,1,1,1,1,2,1,1,4,2,2,2,2,2,2,1],[1,2,2,4,1,2,2,4,2,2,1,2,1,1,2,1,1,2,1],[1,2,2,2,2,2,2,2,2,2,1,2,1,3,3,3,1,2,1],[1,1,1,1,1,1,2,2,1,1,1,2,2,3,3,3,2,2,1],[2,2,2,2,2,1,1,1,1,2,1,2,1,3,3,3,1,2,1],[2,2,2,2,2,2,2,2,2,2,1,2,1,1,1,2,1,2,1],[2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1]],[[2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2],[2,2,2,2,2,2,2,1,2,2,1,1,2,2,2,2],[2,2,2,2,2,2,2,1,2,2,2,1,1,2,2,2],[2,2,2,2,2,2,2,1,2,4,4,2,1,1,2,2],[2,2,2,2,2,1,1,1,4,2,2,4,2,1,1,2],[2,2,1,1,1,1,2,2,2,2,4,2,2,2,1,2],[1,1,1,2,2,1,2,1,1,1,1,1,2,2,1,2],[1,2,2,2,2,1,2,1,3,3,3,3,4,2,1,2],[1,2,1,2,2,2,4,2,3,3,3,3,1,2,1,2],[1,2,2,4,2,1,2,1,3,5,3,3,1,2,1,2],[1,1,1,2,2,1,1,1,1,2,1,1,1,2,1,2],[2,2,1,1,1,1,2,6,4,2,2,1,1,4,1,1],[2,2,2,2,2,1,1,1,2,4,2,2,2,2,2,1],[2,2,2,2,2,2,2,1,2,2,1,1,2,2,2,1],[2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1]],[[2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2],[2,2,2,2,2,1,1,3,3,2,2,2,2,1,2,2,2,1,2],[2,2,2,2,1,1,3,3,5,2,4,2,2,2,2,4,2,1,2],[2,2,2,1,1,3,3,5,3,1,2,1,2,1,4,2,1,1,2],[2,2,2,1,3,3,5,3,1,2,1,2,1,2,4,2,2,1,2],[1,1,1,1,3,3,3,1,2,2,1,2,2,2,2,1,2,1,2],[1,2,2,1,1,2,1,2,2,2,2,2,2,2,2,2,2,1,2],[1,2,6,4,2,4,2,1,1,1,2,2,1,2,1,2,1,1,2],[1,2,4,2,2,2,4,2,2,2,1,2,1,2,2,2,1,2,2],[1,1,1,4,4,2,2,2,1,2,1,2,1,2,1,2,1,2,2],[2,2,1,2,2,2,4,2,2,2,1,2,1,2,1,1,1,1,1],[2,2,1,2,4,1,2,1,1,1,1,1,2,2,2,2,2,2,1],[2,2,1,4,2,2,2,1,2,2,2,1,2,2,2,1,2,2,1],[2,2,1,2,2,1,1,1,2,2,2,1,1,2,2,2,2,2,1],[2,2,1,2,2,1,2,2,2,2,2,2,1,2,2,2,2,1,1],[2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,2]],[[2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2],[2,2,2,2,2,1,2,2,2,2,1,1,1,2,2,2,2,1,2,2,2],[2,2,2,2,2,1,2,2,2,2,2,4,2,4,2,2,1,1,1,1,2],[2,2,2,1,1,1,1,2,1,2,2,2,4,2,4,2,2,2,2,1,2],[2,2,1,1,2,4,2,2,1,4,1,1,1,1,2,4,2,4,2,1,2],[1,1,1,2,2,2,1,2,1,2,2,2,1,1,1,2,2,4,2,1,2],[1,2,4,2,2,4,2,2,1,2,2,4,2,2,1,2,1,1,1,1,2],[1,2,1,1,4,1,1,1,1,2,1,4,1,2,2,4,2,2,1,1,1],[1,2,1,1,2,2,1,1,1,2,1,2,1,2,1,2,2,4,2,2,1],[1,2,2,2,2,6,4,2,2,2,4,2,2,2,1,2,4,2,1,2,1],[1,1,1,1,1,2,2,1,2,2,1,1,2,2,1,2,4,1,2,2,1],[2,2,1,3,3,3,2,1,1,1,1,1,4,2,2,1,2,2,1,2,1],[2,2,1,3,3,3,3,3,3,3,1,2,4,4,2,1,4,2,1,2,1],[2,2,1,3,3,3,3,3,3,3,1,2,2,2,2,2,2,2,2,2,1],[2,2,1,3,3,3,3,3,3,3,1,1,1,1,1,1,1,2,2,1,1],[2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,2]],[[1,1,1,1,1,2,1,1,1,1,2,2,2,2,2,2],[1,3,3,3,1,2,1,2,2,1,1,1,1,2,2,2],[1,3,3,3,1,1,1,2,2,4,2,2,1,2,2,2],[1,3,3,3,3,1,1,2,4,2,2,4,1,1,1,2],[1,1,3,3,3,3,1,1,2,2,2,4,2,2,1,2],[1,1,1,3,3,3,2,1,1,2,4,2,4,2,1,2],[1,2,1,1,2,2,2,2,1,2,2,4,2,2,1,2],[1,2,2,1,1,2,1,2,1,1,1,2,1,1,1,1],[1,2,4,2,1,2,1,4,2,2,4,2,2,2,2,1],[1,2,2,4,2,6,2,4,2,2,2,2,4,2,2,1],[1,2,2,2,1,2,4,2,4,4,2,4,2,1,1,1],[1,2,2,1,1,1,1,1,1,2,2,1,1,1,2,2],[1,2,1,1,2,2,2,2,1,1,1,1,2,2,2,2],[1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],[1,1,2,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2],[1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,2,2,2,2,2,2],[1,2,4,1,1,1,2,2,1,1,1,2,2,2,1,2,2,2,2,2,2],[1,3,3,1,2,2,4,1,2,1,2,2,1,2,1,2,2,2,2,2,2],[1,3,3,1,2,2,2,2,2,2,4,4,1,2,1,1,1,2,2,2,2],[1,3,5,1,2,1,2,2,1,4,2,4,2,2,2,2,1,1,1,1,1],[1,3,3,1,2,2,1,1,2,2,2,2,2,1,1,4,1,2,2,2,1],[1,3,5,4,2,2,4,2,1,2,1,1,2,2,4,2,2,2,2,2,1],[1,3,3,1,1,2,2,4,2,2,2,1,2,2,2,1,1,1,1,1,1],[1,3,5,1,1,4,1,1,2,2,2,1,1,1,1,1,2,2,2,2,2],[1,3,3,2,2,4,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2],[1,2,2,1,2,6,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,1,1,1,1,1,1,1,1,1,1],[2,2,2,1,2,2,1,1,1,2,2,2,1],[2,2,2,1,2,4,2,2,2,4,2,2,1],[2,2,2,1,2,2,1,1,1,1,4,1,1],[2,2,2,1,1,2,1,2,2,1,2,2,1],[2,2,1,1,2,2,1,3,5,2,2,2,1],[2,2,1,2,2,1,1,3,3,1,2,2,1],[2,2,1,2,6,2,1,3,5,1,2,1,1],[2,2,1,2,1,4,1,3,3,1,4,2,1],[2,2,1,2,4,2,1,3,3,1,2,2,1],[2,2,1,2,1,2,1,5,5,1,2,2,1],[2,2,1,2,4,2,1,3,3,1,4,1,1],[2,2,1,2,2,2,2,3,5,1,2,2,1],[2,1,1,1,2,2,1,2,2,1,2,2,1],[1,1,2,2,2,2,1,1,1,1,2,2,1],[1,2,2,1,1,1,1,1,1,1,4,1,1],[1,2,4,2,2,2,2,2,2,4,2,2,1],[1,2,2,1,1,2,2,2,1,2,2,2,1],[1,1,1,1,1,1,1,1,1,1,1,1,1]],[[2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2],[2,1,2,2,2,1,1,2,2,1,2,2,2,1,2,2,2,1,2,2,2,1,2],[2,1,2,4,2,2,2,2,2,4,2,2,2,4,2,2,2,4,2,2,2,1,1],[1,1,1,1,1,2,1,2,2,1,2,2,2,1,1,1,2,1,1,4,1,1,1],[1,2,2,2,1,2,1,1,4,1,1,1,1,1,1,2,2,2,1,2,2,2,1],[1,2,4,2,2,2,1,2,3,3,3,3,3,3,1,2,2,2,1,2,4,2,1],[1,1,2,1,2,2,1,2,3,3,3,3,3,3,1,1,1,1,1,2,2,2,1],[1,1,2,1,1,1,1,1,1,1,1,1,3,3,1,2,2,2,1,2,1,1,1],[1,2,2,2,2,2,2,2,2,2,2,1,3,3,1,2,4,2,2,2,1,2,2],[1,2,1,1,2,1,1,1,2,1,1,1,3,3,1,1,2,1,2,2,1,1,1],[1,2,1,2,2,2,1,2,2,2,1,1,3,3,1,1,2,1,1,1,2,2,1],[1,2,2,2,6,2,2,2,2,2,2,4,3,3,1,2,2,2,2,2,2,2,1],[1,2,1,2,2,2,1,2,2,2,1,1,2,2,1,2,2,2,1,1,2,2,1],[1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1],[1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,2,2,2,2,4,2,1],[1,2,4,2,2,1,2,4,2,4,2,4,2,2,2,1,2,1,2,2,2,2,1],[1,2,1,4,1,1,2,4,1,2,2,1,1,2,1,1,2,2,2,2,1,2,1],[1,2,2,4,2,4,4,2,1,1,1,1,2,4,2,2,4,2,1,2,1,2,1],[1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,2,2,2,2,2,2,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],[[2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1],[1,2,2,2,2,4,2,1,2,2,2,2,2,2,1,1,2,1,2,2,2,1],[1,2,2,1,1,1,1,1,1,2,1,1,1,2,2,1,4,1,1,2,1,1],[1,1,4,1,2,2,2,1,1,4,1,3,3,3,3,2,2,2,1,2,1,2],[1,2,2,1,2,2,2,2,4,2,1,3,3,3,3,1,1,2,1,2,1,2],[1,2,4,2,1,2,1,2,1,2,1,3,3,3,3,1,1,2,2,2,1,2],[1,2,4,2,1,4,4,2,2,2,1,3,3,3,3,1,1,4,1,2,1,2],[1,2,1,2,4,6,4,1,1,4,1,3,3,3,3,1,1,2,2,2,1,2],[1,2,2,2,4,4,4,2,2,2,1,3,3,3,3,1,2,2,2,2,1,2],[1,2,2,4,1,2,2,2,1,2,1,1,1,1,1,1,2,4,1,1,1,2],[1,1,2,2,1,2,1,1,1,4,4,2,2,4,2,2,2,4,2,1,2,2],[1,1,2,2,2,2,2,1,2,4,2,2,4,2,1,1,2,2,2,1,2,2],[2,1,1,1,1,1,2,2,2,1,2,2,2,1,1,1,1,1,1,1,2,2],[2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2]],[[1,1,1,1,1,1,1,1,1,1,2,2,2,2],[1,2,2,2,2,2,2,2,2,1,1,1,1,2],[1,2,1,1,1,1,1,1,2,1,2,2,1,1],[1,2,1,2,4,2,4,2,4,2,2,4,2,1],[1,2,2,2,2,2,2,2,1,4,2,2,2,1],[1,1,1,4,2,2,4,4,1,2,2,1,1,1],[2,2,1,2,2,1,1,2,1,2,4,1,1,2],[2,2,1,1,4,1,2,2,2,4,2,6,1,2],[2,2,2,1,2,2,4,2,4,2,1,1,1,2],[2,2,2,1,2,1,2,2,2,4,2,2,1,2],[2,2,2,1,2,1,1,2,2,2,1,2,1,2],[2,2,1,1,2,2,1,1,1,1,1,2,1,2],[2,2,1,2,2,2,2,2,2,2,2,2,1,2],[2,2,1,3,3,3,3,3,3,3,1,1,1,2],[2,2,1,3,3,3,3,3,3,3,1,2,2,2],[2,2,1,1,1,1,1,1,1,1,1,2,2,2]],[[2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2],[2,1,1,1,1,1,1,1,1,1,2,2,1,1,2,2,2,2],[1,1,2,2,4,2,2,2,2,2,2,4,2,1,1,1,1,1],[1,2,2,2,1,1,2,1,1,2,2,2,1,1,3,3,3,1],[1,2,1,4,4,2,4,2,4,4,1,4,1,1,3,3,3,1],[1,2,1,2,2,2,2,6,2,2,1,2,2,2,3,3,3,1],[1,2,2,4,1,2,1,1,1,4,4,2,2,2,3,3,3,1],[1,2,4,2,2,4,4,2,2,4,2,1,1,3,3,3,3,1],[1,1,1,4,2,2,2,2,2,2,2,1,1,1,1,1,1,1],[2,2,1,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2],[2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,1,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,2,2,1,1,2,1,2,2,1,1,1,1,1,2,2,2],[2,2,2,2,2,2,2,2,2,2,1,2,2,2,5,3,1,3,3,1,2,2,2,1,2,2,2],[2,1,1,1,1,1,2,1,1,1,1,2,4,1,3,1,3,3,3,2,2,2,2,1,2,2,2],[2,1,2,2,2,1,1,1,2,2,1,1,2,1,5,3,3,3,3,1,1,2,1,1,2,2,2],[2,1,2,4,2,2,2,2,2,2,1,1,2,1,3,3,1,3,3,1,1,2,1,2,2,2,2],[1,1,1,1,1,1,2,1,2,2,2,1,2,1,5,3,1,1,1,1,1,2,1,2,2,2,2],[1,2,2,2,1,2,4,1,4,1,2,1,2,1,3,3,1,1,1,1,1,2,1,2,2,2,2],[1,2,4,2,2,4,2,2,2,2,2,1,2,1,5,3,2,2,2,2,1,2,1,2,2,2,2],[1,1,2,1,1,2,2,4,2,1,1,1,2,1,2,2,1,1,2,2,1,2,1,2,2,2,2],[2,1,2,2,4,2,2,4,2,1,1,1,2,1,1,1,1,1,2,1,1,2,1,2,2,2,2],[2,1,1,1,4,1,1,1,4,1,1,1,2,2,1,1,1,1,2,1,1,2,1,2,2,2,2],[1,1,1,1,2,1,2,2,2,2,2,2,2,2,2,1,1,1,2,2,1,2,1,2,2,2,2],[1,2,2,4,2,1,2,2,4,1,1,1,1,2,2,1,1,1,4,4,1,6,1,1,1,1,1],[1,2,2,2,2,2,2,4,2,1,2,1,2,2,1,1,1,1,2,2,1,4,1,2,2,2,1],[1,1,1,1,2,1,2,2,4,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1],[2,2,2,1,2,2,4,2,2,1,2,1,1,2,2,1,1,2,2,1,1,1,1,1,1,1,1],[2,2,2,1,1,2,2,1,1,1,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2],[2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]],[[2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,1,2,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2],[2,2,2,1,1,1,1,1,1,1,2,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2],[2,2,2,1,2,2,2,1,2,1,2,1,2,1,2,1,2,2,2,1,1,2,2,2,2,2,2,2,2],[2,2,2,1,2,4,2,2,2,2,2,4,2,2,1,1,2,2,4,2,1,2,2,2,2,2,2,2,2],[2,2,1,1,1,2,4,1,2,1,2,2,1,2,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1],[2,2,1,2,2,4,2,2,1,2,2,4,1,2,1,2,4,4,2,1,2,2,2,1,2,1,2,2,1],[2,1,1,2,1,2,2,2,1,2,2,2,2,2,1,1,1,2,2,2,2,4,2,1,2,1,2,2,1],[2,1,2,2,1,4,2,2,2,1,2,1,1,1,2,2,1,2,2,1,2,4,4,1,2,1,2,2,1],[2,1,2,2,2,2,4,1,1,2,4,2,2,1,2,2,2,1,1,2,4,2,2,1,2,1,2,1,1],[1,1,1,1,4,2,4,2,1,2,2,2,2,1,1,2,2,1,2,2,2,4,2,2,2,2,3,3,1],[1,2,2,1,2,2,2,2,1,1,1,2,1,2,4,2,4,2,1,1,1,2,2,1,1,1,3,5,1],[1,2,2,2,2,2,1,1,2,2,4,4,2,6,2,2,4,2,2,2,2,2,1,1,3,3,3,3,1],[1,2,2,1,1,2,2,1,1,2,2,2,4,2,2,1,4,1,2,2,1,1,3,3,3,3,5,3,1],[1,1,2,1,2,2,4,2,2,1,2,1,2,4,1,1,2,2,1,1,3,3,3,3,5,3,1,1,1],[1,1,2,1,1,2,2,4,2,2,1,2,4,2,1,2,2,1,3,3,3,3,5,3,1,1,1,2,2],[1,2,2,2,2,4,2,1,1,1,1,2,2,2,1,2,3,3,3,3,5,3,1,1,1,2,2,2,2],[1,2,2,2,1,2,2,1,2,2,1,2,2,1,2,2,3,3,5,3,1,1,1,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2]],]
+
+MAPPING = {
+ 0: ' ',
+ 1: '#',
+ 2: '.',
+ 3: 'O',
+ 4: 'X',
+ 5: '%',
+ 6: '@',
+ 7: 'A'
+}
+
+
+def blank_outside(map):
+ flipped = True
+
+ h = len(map)
+ w = len(map[0])
+
+ while flipped:
+ flipped = False
+
+ for y, row in enumerate(map):
+ for x, tile in enumerate(row):
+ if tile == 2 and (x in [0, w-1] or y in [0, h-1]):
+ map[y][x] = 0
+ flipped = True
+ elif tile == 2 and 0 in [map[y-1][x], map[y+1][x], map[y][x-1], map[y][x+1]]:
+ map[y][x] = 0
+ flipped = True
+
+ return map
+
+
+def main():
+ for i, map in enumerate(maps):
+ map = blank_outside(map)
+ with open(f'{i+1:02}.sokolvl', 'w+') as f:
+ f.write(';version: 1\n')
+ f.write(f';name: {i+1:02}\n\n')
+
+ for row in map:
+ for tile in row:
+ f.write(MAPPING[tile])
+ f.write('\n')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/LoadingScreen.gd b/LoadingScreen.gd
new file mode 100644
index 0000000..c49c44e
--- /dev/null
+++ b/LoadingScreen.gd
@@ -0,0 +1,77 @@
+extends CanvasLayer
+
+onready var animate: AnimationPlayer = $animate
+onready var progress = $Container/occluder/Progressbar
+onready var tween = $Container/Tween
+onready var fade = $fade
+var queued = false
+
+const distance = 150
+
+signal startup_complete
+
+
+func _ready():
+ setup_curve(center($Container/occluder), $Container/Path)
+ # sets up the curve with the return value from the centering of the occluder
+
+
+func setup_curve(center, path):
+ var curve := Curve2D.new()
+ curve.clear_points()
+
+ var top_left = center + Vector2(-distance, -distance)
+ var bottom_left = center + Vector2(-distance, distance)
+ var top_right = center + Vector2(distance, -distance)
+ var bottom_right = center + Vector2(distance, distance)
+
+ for corner in [top_left, top_right, bottom_right, bottom_left, top_left]:
+ curve.add_point(corner)
+
+ path.set_curve(curve)
+
+
+func center(node):
+ node.position = $Container.get_viewport_rect().size / 2
+ return node.position
+
+
+func startup():
+ Utils._set_disable_inputs(true)
+ fade.play("Fadein")
+ animate.play("Animate")
+ yield(fade, "animation_finished")
+ emit_signal("startup_complete")
+ increment_progress()
+
+
+func exit():
+ if tween.is_active():
+ queued = true
+ yield(tween, "tween_all_completed")
+ tween_progress(progress.value, 100, Vector2(.1, .5))
+ yield(tween, "tween_all_completed")
+ fade.play("Fadeout")
+ Utils._set_disable_inputs(false)
+
+
+func _exit_tree():
+ Utils._set_disable_inputs(false)
+
+
+func tween_progress(old: float, new: float, length_range: Vector2):
+ tween.interpolate_property(
+ progress,
+ "value",
+ old,
+ new,
+ rand_range(length_range.x, length_range.y),
+ Tween.TRANS_LINEAR,
+ Tween.EASE_IN_OUT
+ )
+ tween.start()
+
+
+func increment_progress():
+ if not tween.is_active() and not queued:
+ tween_progress(progress.value, progress.value + round(rand_range(5, 25)), Vector2(1, 2))
diff --git a/LoadingScreen.tscn b/LoadingScreen.tscn
new file mode 100644
index 0000000..b8cc772
--- /dev/null
+++ b/LoadingScreen.tscn
@@ -0,0 +1,333 @@
+[gd_scene load_steps=17 format=2]
+
+[ext_resource path="res://theme.tres" type="Theme" id=1]
+[ext_resource path="res://04B_19__.TTF" type="DynamicFontData" id=2]
+[ext_resource path="res://light2.png" type="Texture" id=3]
+[ext_resource path="res://PlayerWalk.tscn" type="PackedScene" id=4]
+[ext_resource path="res://LoadingScreen.gd" type="Script" id=6]
+[ext_resource path="res://Back.tscn" type="PackedScene" id=7]
+
+[sub_resource type="Shader" id=31]
+code = "shader_type canvas_item;
+
+uniform vec4 fore_color : hint_color = vec4(0.5, 0.75, 1.0, 1.0);
+uniform vec4 back_color : hint_color = vec4(1.0, 1.0, 1.0, 1.0);
+
+void fragment()
+{
+ float aspect = (1.0 / TEXTURE_PIXEL_SIZE).y/(1.0 / TEXTURE_PIXEL_SIZE).x;
+ float value;
+ vec2 uv = UV.xy / (1.0 / TEXTURE_PIXEL_SIZE).x;
+ uv -= vec2(0.5, 0.5*aspect);
+ float rot = radians(45.0); // radians(45.0*sin(iTime));
+ vec2 part1 = vec2(cos(rot), -sin(rot));
+ vec2 part2 = vec2(sin(rot), cos(rot));
+ mat2 m = mat2(part1, part2);
+ uv = m * uv;
+ uv += vec2(0.5, 0.5*aspect);
+ uv.y+=0.5*(1.0-aspect);
+ vec2 pos = 10.0*uv;
+ vec2 rep = fract(pos);
+ float dist = 2.0*min(min(rep.x, 1.0-rep.x), min(rep.y, 1.0-rep.y));
+ float squareDist = length((floor(pos)+vec2(0.5)) - vec2(5.0) );
+ float edge = sin(TIME-squareDist*0.5)*0.5+0.5;
+ edge = (TIME-squareDist*0.5)*0.5;
+ edge = 2.0*fract(edge*0.5);
+ value = fract (dist*2.0);
+ value = mix(value, 1.0-value, step(1.0, edge));
+ edge = pow(abs(1.0-edge), 2.0);
+ value = smoothstep( edge-0.05, edge, 0.95*value);
+ value += squareDist*.1;
+ COLOR = mix(back_color, fore_color, value);
+ //COLOR.a = 0.25*clamp(value, 0.0, 1.0);
+}"
+
+[sub_resource type="ShaderMaterial" id=32]
+shader = SubResource( 31 )
+shader_param/fore_color = Color( 0.5, 0.75, 1, 1 )
+shader_param/back_color = Color( 1, 1, 1, 1 )
+
+[sub_resource type="OccluderPolygon2D" id=4]
+polygon = PoolVector2Array( -48, -48, -48, 48, 48, 48, 48, -48 )
+
+[sub_resource type="DynamicFont" id=3]
+size = 42
+font_data = ExtResource( 2 )
+
+[sub_resource type="Animation" id=29]
+resource_name = "Animate"
+length = 5.0
+loop = true
+tracks/0/type = "value"
+tracks/0/path = NodePath(".:unit_offset")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 5 ),
+"transitions": PoolRealArray( 1, 1 ),
+"update": 0,
+"values": [ 0.0, 1.0 ]
+}
+
+[sub_resource type="Animation" id=30]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath(".:offset")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ 0.0 ]
+}
+
+[sub_resource type="Animation" id=28]
+resource_name = "Fadein"
+step = 0.05
+tracks/0/type = "value"
+tracks/0/path = NodePath("Container:modulate")
+tracks/0/interp = 2
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 1 ),
+"transitions": PoolRealArray( -2, -2 ),
+"update": 0,
+"values": [ Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 1 ) ]
+}
+
+[sub_resource type="Animation" id=26]
+resource_name = "Fadeout"
+tracks/0/type = "method"
+tracks/0/path = NodePath(".")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 1 ),
+"transitions": PoolRealArray( 1 ),
+"values": [ {
+"args": [ ],
+"method": "queue_free"
+} ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Container:modulate")
+tracks/1/interp = 2
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 1 ),
+"transitions": PoolRealArray( -2, -2 ),
+"update": 0,
+"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ]
+}
+tracks/2/type = "value"
+tracks/2/path = NodePath("Container/Path/PathFollow/Light:energy")
+tracks/2/interp = 2
+tracks/2/loop_wrap = true
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/keys = {
+"times": PoolRealArray( -0.025, 0.975 ),
+"transitions": PoolRealArray( -2, -2 ),
+"update": 0,
+"values": [ 1.0, 0.0 ]
+}
+
+[sub_resource type="Animation" id=27]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath("Container:modulate")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ Color( 1, 1, 1, 0 ) ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Container/Path/PathFollow/Light:energy")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ 1.0 ]
+}
+
+[sub_resource type="Animation" id=1]
+resource_name = "Animate"
+length = 2.0
+loop = true
+tracks/0/type = "value"
+tracks/0/path = NodePath("Container/occluder/LoadLabel:rect_rotation")
+tracks/0/interp = 2
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 1 ),
+"transitions": PoolRealArray( -2, -2 ),
+"update": 0,
+"values": [ 24.7415, -30.2945 ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Container/occluder/LoadLabel:percent_visible")
+tracks/1/interp = 2
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 0.9, 1.2 ),
+"transitions": PoolRealArray( 1, -2, -2 ),
+"update": 0,
+"values": [ 0.2, 1.0, 1.0 ]
+}
+tracks/2/type = "value"
+tracks/2/path = NodePath("Container/occluder/LoadLabel:rect_scale")
+tracks/2/interp = 2
+tracks/2/loop_wrap = true
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/keys = {
+"times": PoolRealArray( 0.3, 1.3 ),
+"transitions": PoolRealArray( 1, 1 ),
+"update": 0,
+"values": [ Vector2( 1.5, 1.5 ), Vector2( 0.75, 0.75 ) ]
+}
+tracks/3/type = "value"
+tracks/3/path = NodePath("Container/occluder/LoadLabel:custom_colors/font_color")
+tracks/3/interp = 2
+tracks/3/loop_wrap = true
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/keys = {
+"times": PoolRealArray( 0, 0.4, 0.9, 1.4 ),
+"transitions": PoolRealArray( -2, -2, -2, -2 ),
+"update": 0,
+"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 0.588235, 1 ), Color( 1, 0.588235, 1, 1 ), Color( 0.588235, 1, 1, 1 ) ]
+}
+tracks/4/type = "method"
+tracks/4/path = NodePath(".")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/keys = {
+"times": PoolRealArray( 1.4 ),
+"transitions": PoolRealArray( 1 ),
+"values": [ {
+"args": [ ],
+"method": "increment_progress"
+} ]
+}
+
+[node name="LoadScreen" type="CanvasLayer"]
+layer = 2
+script = ExtResource( 6 )
+
+[node name="Container" type="Control" parent="."]
+modulate = Color( 1, 1, 1, 0 )
+anchor_right = 1.0
+anchor_bottom = 1.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Back" parent="Container" instance=ExtResource( 7 )]
+material = SubResource( 32 )
+
+[node name="occluder" type="LightOccluder2D" parent="Container"]
+position = Vector2( 160, 160 )
+occluder = SubResource( 4 )
+
+[node name="Polygon2D" type="Polygon2D" parent="Container/occluder"]
+position = Vector2( -20, -20 )
+color = Color( 0, 0, 0, 1 )
+polygon = PoolVector2Array( -28, -28, 68, -28, 68, 68, -28, 68 )
+
+[node name="LoadLabel" type="Label" parent="Container/occluder"]
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+margin_left = -81.0
+margin_top = -21.0
+margin_right = 81.0
+margin_bottom = 21.0
+rect_rotation = -28.9766
+rect_scale = Vector2( 0.789688, 0.789688 )
+rect_pivot_offset = Vector2( 83.8821, 21.1559 )
+custom_colors/font_color = Color( 0.701299, 0.886936, 1, 1 )
+custom_colors/font_color_shadow = Color( 0.188235, 0.294118, 0.411765, 1 )
+custom_fonts/font = SubResource( 3 )
+text = "Loading!"
+align = 1
+valign = 1
+percent_visible = 0.999728
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Progressbar" type="ProgressBar" parent="Container/occluder"]
+margin_left = -64.0
+margin_top = 64.0
+margin_right = 64.0
+margin_bottom = 96.0
+rect_min_size = Vector2( 40, 0 )
+theme = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="PlayerSprite" parent="Container" instance=ExtResource( 4 )]
+position = Vector2( 0, 256 )
+
+[node name="Tween" type="Tween" parent="Container"]
+
+[node name="Path" type="Path2D" parent="Container"]
+curve = null
+
+[node name="PathFollow" type="PathFollow2D" parent="Container/Path"]
+lookahead = 2.0
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="Container/Path/PathFollow"]
+autoplay = "Animate"
+anims/Animate = SubResource( 29 )
+anims/RESET = SubResource( 30 )
+
+[node name="Light" type="Light2D" parent="Container/Path/PathFollow"]
+texture = ExtResource( 3 )
+color = Color( 0.321569, 0.745098, 0.745098, 1 )
+range_layer_min = -2
+range_layer_max = 2
+shadow_enabled = true
+shadow_gradient_length = 4.0
+shadow_filter = 3
+shadow_filter_smooth = 11.1
+__meta__ = {
+"_editor_description_": ""
+}
+
+[node name="fade" type="AnimationPlayer" parent="."]
+anims/Fadein = SubResource( 28 )
+anims/Fadeout = SubResource( 26 )
+anims/RESET = SubResource( 27 )
+
+[node name="animate" type="AnimationPlayer" parent="."]
+anims/Animate = SubResource( 1 )
diff --git a/MainInstances.gd b/MainInstances.gd
new file mode 100644
index 0000000..2b56f72
--- /dev/null
+++ b/MainInstances.gd
@@ -0,0 +1,5 @@
+extends Node
+
+var console
+var world
+var stopwatch
diff --git a/MobileInputs.tscn b/MobileInputs.tscn
new file mode 100644
index 0000000..e64387e
--- /dev/null
+++ b/MobileInputs.tscn
@@ -0,0 +1,56 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://arrow.png" type="Texture" id=1]
+
+[sub_resource type="CircleShape2D" id=1]
+radius = 6.0
+
+[node name="MobileInputs" type="CanvasLayer"]
+
+[node name="Node2d" type="Node2D" parent="."]
+
+[node name="Floor" type="Sprite" parent="Node2d"]
+self_modulate = Color( 0, 0, 0, 1 )
+position = Vector2( 50, 227 )
+rotation = -3.14159
+scale = Vector2( 1.5, 1.5 )
+
+[node name="Left" type="TouchScreenButton" parent="Node2d/Floor"]
+position = Vector2( 9, -7 )
+rotation = -6.3573e-08
+scale = Vector2( 2, 2 )
+normal = ExtResource( 1 )
+shape = SubResource( 1 )
+passby_press = true
+action = "ui_left"
+visibility_mode = 1
+
+[node name="Right" type="TouchScreenButton" parent="Node2d/Floor"]
+position = Vector2( -9, 7 )
+rotation = 3.14159
+scale = Vector2( 2, 2 )
+normal = ExtResource( 1 )
+shape = SubResource( 1 )
+passby_press = true
+action = "ui_right"
+visibility_mode = 1
+
+[node name="Down" type="TouchScreenButton" parent="Node2d/Floor"]
+position = Vector2( -7, -9 )
+rotation = -1.5708
+scale = Vector2( 2, 2 )
+normal = ExtResource( 1 )
+shape = SubResource( 1 )
+passby_press = true
+action = "ui_right"
+visibility_mode = 1
+
+[node name="Up" type="TouchScreenButton" parent="Node2d/Floor"]
+position = Vector2( 7, 9 )
+rotation = 1.5708
+scale = Vector2( 2, 2 )
+normal = ExtResource( 1 )
+shape = SubResource( 1 )
+passby_press = true
+action = "ui_right"
+visibility_mode = 1
diff --git a/Music.gd b/Music.gd
new file mode 100644
index 0000000..064a2b7
--- /dev/null
+++ b/Music.gd
@@ -0,0 +1,82 @@
+extends Node
+
+export(Array, AudioStream) var music_list = []
+
+var music_index = 0
+var lowering_sound = false
+const min_vol_db = -17
+
+onready var musicPlayer = $AudioStreamPlayer
+onready var tween = $Tween
+
+
+func _ready():
+ music_list.shuffle()
+ list_play()
+
+
+func list_play():
+ assert(music_list.size() > 0)
+ musicPlayer.stream = music_list[music_index]
+ musicPlayer.play()
+ music_index += 1
+ if music_index == music_list.size():
+ music_index = 0
+
+ tween.interpolate_property(
+ musicPlayer,
+ "volume_db",
+ musicPlayer.volume_db,
+ min_vol_db,
+ 40,
+ Tween.TRANS_LINEAR,
+ Tween.EASE_IN_OUT
+ )
+
+
+func lower_sound():
+ lowering_sound = true
+ var new_vol = musicPlayer.volume_db
+ new_vol -= 10
+ tween.interpolate_property(
+ musicPlayer,
+ "volume_db",
+ musicPlayer.volume_db,
+ new_vol,
+ .5,
+ tween.TRANS_LINEAR,
+ tween.EASE_IN_OUT
+ )
+ tween.start()
+
+
+func continue_playback():
+ lowering_sound = false
+ _on_Timer_timeout()
+
+
+func list_stop():
+ musicPlayer.stop()
+
+
+func _on_AudioStreamPlayer_finished():
+ music_list.shuffle()
+ list_play()
+
+
+func _on_Timer_timeout():
+ var new_pitch = rand_range(.9, 1.1)
+ tween.interpolate_property(
+ musicPlayer,
+ "pitch_scale",
+ musicPlayer.pitch_scale,
+ new_pitch,
+ 1,
+ tween.TRANS_LINEAR,
+ tween.EASE_IN_OUT
+ )
+ tween.start()
+# if not lowering_sound:
+# var new_vol = rand_range(-8, -12)
+# tween.interpolate_property(musicPlayer, "volume_db", musicPlayer.volume_db, new_vol, .5, tween.TRANS_LINEAR, tween.EASE_IN_OUT)
+# tween.start()
diff --git a/Music.tscn b/Music.tscn
new file mode 100644
index 0000000..723e65f
--- /dev/null
+++ b/Music.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://Music.gd" type="Script" id=2]
+[ext_resource path="res://lite_music.wav" type="AudioStream" id=3]
+
+[node name="Music" type="Node"]
+pause_mode = 2
+script = ExtResource( 2 )
+music_list = [ ExtResource( 3 ) ]
+
+[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
+stream = ExtResource( 3 )
+
+[node name="Timer" type="Timer" parent="."]
+wait_time = 2.5
+autostart = true
+
+[node name="Tween" type="Tween" parent="."]
+
+[connection signal="finished" from="AudioStreamPlayer" to="." method="_on_AudioStreamPlayer_finished"]
+[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
diff --git a/Others.tscn b/Others.tscn
new file mode 100644
index 0000000..650e99c
--- /dev/null
+++ b/Others.tscn
@@ -0,0 +1,363 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://decoration.png" type="Texture" id=1]
+
+[sub_resource type="TileSet" id=1]
+0/name = "decoration.png 0"
+0/texture = ExtResource( 1 )
+0/tex_offset = Vector2( 0, 0 )
+0/modulate = Color( 1, 1, 1, 1 )
+0/region = Rect2( 80, 16, 16, 16 )
+0/tile_mode = 0
+0/occluder_offset = Vector2( 0, 0 )
+0/navigation_offset = Vector2( 0, 0 )
+0/shape_offset = Vector2( 0, 0 )
+0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+0/shape_one_way = false
+0/shape_one_way_margin = 0.0
+0/shapes = [ ]
+0/z_index = 0
+1/name = "decoration.png 1"
+1/texture = ExtResource( 1 )
+1/tex_offset = Vector2( 0, 0 )
+1/modulate = Color( 1, 1, 1, 1 )
+1/region = Rect2( 64, 16, 16, 16 )
+1/tile_mode = 0
+1/occluder_offset = Vector2( 0, 0 )
+1/navigation_offset = Vector2( 0, 0 )
+1/shape_offset = Vector2( 0, 0 )
+1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+1/shape_one_way = false
+1/shape_one_way_margin = 0.0
+1/shapes = [ ]
+1/z_index = 0
+2/name = "decoration.png 2"
+2/texture = ExtResource( 1 )
+2/tex_offset = Vector2( 0, 0 )
+2/modulate = Color( 1, 1, 1, 1 )
+2/region = Rect2( 64, 32, 16, 16 )
+2/tile_mode = 0
+2/occluder_offset = Vector2( 0, 0 )
+2/navigation_offset = Vector2( 0, 0 )
+2/shape_offset = Vector2( 0, 0 )
+2/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+2/shape_one_way = false
+2/shape_one_way_margin = 0.0
+2/shapes = [ ]
+2/z_index = 0
+3/name = "decoration.png 3"
+3/texture = ExtResource( 1 )
+3/tex_offset = Vector2( 0, 0 )
+3/modulate = Color( 1, 1, 1, 1 )
+3/region = Rect2( 80, 32, 16, 16 )
+3/tile_mode = 0
+3/occluder_offset = Vector2( 0, 0 )
+3/navigation_offset = Vector2( 0, 0 )
+3/shape_offset = Vector2( 0, 0 )
+3/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+3/shape_one_way = false
+3/shape_one_way_margin = 0.0
+3/shapes = [ ]
+3/z_index = 0
+4/name = "decoration.png 4"
+4/texture = ExtResource( 1 )
+4/tex_offset = Vector2( 0, 0 )
+4/modulate = Color( 1, 1, 1, 1 )
+4/region = Rect2( 48, 16, 16, 16 )
+4/tile_mode = 0
+4/occluder_offset = Vector2( 0, 0 )
+4/navigation_offset = Vector2( 0, 0 )
+4/shape_offset = Vector2( 0, 0 )
+4/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+4/shape_one_way = false
+4/shape_one_way_margin = 0.0
+4/shapes = [ ]
+4/z_index = 0
+5/name = "decoration.png 5"
+5/texture = ExtResource( 1 )
+5/tex_offset = Vector2( 0, 0 )
+5/modulate = Color( 1, 1, 1, 1 )
+5/region = Rect2( 32, 16, 16, 16 )
+5/tile_mode = 0
+5/occluder_offset = Vector2( 0, 0 )
+5/navigation_offset = Vector2( 0, 0 )
+5/shape_offset = Vector2( 0, 0 )
+5/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+5/shape_one_way = false
+5/shape_one_way_margin = 0.0
+5/shapes = [ ]
+5/z_index = 0
+6/name = "decoration.png 6"
+6/texture = ExtResource( 1 )
+6/tex_offset = Vector2( 0, 0 )
+6/modulate = Color( 1, 1, 1, 1 )
+6/region = Rect2( 48, 32, 16, 16 )
+6/tile_mode = 0
+6/occluder_offset = Vector2( 0, 0 )
+6/navigation_offset = Vector2( 0, 0 )
+6/shape_offset = Vector2( 0, 0 )
+6/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+6/shape_one_way = false
+6/shape_one_way_margin = 0.0
+6/shapes = [ ]
+6/z_index = 0
+7/name = "decoration.png 7"
+7/texture = ExtResource( 1 )
+7/tex_offset = Vector2( 0, 0 )
+7/modulate = Color( 1, 1, 1, 1 )
+7/region = Rect2( 32, 32, 16, 16 )
+7/tile_mode = 0
+7/occluder_offset = Vector2( 0, 0 )
+7/navigation_offset = Vector2( 0, 0 )
+7/shape_offset = Vector2( 0, 0 )
+7/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+7/shape_one_way = false
+7/shape_one_way_margin = 0.0
+7/shapes = [ ]
+7/z_index = 0
+8/name = "decoration.png 8"
+8/texture = ExtResource( 1 )
+8/tex_offset = Vector2( 0, 0 )
+8/modulate = Color( 1, 1, 1, 1 )
+8/region = Rect2( 80, 48, 16, 32 )
+8/tile_mode = 0
+8/occluder_offset = Vector2( 0, 0 )
+8/navigation_offset = Vector2( 0, 0 )
+8/shape_offset = Vector2( 0, 0 )
+8/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+8/shape_one_way = false
+8/shape_one_way_margin = 0.0
+8/shapes = [ ]
+8/z_index = 0
+9/name = "decoration.png 9"
+9/texture = ExtResource( 1 )
+9/tex_offset = Vector2( 0, 0 )
+9/modulate = Color( 1, 1, 1, 1 )
+9/region = Rect2( 48, 48, 32, 32 )
+9/tile_mode = 0
+9/occluder_offset = Vector2( 0, 0 )
+9/navigation_offset = Vector2( 0, 0 )
+9/shape_offset = Vector2( 0, 0 )
+9/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+9/shape_one_way = false
+9/shape_one_way_margin = 0.0
+9/shapes = [ ]
+9/z_index = 0
+10/name = "decoration.png 10"
+10/texture = ExtResource( 1 )
+10/tex_offset = Vector2( 0, 0 )
+10/modulate = Color( 1, 1, 1, 1 )
+10/region = Rect2( 32, 48, 16, 32 )
+10/tile_mode = 0
+10/occluder_offset = Vector2( 0, 0 )
+10/navigation_offset = Vector2( 0, 0 )
+10/shape_offset = Vector2( 0, 0 )
+10/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+10/shape_one_way = false
+10/shape_one_way_margin = 0.0
+10/shapes = [ ]
+10/z_index = 0
+11/name = "decoration.png 11"
+11/texture = ExtResource( 1 )
+11/tex_offset = Vector2( 0, 0 )
+11/modulate = Color( 1, 1, 1, 1 )
+11/region = Rect2( 16, 48, 16, 32 )
+11/tile_mode = 0
+11/occluder_offset = Vector2( 0, 0 )
+11/navigation_offset = Vector2( 0, 0 )
+11/shape_offset = Vector2( 0, 0 )
+11/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+11/shape_one_way = false
+11/shape_one_way_margin = 0.0
+11/shapes = [ ]
+11/z_index = 0
+12/name = "decoration.png 12"
+12/texture = ExtResource( 1 )
+12/tex_offset = Vector2( 0, 0 )
+12/modulate = Color( 1, 1, 1, 1 )
+12/region = Rect2( 64, 80, 32, 32 )
+12/tile_mode = 0
+12/occluder_offset = Vector2( 0, 0 )
+12/navigation_offset = Vector2( 0, 0 )
+12/shape_offset = Vector2( 0, 0 )
+12/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+12/shape_one_way = false
+12/shape_one_way_margin = 0.0
+12/shapes = [ ]
+12/z_index = 0
+13/name = "decoration.png 13"
+13/texture = ExtResource( 1 )
+13/tex_offset = Vector2( 0, 0 )
+13/modulate = Color( 1, 1, 1, 1 )
+13/region = Rect2( 80, 112, 16, 16 )
+13/tile_mode = 0
+13/occluder_offset = Vector2( 0, 0 )
+13/navigation_offset = Vector2( 0, 0 )
+13/shape_offset = Vector2( 0, 0 )
+13/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+13/shape_one_way = false
+13/shape_one_way_margin = 0.0
+13/shapes = [ ]
+13/z_index = 0
+14/name = "decoration.png 14"
+14/texture = ExtResource( 1 )
+14/tex_offset = Vector2( 0, 0 )
+14/modulate = Color( 1, 1, 1, 1 )
+14/region = Rect2( 64, 112, 16, 16 )
+14/tile_mode = 0
+14/occluder_offset = Vector2( 0, 0 )
+14/navigation_offset = Vector2( 0, 0 )
+14/shape_offset = Vector2( 0, 0 )
+14/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+14/shape_one_way = false
+14/shape_one_way_margin = 0.0
+14/shapes = [ ]
+14/z_index = 0
+15/name = "decoration.png 15"
+15/texture = ExtResource( 1 )
+15/tex_offset = Vector2( 0, 0 )
+15/modulate = Color( 1, 1, 1, 1 )
+15/region = Rect2( 48, 80, 16, 16 )
+15/tile_mode = 0
+15/occluder_offset = Vector2( 0, 0 )
+15/navigation_offset = Vector2( 0, 0 )
+15/shape_offset = Vector2( 0, 0 )
+15/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+15/shape_one_way = false
+15/shape_one_way_margin = 0.0
+15/shapes = [ ]
+15/z_index = 0
+16/name = "decoration.png 16"
+16/texture = ExtResource( 1 )
+16/tex_offset = Vector2( 0, 0 )
+16/modulate = Color( 1, 1, 1, 1 )
+16/region = Rect2( 32, 80, 16, 16 )
+16/tile_mode = 0
+16/occluder_offset = Vector2( 0, 0 )
+16/navigation_offset = Vector2( 0, 0 )
+16/shape_offset = Vector2( 0, 0 )
+16/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+16/shape_one_way = false
+16/shape_one_way_margin = 0.0
+16/shapes = [ ]
+16/z_index = 0
+17/name = "decoration.png 17"
+17/texture = ExtResource( 1 )
+17/tex_offset = Vector2( 0, 0 )
+17/modulate = Color( 1, 1, 1, 1 )
+17/region = Rect2( 96, 16, 16, 16 )
+17/tile_mode = 0
+17/occluder_offset = Vector2( 0, 0 )
+17/navigation_offset = Vector2( 0, 0 )
+17/shape_offset = Vector2( 0, 0 )
+17/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+17/shape_one_way = false
+17/shape_one_way_margin = 0.0
+17/shapes = [ ]
+17/z_index = 0
+18/name = "decoration.png 18"
+18/texture = ExtResource( 1 )
+18/tex_offset = Vector2( 0, 0 )
+18/modulate = Color( 1, 1, 1, 1 )
+18/region = Rect2( 112, 16, 16, 16 )
+18/tile_mode = 0
+18/occluder_offset = Vector2( 0, 0 )
+18/navigation_offset = Vector2( 0, 0 )
+18/shape_offset = Vector2( 0, 0 )
+18/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+18/shape_one_way = false
+18/shape_one_way_margin = 0.0
+18/shapes = [ ]
+18/z_index = 0
+19/name = "decoration.png 19"
+19/texture = ExtResource( 1 )
+19/tex_offset = Vector2( 0, 0 )
+19/modulate = Color( 1, 1, 1, 1 )
+19/region = Rect2( 96, 32, 16, 16 )
+19/tile_mode = 0
+19/occluder_offset = Vector2( 0, 0 )
+19/navigation_offset = Vector2( 0, 0 )
+19/shape_offset = Vector2( 0, 0 )
+19/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+19/shape_one_way = false
+19/shape_one_way_margin = 0.0
+19/shapes = [ ]
+19/z_index = 0
+20/name = "decoration.png 20"
+20/texture = ExtResource( 1 )
+20/tex_offset = Vector2( 0, 0 )
+20/modulate = Color( 1, 1, 1, 1 )
+20/region = Rect2( 112, 32, 16, 16 )
+20/tile_mode = 0
+20/occluder_offset = Vector2( 0, 0 )
+20/navigation_offset = Vector2( 0, 0 )
+20/shape_offset = Vector2( 0, 0 )
+20/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+20/shape_one_way = false
+20/shape_one_way_margin = 0.0
+20/shapes = [ ]
+20/z_index = 0
+21/name = "decoration.png 21"
+21/texture = ExtResource( 1 )
+21/tex_offset = Vector2( 0, 0 )
+21/modulate = Color( 1, 1, 1, 1 )
+21/region = Rect2( 128, 32, 16, 16 )
+21/tile_mode = 0
+21/occluder_offset = Vector2( 0, 0 )
+21/navigation_offset = Vector2( 0, 0 )
+21/shape_offset = Vector2( 0, 0 )
+21/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+21/shape_one_way = false
+21/shape_one_way_margin = 0.0
+21/shapes = [ ]
+21/z_index = 0
+22/name = "decoration.png 22"
+22/texture = ExtResource( 1 )
+22/tex_offset = Vector2( 0, 0 )
+22/modulate = Color( 1, 1, 1, 1 )
+22/region = Rect2( 144, 16, 16, 16 )
+22/tile_mode = 0
+22/occluder_offset = Vector2( 0, 0 )
+22/navigation_offset = Vector2( 0, 0 )
+22/shape_offset = Vector2( 0, 0 )
+22/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+22/shape_one_way = false
+22/shape_one_way_margin = 0.0
+22/shapes = [ ]
+22/z_index = 0
+23/name = "decoration.png 23"
+23/texture = ExtResource( 1 )
+23/tex_offset = Vector2( 0, 0 )
+23/modulate = Color( 1, 1, 1, 1 )
+23/region = Rect2( 128, 16, 16, 16 )
+23/tile_mode = 0
+23/occluder_offset = Vector2( 0, 0 )
+23/navigation_offset = Vector2( 0, 0 )
+23/shape_offset = Vector2( 0, 0 )
+23/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+23/shape_one_way = false
+23/shape_one_way_margin = 0.0
+23/shapes = [ ]
+23/z_index = 0
+24/name = "decoration.png 24"
+24/texture = ExtResource( 1 )
+24/tex_offset = Vector2( 0, 0 )
+24/modulate = Color( 1, 1, 1, 1 )
+24/region = Rect2( 144, 32, 16, 16 )
+24/tile_mode = 0
+24/occluder_offset = Vector2( 0, 0 )
+24/navigation_offset = Vector2( 0, 0 )
+24/shape_offset = Vector2( 0, 0 )
+24/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+24/shape_one_way = false
+24/shape_one_way_margin = 0.0
+24/shapes = [ ]
+24/z_index = 0
+
+[node name="Others" type="TileMap"]
+tile_set = SubResource( 1 )
+cell_size = Vector2( 16, 16 )
+format = 1
+__meta__ = {
+"_editor_description_": ""
+}
diff --git a/Pause.tscn b/Pause.tscn
new file mode 100644
index 0000000..d70540d
--- /dev/null
+++ b/Pause.tscn
@@ -0,0 +1,106 @@
+[gd_scene load_steps=7 format=2]
+
+[ext_resource path="res://PauseMenu.gd" type="Script" id=1]
+[ext_resource path="res://pause.png" type="Texture" id=2]
+[ext_resource path="res://theme.tres" type="Theme" id=3]
+[ext_resource path="res://settingshover.png" type="Texture" id=4]
+[ext_resource path="res://settings.png" type="Texture" id=5]
+[ext_resource path="res://SettingsMenu.tscn" type="PackedScene" id=6]
+
+[node name="Pause" type="CanvasLayer"]
+pause_mode = 2
+script = ExtResource( 1 )
+
+[node name="PauseMenu" type="Control" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+theme = ExtResource( 3 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ColorRect" type="ColorRect" parent="PauseMenu"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+color = Color( 0, 0, 0, 0.27451 )
+
+[node name="TextureRect" type="TextureRect" parent="PauseMenu/ColorRect"]
+margin_left = 24.0
+margin_top = 24.0
+margin_right = 64.0
+margin_bottom = 64.0
+texture = ExtResource( 2 )
+expand = true
+stretch_mode = 5
+
+[node name="CenterContainer" type="CenterContainer" parent="PauseMenu/ColorRect"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="PauseMenu/ColorRect/CenterContainer"]
+margin_left = 115.0
+margin_top = 26.0
+margin_right = 205.0
+margin_bottom = 294.0
+custom_constants/separation = 4
+
+[node name="QuitButton" type="Button" parent="PauseMenu/ColorRect/CenterContainer/VBoxContainer"]
+margin_right = 90.0
+margin_bottom = 30.0
+rect_min_size = Vector2( 90, 30 )
+size_flags_vertical = 0
+text = "exit(!)"
+
+[node name="BackButton" type="Button" parent="PauseMenu/ColorRect/CenterContainer/VBoxContainer"]
+visible = false
+margin_top = 34.0
+margin_right = 90.0
+margin_bottom = 64.0
+rect_min_size = Vector2( 90, 30 )
+size_flags_vertical = 0
+text = "back"
+
+[node name="SettingsButton" type="Button" parent="PauseMenu/ColorRect/CenterContainer/VBoxContainer"]
+margin_top = 34.0
+margin_right = 90.0
+margin_bottom = 64.0
+rect_min_size = Vector2( 90, 30 )
+size_flags_vertical = 0
+text = "settings"
+
+[node name="Gap" type="Control" parent="PauseMenu/ColorRect/CenterContainer/VBoxContainer"]
+margin_top = 68.0
+margin_right = 90.0
+margin_bottom = 268.0
+rect_min_size = Vector2( 0, 200 )
+
+[node name="Settings" type="TextureButton" parent="."]
+anchor_top = 0.5
+anchor_bottom = 0.5
+margin_left = 16.0
+margin_top = -16.0
+margin_right = 48.0
+margin_bottom = 16.0
+focus_mode = 0
+toggle_mode = true
+texture_normal = ExtResource( 5 )
+texture_pressed = ExtResource( 4 )
+texture_hover = ExtResource( 4 )
+texture_disabled = ExtResource( 4 )
+texture_focused = ExtResource( 4 )
+expand = true
+stretch_mode = 4
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="SettingsMenu" parent="." instance=ExtResource( 6 )]
+visible = false
+
+[connection signal="pressed" from="PauseMenu/ColorRect/CenterContainer/VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]
+[connection signal="pressed" from="PauseMenu/ColorRect/CenterContainer/VBoxContainer/BackButton" to="." method="_on_BackButton_pressed"]
+[connection signal="pressed" from="PauseMenu/ColorRect/CenterContainer/VBoxContainer/SettingsButton" to="." method="_on_SettingsButton_pressed"]
+[connection signal="toggled" from="Settings" to="." method="_on_Settings_toggled"]
diff --git a/PauseMenu.gd b/PauseMenu.gd
new file mode 100644
index 0000000..dc8ba2e
--- /dev/null
+++ b/PauseMenu.gd
@@ -0,0 +1,35 @@
+extends CanvasLayer
+
+
+func _ready():
+ $PauseMenu.hide()
+
+
+func pause_toggle(new_pause_state):
+# var new_pause_state = not get_tree().paused
+ get_tree().paused = new_pause_state
+ $PauseMenu.visible = new_pause_state
+ $Settings.pressed = new_pause_state
+ if new_pause_state:
+ $PauseMenu/ColorRect/CenterContainer/VBoxContainer/QuitButton.grab_focus()
+
+
+func _on_QuitButton_pressed():
+ get_tree().quit()
+
+
+func _on_Settings_toggled(button_pressed): # pause enablement button
+ pause_toggle(button_pressed)
+
+
+# not to be confused
+func _on_SettingsButton_pressed():
+ $SettingsMenu.start()
+
+
+func _on_Back_pressed():
+ pause_toggle(false)
+
+
+func _on_BackButton_pressed():
+ get_tree().change_scene("res://StartScreen.tscn")
diff --git a/PauseMenu.tscn b/PauseMenu.tscn
new file mode 100644
index 0000000..c174a7a
--- /dev/null
+++ b/PauseMenu.tscn
@@ -0,0 +1,87 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://theme.tres" type="Theme" id=1]
+[ext_resource path="res://pause.png" type="Texture" id=2]
+[ext_resource path="res://PauseMenu.gd" type="Script" id=3]
+
+[node name="PauseMenu" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+theme = ExtResource( 1 )
+script = ExtResource( 3 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ColorRect" type="ColorRect" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+color = Color( 0, 0, 0, 0.27451 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="TextureRect" type="TextureRect" parent="ColorRect"]
+margin_left = 24.0
+margin_top = 24.0
+margin_right = 64.0
+margin_bottom = 64.0
+texture = ExtResource( 2 )
+expand = true
+stretch_mode = 5
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="CenterContainer" type="CenterContainer" parent="ColorRect"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_top = 16.0
+margin_bottom = 202.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="ColorRect/CenterContainer"]
+margin_left = 115.0
+margin_right = 205.0
+margin_bottom = 506.0
+custom_constants/separation = 4
+
+[node name="QuitButton" type="Button" parent="ColorRect/CenterContainer/VBoxContainer"]
+margin_right = 90.0
+margin_bottom = 30.0
+rect_min_size = Vector2( 90, 30 )
+size_flags_vertical = 0
+text = "exit(!)"
+
+[node name="SettingsButton" type="Button" parent="ColorRect/CenterContainer/VBoxContainer"]
+margin_top = 34.0
+margin_right = 90.0
+margin_bottom = 64.0
+rect_min_size = Vector2( 90, 30 )
+size_flags_vertical = 0
+text = "back"
+
+[node name="Gap2" type="Control" parent="ColorRect/CenterContainer/VBoxContainer"]
+margin_top = 68.0
+margin_right = 90.0
+margin_bottom = 68.0
+
+[node name="Back" type="Button" parent="ColorRect/CenterContainer/VBoxContainer"]
+margin_top = 72.0
+margin_right = 90.0
+margin_bottom = 102.0
+rect_min_size = Vector2( 90, 30 )
+size_flags_vertical = 0
+text = "back"
+
+[node name="Gap" type="Control" parent="ColorRect/CenterContainer/VBoxContainer"]
+margin_top = 106.0
+margin_right = 90.0
+margin_bottom = 506.0
+rect_min_size = Vector2( 0, 400 )
+
+[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]
+[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/SettingsButton" to="." method="_on_SettingsButton_pressed"]
+[connection signal="pressed" from="ColorRect/CenterContainer/VBoxContainer/Back" to="." method="_on_Back_pressed"]
diff --git a/Player.gd b/Player.gd
new file mode 100644
index 0000000..6514c08
--- /dev/null
+++ b/Player.gd
@@ -0,0 +1,159 @@
+extends CollisionObject2D
+
+signal level_reset_requested
+
+const GRID_SIZE = 16
+
+var moves = 0 setget set_moves
+
+var last_move = null
+var last_move_crate = null
+var world: Node2D
+var count = 0
+var started = false
+var won := false
+
+signal won
+
+onready var cam = $Camera2D
+onready var tween = $Tween
+onready var ray = $RayCast2D
+onready var dir = $Direction
+onready var anitree: AnimationTree = $AnimationTree
+onready var anistate = anitree.get("parameters/playback")
+
+
+func _ready():
+ anitree.active = true
+
+
+func initialize():
+ won = false
+ set_physics_process(false)
+ yield(get_tree().create_timer(2), "timeout")
+ set_physics_process(true)
+
+
+func _physics_process(_delta):
+ if Input.is_action_just_pressed("level_reload"):
+ emit_signal("level_reset_requested")
+ anistate.travel("Idle")
+ set_moves(0)
+ last_move = null
+ last_move_crate = null
+ return
+
+ if not world:
+ return
+
+ if Utils.stop_input:
+ return
+
+ if get_parent().get_parent().just_started:
+ return
+
+ if world.over:
+ anistate.travel("Idle")
+ return
+
+ if tween.is_active():
+ return
+
+ var move_intent = Vector2.ZERO
+
+ move_intent = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
+
+ if Input.is_action_just_pressed("undo_last_move"):
+ if last_move != null:
+ self.position -= last_move * GRID_SIZE
+ if last_move_crate != null:
+ last_move_crate.position -= last_move * GRID_SIZE
+ set_moves(moves - 1)
+ last_move = null
+ last_move_crate = null
+ return
+
+ if move_intent.x != 0 && move_intent.y != 0:
+ move_intent = Vector2.ZERO
+
+ if move_intent != Vector2.ZERO:
+ if not started:
+ get_parent().get_parent().start_stopwatch()
+ started = true
+ var offset = move_intent * GRID_SIZE
+
+ apply_rotation(offset)
+
+ if ray.is_colliding():
+ var collider = ray.get_collider()
+ if collider.is_in_group("crates"):
+ if !collider.push(offset):
+ anistate.travel("Idle")
+ return
+
+ last_move_crate = collider
+
+ else:
+ anistate.travel("Idle")
+ return
+
+ else:
+ last_move_crate = null
+
+ set_moves(moves + 1)
+ last_move = move_intent
+
+ tween.interpolate_property(
+ self,
+ "position",
+ self.position,
+ self.position + offset,
+ 0.35,
+ Tween.TRANS_LINEAR,
+ Tween.EASE_IN_OUT
+ )
+ tween.start()
+
+ SoundFx.play("walk", -10, rand_range(.9, 1.1))
+ anistate.travel("Run")
+ anitree.set("parameters/Run/blend_position", move_intent)
+ else:
+ anistate.travel("Idle")
+
+
+func set_moves(new_moves: int):
+ moves = new_moves
+ $"../../CanvasLayer/HUD/MovesLabel".text = "Moves: " + str(moves)
+
+
+func apply_rotation(offset: Vector2):
+ ray.cast_to = offset
+
+ var new_rot := offset.angle()
+
+ ray.force_raycast_update()
+
+ var future_rot := lerp_angle(dir.rotation, new_rot, 1)
+
+ if future_rot != dir.rotation:
+ tween.interpolate_property(
+ dir, "rotation", dir.rotation, future_rot, 0.3, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
+ )
+ tween.start()
+
+
+func _over():
+ if won:
+ return
+ emit_signal("won")
+ won = true
+
+
+func _on_Player_body_exited(_body):
+ pass
+ # if not body.name == "Player" and not body.is_in_group("crates"):
+ # print("emitting won")
+ # if won:
+ # return
+ # emit_signal("won")
+ # won = true
diff --git a/Player.tscn b/Player.tscn
new file mode 100644
index 0000000..8d978df
--- /dev/null
+++ b/Player.tscn
@@ -0,0 +1,312 @@
+[gd_scene load_steps=28 format=2]
+
+[ext_resource path="res://Player.gd" type="Script" id=1]
+[ext_resource path="res://cuberot.png" type="Texture" id=2]
+[ext_resource path="res://arrow.png" type="Texture" id=3]
+[ext_resource path="res://spot.png" type="Texture" id=4]
+
+[sub_resource type="Curve" id=1]
+_data = [ Vector2( 0.0184332, 0.967672 ), 0.0, 0.0, 0, 0, Vector2( 0.184332, 0.795259 ), 0.0, 0.0, 0, 0, Vector2( 0.308756, 0.890086 ), 0.0, 0.0, 0, 0, Vector2( 0.474654, 0.769397 ), 0.0, 0.0, 0, 0, Vector2( 0.585253, 0.950431 ), 0.0, 0.0, 0, 0, Vector2( 0.714286, 0.924569 ), 0.0, 0.0, 0, 0, Vector2( 0.83871, 0.786638 ), 0.0, 0.0, 0, 0, Vector2( 1, 0 ), 0.0, 0.0, 0, 0 ]
+
+[sub_resource type="Gradient" id=2]
+offsets = PoolRealArray( 0, 0.944751, 1 )
+colors = PoolColorArray( 1, 1, 1, 1, 1, 1, 1, 0.952128, 1, 1, 1, 0 )
+
+[sub_resource type="RectangleShape2D" id=3]
+extents = Vector2( 7.5, 7.5 )
+
+[sub_resource type="Animation" id=19]
+resource_name = "Idle"
+length = 0.1
+loop = true
+tracks/0/type = "value"
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 1,
+"values": [ 0 ]
+}
+
+[sub_resource type="Animation" id=8]
+resource_name = "MoveDown"
+length = 0.35
+loop = true
+step = 0.05
+tracks/0/type = "value"
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3 ),
+"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
+"update": 1,
+"values": [ 0, 1, 2, 3, 4, 5, 6 ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Sprite:rotation_degrees")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 1,
+"values": [ 0.0 ]
+}
+
+[sub_resource type="Animation" id=6]
+resource_name = "MoveLeft"
+length = 0.35
+loop = true
+tracks/0/type = "value"
+tracks/0/path = NodePath("Sprite:rotation_degrees")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 1,
+"values": [ 90.0 ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Sprite:frame")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3 ),
+"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
+"update": 1,
+"values": [ 0, 1, 2, 3, 4, 5, 6 ]
+}
+
+[sub_resource type="Animation" id=20]
+resource_name = "MoveRight"
+length = 0.35
+loop = true
+tracks/0/type = "value"
+tracks/0/path = NodePath("Sprite:rotation_degrees")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 1,
+"values": [ -90.0 ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Sprite:frame")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3 ),
+"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
+"update": 1,
+"values": [ 0, 1, 2, 3, 4, 5, 6 ]
+}
+
+[sub_resource type="Animation" id=7]
+resource_name = "MoveUp"
+length = 0.35
+loop = true
+step = 0.01
+tracks/0/type = "value"
+tracks/0/path = NodePath("Sprite:rotation_degrees")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 1,
+"values": [ 180.0 ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Sprite:frame")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3 ),
+"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
+"update": 1,
+"values": [ 0, 1, 2, 3, 4, 5, 6 ]
+}
+
+[sub_resource type="Animation" id=21]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath("Sprite:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ 0 ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Sprite:rotation_degrees")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ -90.0 ]
+}
+
+[sub_resource type="AnimationNodeAnimation" id=24]
+animation = "Idle"
+
+[sub_resource type="AnimationNodeAnimation" id=25]
+animation = "Idle"
+
+[sub_resource type="AnimationNodeAnimation" id=22]
+animation = "Idle"
+
+[sub_resource type="AnimationNodeAnimation" id=23]
+animation = "Idle"
+
+[sub_resource type="AnimationNodeBlendSpace2D" id=9]
+blend_point_0/node = SubResource( 24 )
+blend_point_0/pos = Vector2( -0.1, 0 )
+blend_point_1/node = SubResource( 25 )
+blend_point_1/pos = Vector2( 0, 0.6 )
+blend_point_2/node = SubResource( 22 )
+blend_point_2/pos = Vector2( 0.1, 0 )
+blend_point_3/node = SubResource( 23 )
+blend_point_3/pos = Vector2( 0, -0.6 )
+
+[sub_resource type="AnimationNodeAnimation" id=15]
+animation = "MoveDown"
+
+[sub_resource type="AnimationNodeAnimation" id=16]
+animation = "MoveRight"
+
+[sub_resource type="AnimationNodeAnimation" id=17]
+animation = "MoveUp"
+
+[sub_resource type="AnimationNodeAnimation" id=18]
+animation = "MoveLeft"
+
+[sub_resource type="AnimationNodeBlendSpace2D" id=10]
+blend_point_0/node = SubResource( 15 )
+blend_point_0/pos = Vector2( 0, 1 )
+blend_point_1/node = SubResource( 16 )
+blend_point_1/pos = Vector2( 1, 0 )
+blend_point_2/node = SubResource( 17 )
+blend_point_2/pos = Vector2( 0, -1 )
+blend_point_3/node = SubResource( 18 )
+blend_point_3/pos = Vector2( -1, 0 )
+blend_mode = 1
+
+[sub_resource type="AnimationNodeStateMachineTransition" id=11]
+
+[sub_resource type="AnimationNodeStateMachineTransition" id=12]
+
+[sub_resource type="AnimationNodeStateMachine" id=13]
+states/Idle/node = SubResource( 9 )
+states/Idle/position = Vector2( 517, 64 )
+states/Run/node = SubResource( 10 )
+states/Run/position = Vector2( 663, 64 )
+transitions = [ "Idle", "Run", SubResource( 11 ), "Run", "Idle", SubResource( 12 ) ]
+start_node = "Idle"
+
+[sub_resource type="AnimationNodeStateMachinePlayback" id=14]
+
+[node name="Player" type="Area2D"]
+collision_layer = 0
+collision_mask = 2
+script = ExtResource( 1 )
+
+[node name="Light2D" type="Light2D" parent="."]
+position = Vector2( 8, 8 )
+texture = ExtResource( 4 )
+color = Color( 0.14902, 0.360784, 1, 1 )
+shadow_enabled = true
+shadow_gradient_length = 1.0
+shadow_filter = 3
+shadow_filter_smooth = 4.0
+
+[node name="CPUParticles2D" type="CPUParticles2D" parent="."]
+show_behind_parent = true
+position = Vector2( 8, 8 )
+amount = 4
+local_coords = false
+gravity = Vector2( 0, 0 )
+scale_amount = 5.0
+scale_amount_random = 1.0
+scale_amount_curve = SubResource( 1 )
+color_ramp = SubResource( 2 )
+
+[node name="Direction" type="Sprite" parent="."]
+position = Vector2( 8, 8 )
+z_index = 1
+texture = ExtResource( 3 )
+offset = Vector2( 9.95932, -0.107321 )
+
+[node name="Tween" type="Tween" parent="."]
+
+[node name="RayCast2D" type="RayCast2D" parent="."]
+visible = false
+position = Vector2( 8, 8 )
+cast_to = Vector2( 50, 0 )
+
+[node name="Sprite" type="Sprite" parent="."]
+position = Vector2( 8, 8 )
+rotation = -1.5708
+texture = ExtResource( 2 )
+centered = false
+offset = Vector2( -8, -8 )
+hframes = 7
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+visible = false
+position = Vector2( 8, 8 )
+shape = SubResource( 3 )
+
+[node name="Camera2D" type="Camera2D" parent="."]
+position = Vector2( 8, 8 )
+current = true
+zoom = Vector2( 0.5, 0.5 )
+smoothing_enabled = true
+smoothing_speed = 4.0
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+anims/Idle = SubResource( 19 )
+anims/MoveDown = SubResource( 8 )
+anims/MoveLeft = SubResource( 6 )
+anims/MoveRight = SubResource( 20 )
+anims/MoveUp = SubResource( 7 )
+anims/RESET = SubResource( 21 )
+
+[node name="AnimationTree" type="AnimationTree" parent="."]
+tree_root = SubResource( 13 )
+anim_player = NodePath("../AnimationPlayer")
+parameters/playback = SubResource( 14 )
+parameters/Idle/blend_position = Vector2( 0, 0 )
+parameters/Run/blend_position = Vector2( 0, 0 )
+
+[connection signal="body_exited" from="." to="." method="_on_Player_body_exited"]
diff --git a/PlayerSprite.gd b/PlayerSprite.gd
new file mode 100644
index 0000000..91d9c5a
--- /dev/null
+++ b/PlayerSprite.gd
@@ -0,0 +1,35 @@
+extends Sprite
+
+onready var tween = $Tween
+
+onready var initial_pos = position
+
+var start_new = true
+
+
+func _physics_process(_delta):
+ if tween.is_active():
+ return
+
+ if not start_new:
+ return
+
+ tween.interpolate_property(
+ self,
+ "position",
+ position,
+ position + Vector2.RIGHT * 32,
+ .7,
+ tween.TRANS_LINEAR,
+ tween.EASE_IN_OUT
+ )
+ tween.start()
+
+
+func _on_VisibilityNotifier2D_screen_exited():
+ start_new = false
+ if tween.is_active():
+ yield(tween, "tween_all_completed")
+ tween.stop_all()
+ position = initial_pos
+ start_new = true
diff --git a/PlayerWalk.tscn b/PlayerWalk.tscn
new file mode 100644
index 0000000..735acf9
--- /dev/null
+++ b/PlayerWalk.tscn
@@ -0,0 +1,59 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://cuberot.png" type="Texture" id=1]
+[ext_resource path="res://PlayerSprite.gd" type="Script" id=2]
+
+[sub_resource type="Animation" id=1]
+resource_name = "Animate"
+length = 0.7
+loop = true
+tracks/0/type = "value"
+tracks/0/path = NodePath(".:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6 ),
+"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1 ),
+"update": 1,
+"values": [ 0, 1, 2, 3, 4, 5, 6 ]
+}
+
+[sub_resource type="Animation" id=2]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath(".:frame")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ 0 ]
+}
+
+[node name="PlayerSprite" type="Sprite"]
+light_mask = 0
+position = Vector2( 0, 272 )
+rotation = -1.5708
+scale = Vector2( 2, 2 )
+texture = ExtResource( 1 )
+offset = Vector2( -8, -8 )
+hframes = 7
+script = ExtResource( 2 )
+
+[node name="VisibilityNotifier2D" type="VisibilityNotifier2D" parent="."]
+position = Vector2( -16, -16 )
+rect = Rect2( 0, 0, 16, 16 )
+
+[node name="Tween" type="Tween" parent="."]
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+autoplay = "Animate"
+anims/Animate = SubResource( 1 )
+anims/RESET = SubResource( 2 )
+
+[connection signal="screen_exited" from="VisibilityNotifier2D" to="." method="_on_VisibilityNotifier2D_screen_exited"]
diff --git a/README.md b/README.md
index 7575a7e..d19338e 100644
--- a/README.md
+++ b/README.md
@@ -1,37 +1,3 @@
-# godot-template
+# sokoban
-Godot template repository for my programs
-
----
-
-# How to use
-
-- To use: click use this template button.
-- Clone your repository
-- Add your files
-- Commit
-- Push
-
-<details>
-<summary>For itch.io depoloyment</summary>
-<br>
-Add a secret called BUTLER_CREDENTIALS with your butler api key.
-</details>
-
-<details>
-<summary>For android builds</summary>
-<br>
-Add two secrets:
- ANDROID_KEYSTORE_BASE64
- ANDROID_KEYSTORE_PASSWORD
-</details>
-
----
-
-### Availability:
-
-| windows | ios | linux | android | mac | html | |
-|:------------------:|:---:|:------------------:|:------------------:|:------------------:|:------------------:|:-------------:|
-| :x: | :x: | :x: | :x: | :x: | :heavy_check_mark: | github pages |
-| :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | itch.io |
-| :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | godot exports |
+sokoban
diff --git a/Save_Load.gd b/Save_Load.gd
new file mode 100644
index 0000000..698d668
--- /dev/null
+++ b/Save_Load.gd
@@ -0,0 +1,41 @@
+extends Node
+
+const settings_file = "user://settings.res"
+const level_file = "user://level_data.res"
+
+var files := { # file types
+ "settings":
+ {
+ "file": settings_file,
+ "data":
+ {"stopwatch": false, "fullscreen": true, "resolution": Vector2(1280, 720), "vsync": false}
+ },
+ "level": {"file": level_file, "data": {"highest_level": "0", "current_level": "1"}}
+}
+
+
+func _ready():
+ load_data("settings")
+ load_data("level")
+
+
+func save(type):
+ var file = File.new()
+ file.open(files[type].file, File.WRITE)
+ file.store_string(var2str(files[type].data))
+
+
+func load_data(type: String):
+ var file = File.new()
+ if check_file(type):
+ file.open(files[type].file, File.READ)
+ if file.get_as_text().length() > 0:
+ var read_dictionary: Dictionary = str2var(file.get_as_text())
+ if files[type].data.size() == read_dictionary.size():
+ files[type].data = read_dictionary
+ file.close()
+
+
+func check_file(type):
+ var file = File.new()
+ return file.file_exists(files[type].file)
diff --git a/Settings.gd b/Settings.gd
new file mode 100644
index 0000000..d9119ef
--- /dev/null
+++ b/Settings.gd
@@ -0,0 +1,122 @@
+extends Control
+
+var _settings := {
+ resolution = Vector2(1280, 720), fullscreen = true, vsync = true, stopwatch = false
+}
+var starting = true
+
+export(NodePath) onready var vsyncbutton = get_node(vsyncbutton)
+export(NodePath) onready var fullscreenbutton = get_node(fullscreenbutton)
+export(NodePath) onready var resolution_input = get_node(resolution_input)
+export(NodePath) onready var stopwatchbox = get_node(stopwatchbox)
+
+
+func _ready():
+ var data = SaveLoad.files.settings.data
+ _settings.stopwatch = data.stopwatch
+ _settings.resolution = data.resolution
+ _settings.vsync = data.vsync
+ _settings.fullscreen = data.fullscreen
+ update_settings(false)
+
+
+func start():
+ starting = false
+ yield(get_tree().create_timer(.3), "timeout")
+ $ColorRect/ExitButton.grab_focus()
+ show()
+
+
+func update_settings_visual():
+ fullscreenbutton.pressed = _settings.fullscreen
+ vsyncbutton.pressed = _settings.vsync
+ var resolution_text_placeholder = (
+ str(_settings.resolution.x)
+ + "x"
+ + str(_settings.resolution.y)
+ )
+ resolution_input.placeholder_text = resolution_text_placeholder
+ stopwatchbox.pressed = _settings.stopwatch
+
+
+func _on_VscynButton_toggled(button_pressed):
+ if starting:
+ return
+ _settings.vsync = button_pressed
+ update_settings()
+
+
+func _on_FullscreenButton_toggled(button_pressed):
+ if starting:
+ return
+ _settings.fullscreen = button_pressed
+ update_settings()
+
+
+func update_settings(open := true) -> void:
+ if not open:
+ _settings.vsync = OS.vsync_enabled
+ _settings.fullscreen = OS.window_fullscreen
+ _settings.resolution = OS.window_size
+ var data = SaveLoad.files.settings.data
+ _settings = data
+ apply_settings()
+ update_settings_visual()
+ if open:
+ MainInstances.console.Log("Settings applied.", .1, 1)
+ $ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder.visible = !_settings.fullscreen
+ SaveLoad.save("settings")
+
+
+func apply_settings():
+ resolution_input.placeholder_text = (
+ str(_settings.resolution.x)
+ + "x"
+ + str(_settings.resolution.y)
+ )
+ OS.window_fullscreen = _settings.fullscreen
+ if _settings.fullscreen:
+ _settings.resolution = OS.get_screen_size()
+ OS.set_window_size(_settings.resolution)
+ OS.vsync_enabled = _settings.vsync
+ globalsettings.stopwatch = _settings.stopwatch
+
+
+func _on_ResolutionInput_text_entered(new_text: String):
+ if starting:
+ return
+ var text = new_text.split("x")
+ if text.size() < 2:
+ MainInstances.console.Log("Please split text with a x (1270x720)", 2.5, 5)
+ return
+ var text_processed = []
+ for number in text:
+ number = int(number)
+ number = round(number)
+ number = clamp(number, 400, 4000)
+ text_processed.append(number)
+ var new_res = Vector2(text_processed[0], text_processed[1])
+ _settings.resolution = new_res
+ update_settings()
+
+
+func _on_ResolutionButton_pressed():
+ if starting:
+ return
+ resolution_input.visible = !resolution_input.visible
+
+
+func _on_ExitButton_pressed():
+ hide()
+ update_settings(false)
+ if get_parent().has_method("pause_toggle"):
+ get_parent().pause_toggle(true)
+ else:
+ push_warning("Parent of %s not pausemenu" % self)
+
+
+func _on_StopwatchBox_toggled(button_pressed):
+ if starting:
+ return
+ _settings.stopwatch = button_pressed
+ update_settings()
diff --git a/SettingsMenu.tscn b/SettingsMenu.tscn
new file mode 100644
index 0000000..f736318
--- /dev/null
+++ b/SettingsMenu.tscn
@@ -0,0 +1,114 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://theme.tres" type="Theme" id=1]
+[ext_resource path="res://Settings.gd" type="Script" id=2]
+
+[node name="SettingsMenu" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+theme = ExtResource( 1 )
+script = ExtResource( 2 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+vsyncbutton = NodePath("ColorRect/VBoxContainer/HBoxContainer/VscynButton")
+fullscreenbutton = NodePath("ColorRect/VBoxContainer/HBoxContainer/FullscreenButton")
+resolution_input = NodePath("ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder/ResolutionInput")
+stopwatchbox = NodePath("ColorRect/VBoxContainer/HBoxContainer2/StopwatchBox")
+
+[node name="ColorRect" type="ColorRect" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+color = Color( 0, 0, 0, 0.615686 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ExitButton" type="Button" parent="ColorRect"]
+anchor_left = 0.5
+anchor_top = 1.0
+anchor_right = 0.5
+anchor_bottom = 1.0
+margin_left = -32.0
+margin_top = -32.0
+margin_right = 32.0
+margin_bottom = -8.0
+rect_min_size = Vector2( 64, 0 )
+text = "back"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VBoxContainer" type="VBoxContainer" parent="ColorRect"]
+margin_left = 8.0
+margin_top = 8.0
+margin_right = 312.0
+margin_bottom = 112.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="HBoxContainer" type="HBoxContainer" parent="ColorRect/VBoxContainer"]
+margin_right = 304.0
+margin_bottom = 30.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VscynButton" type="CheckBox" parent="ColorRect/VBoxContainer/HBoxContainer"]
+margin_right = 86.0
+margin_bottom = 30.0
+rect_min_size = Vector2( 86, 30 )
+text = "vsyc"
+align = 1
+
+[node name="FullscreenButton" type="CheckBox" parent="ColorRect/VBoxContainer/HBoxContainer"]
+margin_left = 90.0
+margin_right = 225.0
+margin_bottom = 30.0
+rect_min_size = Vector2( 135, 30 )
+pressed = true
+text = "fullscreen"
+align = 1
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="ColorRect/VBoxContainer"]
+margin_top = 34.0
+margin_right = 304.0
+margin_bottom = 64.0
+
+[node name="ResolutionHolder" type="VBoxContainer" parent="ColorRect/VBoxContainer/HBoxContainer2"]
+visible = false
+margin_right = 104.0
+margin_bottom = 30.0
+
+[node name="ResolutionButton" type="Button" parent="ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder"]
+margin_right = 104.0
+margin_bottom = 30.0
+rect_min_size = Vector2( 104, 30 )
+text = "resolution"
+
+[node name="ResolutionInput" type="LineEdit" parent="ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder"]
+visible = false
+margin_top = 34.0
+margin_right = 104.0
+margin_bottom = 55.0
+align = 1
+expand_to_text_length = true
+placeholder_text = "1280x720"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="StopwatchBox" type="CheckBox" parent="ColorRect/VBoxContainer/HBoxContainer2"]
+margin_right = 215.0
+margin_bottom = 30.0
+rect_min_size = Vector2( 215, 30 )
+text = "speedrunner mode"
+align = 1
+
+[connection signal="pressed" from="ColorRect/ExitButton" to="." method="_on_ExitButton_pressed"]
+[connection signal="toggled" from="ColorRect/VBoxContainer/HBoxContainer/VscynButton" to="." method="_on_VscynButton_toggled"]
+[connection signal="toggled" from="ColorRect/VBoxContainer/HBoxContainer/FullscreenButton" to="." method="_on_FullscreenButton_toggled"]
+[connection signal="pressed" from="ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder/ResolutionButton" to="." method="_on_ResolutionButton_pressed"]
+[connection signal="text_entered" from="ColorRect/VBoxContainer/HBoxContainer2/ResolutionHolder/ResolutionInput" to="." method="_on_ResolutionInput_text_entered"]
+[connection signal="toggled" from="ColorRect/VBoxContainer/HBoxContainer2/StopwatchBox" to="." method="_on_StopwatchBox_toggled"]
diff --git a/SoundFX.gd b/SoundFX.gd
new file mode 100644
index 0000000..cb8100f
--- /dev/null
+++ b/SoundFX.gd
@@ -0,0 +1,30 @@
+extends Node
+
+var res = "res://"
+
+var sounds = {
+ "victory": load(res + "victory.wav"),
+ "motion_box": load(res + "motion_box.wav"),
+ "defeat": load(res + "gameover.wav"),
+ "walk": load(res + "walk.wav")
+}
+
+onready var sound_players = get_children()
+
+
+func play(sound_string, volume_db = 0, pitch_scale = randf() + 0.4):
+ if sound_string == "target":
+ if not $WINTONEPLAYER.playing:
+ $WINTONEPLAYER.stream = sounds[sound_string]
+ $WINTONEPLAYER.play()
+ yield($WINTONEPLAYER, "finished")
+ return
+ return
+ for soundPlayer in sound_players:
+ if not soundPlayer.playing:
+ soundPlayer.pitch_scale = pitch_scale
+ soundPlayer.volume_db = volume_db
+ soundPlayer.stream = sounds[sound_string]
+ soundPlayer.play()
+ return
+ print_debug("TOO MANY SOUNDS")
diff --git a/SoundFX.tscn b/SoundFX.tscn
new file mode 100644
index 0000000..32cc012
--- /dev/null
+++ b/SoundFX.tscn
@@ -0,0 +1,17 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://SoundFX.gd" type="Script" id=1]
+
+[node name="SoundFX" type="Node"]
+pause_mode = 2
+script = ExtResource( 1 )
+
+[node name="AudioStreamPlayer1" type="AudioStreamPlayer" parent="."]
+
+[node name="AudioStreamPlayer2" type="AudioStreamPlayer" parent="."]
+
+[node name="AudioStreamPlayer3" type="AudioStreamPlayer" parent="."]
+
+[node name="AudioStreamPlayer4" type="AudioStreamPlayer" parent="."]
+
+[node name="WINTONEPLAYER" type="AudioStreamPlayer2D" parent="."]
diff --git a/StartScreen.gd b/StartScreen.gd
new file mode 100644
index 0000000..832d2f2
--- /dev/null
+++ b/StartScreen.gd
@@ -0,0 +1,50 @@
+extends CanvasLayer
+
+const world = preload("res://World.tscn")
+
+var level_to_load = 1
+
+
+func _ready():
+ $Control/Hi.text = "Highscore: " + SaveLoad.files.level.data.highest_level
+ $Control/CenterContainer/VBoxContainer/StartButton.grab_focus()
+
+
+func _on_StartButton_pressed():
+ Utils.starting = true
+ Utils.change_scene_to(world)
+
+
+func _on_LoadButton_pressed():
+ var spinbox: SpinBox = $Control/CenterContainer/VBoxContainer/HBoxContainer/Spinbox
+ spinbox.show()
+ var spinline: LineEdit = spinbox.get_line_edit()
+ spinline.connect("text_entered", self, "_on_spinbox_entered")
+
+
+func _on_QuitButton_pressed():
+ get_tree().quit()
+
+
+func hide():
+ $Control.hide()
+
+
+func _on_spinbox_entered(text):
+ level_to_load = int(text)
+ level_to_load = clamp(level_to_load, 1, 60)
+ Utils.loading = true
+ Utils.loading_int = level_to_load
+ Utils.change_scene_to(world)
+
+
+func _on_ContinueButton_pressed():
+ Utils.loading_int = int(SaveLoad.files.level.data.current_level)
+ Utils.loading = true
+ Utils.change_scene_to(world)
+
+
+func _on_LoadScreenButton_pressed():
+ Utils.load_loading_screen()
+ yield(get_tree().create_timer(30), "timeout")
+ Utils.unload_loading_screen()
diff --git a/StartScreen.tscn b/StartScreen.tscn
new file mode 100644
index 0000000..2591d7c
--- /dev/null
+++ b/StartScreen.tscn
@@ -0,0 +1,141 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://theme.tres" type="Theme" id=1]
+[ext_resource path="res://smallfont.tres" type="DynamicFont" id=2]
+[ext_resource path="res://StartScreen.gd" type="Script" id=4]
+
+[node name="StartScreen" type="CanvasLayer"]
+script = ExtResource( 4 )
+
+[node name="Control" type="Control" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+theme = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="CenterContainer" type="CenterContainer" parent="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Control/CenterContainer"]
+margin_left = 118.0
+margin_top = 59.0
+margin_right = 201.0
+margin_bottom = 261.0
+custom_constants/separation = 4
+
+[node name="StartButton" type="Button" parent="Control/CenterContainer/VBoxContainer"]
+margin_left = 5.0
+margin_right = 77.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 72, 32 )
+size_flags_horizontal = 6
+size_flags_vertical = 0
+theme = ExtResource( 1 )
+text = "start"
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Control/CenterContainer/VBoxContainer"]
+margin_top = 36.0
+margin_right = 83.0
+margin_bottom = 68.0
+rect_min_size = Vector2( 0, 21 )
+
+[node name="LoadButton" type="Button" parent="Control/CenterContainer/VBoxContainer/HBoxContainer"]
+margin_left = 5.0
+margin_right = 77.0
+margin_bottom = 32.0
+grow_horizontal = 2
+grow_vertical = 2
+rect_min_size = Vector2( 72, 32 )
+size_flags_horizontal = 6
+size_flags_vertical = 0
+text = "load"
+
+[node name="Spinbox" type="SpinBox" parent="Control/CenterContainer/VBoxContainer/HBoxContainer"]
+visible = false
+margin_left = 76.0
+margin_right = 165.0
+margin_bottom = 32.0
+rect_min_size = Vector2( 0, 32 )
+rect_pivot_offset = Vector2( 43, 3 )
+size_flags_horizontal = 0
+size_flags_vertical = 0
+min_value = 1.0
+max_value = 60.0
+page = 1.0
+value = 1.0
+rounded = true
+align = 1
+
+[node name="ContinueButton" type="Button" parent="Control/CenterContainer/VBoxContainer"]
+margin_top = 72.0
+margin_right = 83.0
+margin_bottom = 104.0
+rect_min_size = Vector2( 83, 32 )
+size_flags_horizontal = 6
+size_flags_vertical = 0
+theme = ExtResource( 1 )
+text = "continue"
+
+[node name="Gap2" type="Control" parent="Control/CenterContainer/VBoxContainer"]
+margin_top = 108.0
+margin_right = 83.0
+margin_bottom = 112.0
+rect_min_size = Vector2( 0, 4 )
+
+[node name="QuitButton" type="Button" parent="Control/CenterContainer/VBoxContainer"]
+margin_left = 5.0
+margin_top = 116.0
+margin_right = 77.0
+margin_bottom = 148.0
+rect_min_size = Vector2( 72, 32 )
+size_flags_horizontal = 6
+size_flags_vertical = 0
+text = "exit(!)"
+
+[node name="LoadScreenButton" type="Button" parent="Control/CenterContainer/VBoxContainer"]
+visible = false
+margin_top = 152.0
+margin_right = 144.0
+margin_bottom = 184.0
+rect_min_size = Vector2( 144, 32 )
+size_flags_horizontal = 6
+size_flags_vertical = 0
+text = "test load screen"
+
+[node name="Gap" type="Control" parent="Control/CenterContainer/VBoxContainer"]
+margin_top = 152.0
+margin_right = 83.0
+margin_bottom = 202.0
+rect_min_size = Vector2( 0, 50 )
+
+[node name="Label" type="Label" parent="Control"]
+margin_left = 8.0
+margin_top = 8.0
+margin_right = 41.0
+margin_bottom = 15.0
+custom_fonts/font = ExtResource( 2 )
+text = "(c) bendn"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Hi" type="Label" parent="Control"]
+anchor_left = 1.0
+anchor_right = 1.0
+margin_left = -96.0
+margin_top = 16.0
+margin_right = -24.0
+margin_bottom = 30.0
+text = "highscore:"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[connection signal="pressed" from="Control/CenterContainer/VBoxContainer/StartButton" to="." method="_on_StartButton_pressed"]
+[connection signal="pressed" from="Control/CenterContainer/VBoxContainer/HBoxContainer/LoadButton" to="." method="_on_LoadButton_pressed"]
+[connection signal="pressed" from="Control/CenterContainer/VBoxContainer/ContinueButton" to="." method="_on_ContinueButton_pressed"]
+[connection signal="pressed" from="Control/CenterContainer/VBoxContainer/QuitButton" to="." method="_on_QuitButton_pressed"]
+[connection signal="pressed" from="Control/CenterContainer/VBoxContainer/LoadScreenButton" to="." method="_on_LoadScreenButton_pressed"]
diff --git a/StopWatch.gd b/StopWatch.gd
new file mode 100644
index 0000000..35e6492
--- /dev/null
+++ b/StopWatch.gd
@@ -0,0 +1,39 @@
+extends Label
+
+var time_elapsed := 0.0
+
+
+func _ready():
+ MainInstances.stopwatch = self
+ set_process(false)
+
+
+func start():
+ set_process(true)
+
+
+func _exit_tree():
+ MainInstances.stopwatch = null
+
+
+func reset():
+ time_elapsed = 0.0
+ text = _format_seconds(time_elapsed, true)
+ set_process(false)
+
+
+func _process(delta):
+ time_elapsed += delta
+ text = _format_seconds(time_elapsed, true)
+
+
+func _format_seconds(time: float, use_milliseconds: bool) -> String:
+ var minutes := time / 60
+ var seconds := fmod(time, 60)
+
+ if not use_milliseconds:
+ return "%02d:%02d" % [minutes, seconds]
+
+ var milliseconds := fmod(time, 1) * 100
+
+ return "%02d:%02d:%02d" % [minutes, seconds, milliseconds]
diff --git a/Target.gd b/Target.gd
new file mode 100644
index 0000000..bf970a5
--- /dev/null
+++ b/Target.gd
@@ -0,0 +1,28 @@
+extends Node
+
+onready var anim = $AnimationPlayer
+
+var main: Node2D
+onready var circle = $Circle
+
+
+func _on_Target_body_entered(body):
+ if body.is_in_group("crates"):
+ body.entered_target(self)
+ if not main.just_started:
+ play_pulse()
+
+
+func _on_Target_body_exited(body):
+ if body.is_in_group("crates"):
+ body.left_target(self)
+ anim.play("Animate")
+
+
+func r():
+ return rand_range(0, 1)
+
+
+func play_pulse():
+ circle.self_modulate = Color(r(), r(), r(), 1)
+ anim.play("Animate")
diff --git a/Target.png b/Target.png
new file mode 100644
index 0000000..0b0a14e
--- /dev/null
+++ b/Target.png
Binary files differ
diff --git a/Target.png.import b/Target.png.import
new file mode 100644
index 0000000..9af05f0
--- /dev/null
+++ b/Target.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/Target.png-a2fc14cdfa4f6bab21fb499d99aa5d1c.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Target.png"
+dest_files=[ "res://.import/Target.png-a2fc14cdfa4f6bab21fb499d99aa5d1c.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/Target.tscn b/Target.tscn
new file mode 100644
index 0000000..14464e3
--- /dev/null
+++ b/Target.tscn
@@ -0,0 +1,88 @@
+[gd_scene load_steps=7 format=2]
+
+[ext_resource path="res://Target.gd" type="Script" id=1]
+[ext_resource path="res://Target.png" type="Texture" id=2]
+[ext_resource path="res://circle.png" type="Texture" id=3]
+
+[sub_resource type="RectangleShape2D" id=1]
+extents = Vector2( 7, 7 )
+
+[sub_resource type="Animation" id=2]
+resource_name = "Animate"
+tracks/0/type = "value"
+tracks/0/path = NodePath("Circle:scale")
+tracks/0/interp = 2
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 0.9, 1 ),
+"transitions": PoolRealArray( -2, -2, -2 ),
+"update": 0,
+"values": [ Vector2( 1e-05, 1e-05 ), Vector2( 1, 1 ), Vector2( 0, 0 ) ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Circle:modulate")
+tracks/1/interp = 2
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 0.6, 0.8, 1 ),
+"transitions": PoolRealArray( -2, -2, -2, -2 ),
+"update": 0,
+"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ), Color( 1, 1, 1, 0 ) ]
+}
+
+[sub_resource type="Animation" id=3]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath("Circle:scale")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ Vector2( 0, 0 ) ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Circle:modulate")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ Color( 1, 1, 1, 1 ) ]
+}
+
+[node name="Target" type="Area2D" groups=["target"]]
+script = ExtResource( 1 )
+
+[node name="Sprite" type="Sprite" parent="."]
+texture = ExtResource( 2 )
+centered = false
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+position = Vector2( 8, 8 )
+shape = SubResource( 1 )
+
+[node name="Circle" type="Sprite" parent="."]
+position = Vector2( 8, 8 )
+scale = Vector2( 1e-05, 1e-05 )
+z_index = 1
+texture = ExtResource( 3 )
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+autoplay = "RESET"
+playback_speed = 0.5
+anims/Animate = SubResource( 2 )
+anims/RESET = SubResource( 3 )
+
+[connection signal="body_entered" from="." to="." method="_on_Target_body_entered"]
+[connection signal="body_exited" from="." to="." method="_on_Target_body_exited"]
diff --git a/Utils.gd b/Utils.gd
new file mode 100644
index 0000000..15dc404
--- /dev/null
+++ b/Utils.gd
@@ -0,0 +1,55 @@
+extends Node
+
+var color := Color(0.333333, 0.490196, 0.333333)
+
+var starting = false
+var loading = false
+var loading_int = 0
+
+var loadScreen: CanvasLayer = null
+var stop_input = false
+
+signal loaded_loading_screen
+
+const LoadScreen = preload("res://LoadingScreen.tscn")
+
+
+func _ready():
+ VisualServer.set_default_clear_color(color)
+
+
+func instance_scene_on_main(position, scene):
+ var main = get_tree().current_scene
+ var instance = scene.instance()
+ main.add_child(instance)
+ if not instance is CanvasLayer:
+ instance.global_position = position
+ return instance
+
+
+func change_scene_to(scene):
+ get_tree().change_scene_to(scene)
+
+
+func load_loading_screen():
+ # redundancy check
+ if loadScreen != null:
+ return
+ yield(get_tree().create_timer(.1), "timeout")
+ loadScreen = instance_scene_on_main(Vector2.ZERO, LoadScreen)
+ loadScreen.startup()
+ yield(loadScreen, "startup_complete")
+ emit_signal("loaded_loading_screen")
+
+
+func unload_loading_screen():
+ if loadScreen == null:
+ return
+ loadScreen.exit()
+ loadScreen = null
+
+
+func _set_disable_inputs(inputs):
+ stop_input = inputs
+ get_viewport().gui_disable_input = inputs
+ get_tree().call_group("input", "set_process_input", !inputs)
diff --git a/WinScreen.gd b/WinScreen.gd
new file mode 100644
index 0000000..01486d4
--- /dev/null
+++ b/WinScreen.gd
@@ -0,0 +1,21 @@
+extends CanvasLayer
+
+var player: KinematicBody2D
+var shown = false
+
+
+func _show(integer):
+ shown = true
+ $Container/AnimationPlayer.play("Animate")
+ $Container.visible = true
+ $Container/Label._dialogue("LEVEL %s COMPLETED PRESS enter TO CONTINUE!" % integer)
+ SoundFx.play("victory", -15)
+
+
+func hide(backwards = true):
+ shown = false
+ if backwards:
+ $Container/Label._erase()
+ $Container/AnimationPlayer.play_backwards("Animate")
+ yield($Container/AnimationPlayer, "animation_finished")
+ $Container.hide()
diff --git a/WinScreen.tscn b/WinScreen.tscn
new file mode 100644
index 0000000..45e9031
--- /dev/null
+++ b/WinScreen.tscn
@@ -0,0 +1,71 @@
+[gd_scene load_steps=5 format=2]
+
+[ext_resource path="res://Label.tscn" type="PackedScene" id=1]
+[ext_resource path="res://WinScreen.gd" type="Script" id=2]
+
+[sub_resource type="Animation" id=3]
+resource_name = "Animate"
+length = 2.0
+tracks/0/type = "value"
+tracks/0/path = NodePath("Panel:color")
+tracks/0/interp = 2
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 2 ),
+"transitions": PoolRealArray( -2, -2 ),
+"update": 0,
+"values": [ Color( 0, 0, 0, 0 ), Color( 0, 0, 0, 0.784314 ) ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Label:rect_scale")
+tracks/1/interp = 2
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 2 ),
+"transitions": PoolRealArray( -2, -2 ),
+"update": 0,
+"values": [ Vector2( 1e-05, 1e-05 ), Vector2( 1, 1 ) ]
+}
+
+[sub_resource type="Animation" id=2]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/path = NodePath("Panel:color")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0 ),
+"transitions": PoolRealArray( 1 ),
+"update": 0,
+"values": [ Color( 0, 0, 0, 0 ) ]
+}
+
+[node name="WinScreen" type="CanvasLayer"]
+script = ExtResource( 2 )
+
+[node name="Container" type="Control" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Panel" type="ColorRect" parent="Container"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+color = Color( 0, 0, 0, 0 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Label" parent="Container" instance=ExtResource( 1 )]
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="Container"]
+anims/Animate = SubResource( 3 )
+anims/RESET = SubResource( 2 )
diff --git a/World.gd b/World.gd
new file mode 100644
index 0000000..f09c12b
--- /dev/null
+++ b/World.gd
@@ -0,0 +1,136 @@
+extends Node2D
+
+var currentintlevel := 1
+var screenshots = 0
+var game_over = false setget set_over
+var game_won = false setget set_won
+var over = false
+var just_started = true
+
+onready var level := $Level
+onready var console = MainInstances.console
+
+const path = "user://"
+
+
+func _ready():
+ if Utils.starting:
+ start()
+ Utils.starting = false
+ if Utils.loading:
+ Utils.loading = false
+ currentintlevel = Utils.loading_int
+ Utils.loading_int = 0
+ start()
+ $WinScreen.player = $Level/LevelContainer/Player
+ $WinScreen.hide(false)
+ level.connect("level_completed", self, "_on_Level_level_completed")
+ level.connect("level_reset", self, "_on_Level_level_reset")
+ level.connect("game_over", self, "_on_Level_game_over")
+
+
+func _on_Level_level_completed(complete = false):
+ $Level/CanvasLayer/HUD/StopWatch.set_process(false)
+ if complete:
+ $WinScreen._show(str(level.current_level))
+ save(currentintlevel + 1)
+ game_over = false
+ game_won = true
+ else:
+ $Level/LevelContainer/LevelComplete.play("Animate")
+ get_tree().call_group("target", "play_pulse")
+
+
+func _on_Level_level_reset():
+ $WinScreen.hide(true)
+ $GameoverScreen.hide(true)
+ game_over = false
+ game_won = false
+
+
+func save(new_level): # what level are we on/going to
+ if (new_level) > int(SaveLoad.files.level.data.highest_level):
+ SaveLoad.files.level.data.highest_level = str(new_level - 1)
+ console.Log("New Highscore!")
+ SaveLoad.save("level")
+
+
+func _on_Level_game_over():
+ game_over = true
+ game_won = false
+ $GameoverScreen._show(str(level.current_level))
+
+
+onready var cam = $Level/LevelContainer/Player.cam
+
+var max_zoom = 3
+var min_zoom = .25
+
+
+func _input(event: InputEvent):
+ if event.is_action("scrollup"):
+ var new_zoom = cam.zoom.x
+ new_zoom += .01
+ new_zoom = clamp(new_zoom, min_zoom, max_zoom)
+ cam.zoom = Vector2(new_zoom, new_zoom)
+
+ elif event.is_action("scrolldown"):
+ var new_zoom = cam.zoom.x
+ new_zoom -= .03
+ new_zoom = clamp(new_zoom, min_zoom, max_zoom)
+ cam.zoom = Vector2(new_zoom, new_zoom)
+
+ elif event.is_action_released("next"):
+ currentintlevel += 1
+ currentintlevel = clamp(currentintlevel, 1, 60)
+
+ start()
+
+ if event.is_action_released("ui_accept"):
+ if $WinScreen.shown:
+ currentintlevel += 1
+ $WinScreen.hide(true)
+ game_won = false
+ level.load_level(str(currentintlevel))
+
+ elif $GameoverScreen.shown:
+ $GameoverScreen.hide(true)
+ game_won = false
+ game_over = false
+ level.load_level(str(currentintlevel), false)
+
+ elif event.is_action_released("prtscrn"):
+ screenshots += 1
+ screenshots = clamp(screenshots, 0, 20)
+ var save_path = path + "sokobanscreenshot_%s.png" % str(screenshots)
+ var image = get_viewport().get_texture().get_data()
+ image.flip_y()
+ if console.Log(
+ (
+ "saved to: "
+ + OS.get_user_data_dir()
+ + "/"
+ + "sokobanscreenshot_%s.png" % str(screenshots)
+ ),
+ 1,
+ 2.5
+ ):
+ image.save_png(save_path)
+
+
+func start():
+ Utils.load_loading_screen()
+ yield(Utils, "loaded_loading_screen")
+ $Level/CanvasLayer/HUD.show()
+ level.show()
+ level.load_level(str(currentintlevel))
+
+
+func set_won(value):
+ game_won = value
+ over = game_over or game_won
+
+
+func set_over(value):
+ game_over = value
+ over = game_over or game_won
diff --git a/World.tscn b/World.tscn
new file mode 100644
index 0000000..f9b4553
--- /dev/null
+++ b/World.tscn
@@ -0,0 +1,29 @@
+[gd_scene load_steps=8 format=2]
+
+[ext_resource path="res://Level.tscn" type="PackedScene" id=1]
+[ext_resource path="res://console.tscn" type="PackedScene" id=2]
+[ext_resource path="res://World.gd" type="Script" id=3]
+[ext_resource path="res://WinScreen.tscn" type="PackedScene" id=4]
+[ext_resource path="res://MobileInputs.tscn" type="PackedScene" id=5]
+[ext_resource path="res://GameoverScreen.tscn" type="PackedScene" id=6]
+[ext_resource path="res://Pause.tscn" type="PackedScene" id=7]
+
+[node name="World" type="Node2D" groups=["input"]]
+script = ExtResource( 3 )
+
+[node name="CanvasModulate" type="CanvasModulate" parent="."]
+visible = false
+color = Color( 0.415686, 0.415686, 0.415686, 1 )
+
+[node name="Level" parent="." instance=ExtResource( 1 )]
+visible = false
+
+[node name="WinScreen" parent="." instance=ExtResource( 4 )]
+
+[node name="GameoverScreen" parent="." instance=ExtResource( 6 )]
+
+[node name="MobileInputs" parent="." instance=ExtResource( 5 )]
+
+[node name="Pause" parent="." instance=ExtResource( 7 )]
+
+[node name="console" parent="." instance=ExtResource( 2 )]
diff --git a/arrow.png b/arrow.png
new file mode 100644
index 0000000..9c67940
--- /dev/null
+++ b/arrow.png
Binary files differ
diff --git a/arrow.png.import b/arrow.png.import
new file mode 100644
index 0000000..989b2f1
--- /dev/null
+++ b/arrow.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/arrow.png-9a52328c9c8f79a188b7fabb13b1f3fc.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://arrow.png"
+dest_files=[ "res://.import/arrow.png-9a52328c9c8f79a188b7fabb13b1f3fc.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/box.png b/box.png
new file mode 100644
index 0000000..7127308
--- /dev/null
+++ b/box.png
Binary files differ
diff --git a/box.png.import b/box.png.import
new file mode 100644
index 0000000..406f655
--- /dev/null
+++ b/box.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/box.png-196cb2b6d7422a4ab3b9c60b5a994fe3.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://box.png"
+dest_files=[ "res://.import/box.png-196cb2b6d7422a4ab3b9c60b5a994fe3.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/box_normal.png b/box_normal.png
new file mode 100644
index 0000000..b61bf9e
--- /dev/null
+++ b/box_normal.png
Binary files differ
diff --git a/box_normal.png.import b/box_normal.png.import
new file mode 100644
index 0000000..9ef8247
--- /dev/null
+++ b/box_normal.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/box_normal.png-4ab3172ed1cab6e2c2937f697957b48b.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://box_normal.png"
+dest_files=[ "res://.import/box_normal.png-4ab3172ed1cab6e2c2937f697957b48b.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/checked_box.png b/checked_box.png
new file mode 100644
index 0000000..070262b
--- /dev/null
+++ b/checked_box.png
Binary files differ
diff --git a/checked_box.png.import b/checked_box.png.import
new file mode 100644
index 0000000..82a15a7
--- /dev/null
+++ b/checked_box.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/checked_box.png-a413fe7d6aa4e2798e5d8bd072b7bf58.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://checked_box.png"
+dest_files=[ "res://.import/checked_box.png-a413fe7d6aa4e2798e5d8bd072b7bf58.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/circle.png b/circle.png
new file mode 100644
index 0000000..a3aff8c
--- /dev/null
+++ b/circle.png
Binary files differ
diff --git a/circle.png.import b/circle.png.import
new file mode 100644
index 0000000..2e2e79f
--- /dev/null
+++ b/circle.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/circle.png-10953cad44a8947fbdd4128a631e9e52.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://circle.png"
+dest_files=[ "res://.import/circle.png-10953cad44a8947fbdd4128a631e9e52.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/clean_import.py b/clean_import.py
new file mode 100644
index 0000000..027d9f0
--- /dev/null
+++ b/clean_import.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python3
+
+import re
+from glob import iglob
+import json
+import os
+
+used = set()
+unused = set()
+
+re_dest_files = re.compile(r'^dest_files=(\[.*\])$')
+
+# for all *.import files in project:
+for path in iglob("**/*.import", recursive=True):
+ with open(path, 'r') as f:
+ # find the dest_files line in the [deps] section
+ deps = False
+ found = False
+ for line in f:
+ if not deps:
+ deps = (line == '[deps]\n')
+ continue
+ else:
+ if line[0] == '[':
+ # new section encountered, somehow there's no dest_files
+ break
+
+ # extract the imported file path(s)
+ match = re_dest_files.match(line)
+ if match:
+ paths_str = match.group(1)
+ paths = json.loads(paths_str)
+ md5s = set()
+ for i, p in enumerate(paths):
+ # remove 'res://'
+ paths[i] = p[6:]
+ md5s.add(os.path.splitext(paths[i])[0] + '.md5')
+
+ used |= set(paths)
+ used |= md5s
+ found = True
+ break
+
+ if not found:
+ print(f"warning: {path}: no deps.dest_files")
+
+# find every file in .import/ that isn't referenced in a *.import file
+for path in iglob('.import/*'):
+ if path not in used:
+ unused.add(path)
+
+# do this alphabetically for nicer terminal output
+unused = list(unused)
+unused.sort()
+n = 0
+
+for path in unused:
+ print(path)
+ os.remove(path)
+ n += 1
+
+print('---')
+print(f'removed {n} files from .import/')
diff --git a/console.gd b/console.gd
new file mode 100644
index 0000000..fcf17c7
--- /dev/null
+++ b/console.gd
@@ -0,0 +1,32 @@
+extends CanvasLayer
+
+onready var label = $Label
+onready var tween = $Tween
+
+
+func _ready():
+ MainInstances.console = self
+ label.percent_visible = 0
+
+
+func Log(new_text: String, time := .5, length := 2.5):
+ if tween.is_active():
+ return false
+ label.percent_visible = 0
+ label.text = new_text
+ tween_(0, 1, time)
+ yield(tween, "tween_all_completed")
+ yield(get_tree().create_timer(length), "timeout")
+ tween_(1, 0, time)
+ return true
+
+
+func _exit_tree():
+ MainInstances.console = null
+
+
+func tween_(from, to, time):
+ tween.interpolate_property(
+ $Label, "percent_visible", from, to, time, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
+ )
+ tween.start()
diff --git a/console.tscn b/console.tscn
new file mode 100644
index 0000000..51e6502
--- /dev/null
+++ b/console.tscn
@@ -0,0 +1,29 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://theme.tres" type="Theme" id=1]
+[ext_resource path="res://console.gd" type="Script" id=2]
+[ext_resource path="res://smallfont.tres" type="DynamicFont" id=3]
+
+[node name="console" type="CanvasLayer"]
+pause_mode = 2
+layer = 3
+script = ExtResource( 2 )
+
+[node name="Label" type="Label" parent="."]
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 8.0
+margin_top = -24.0
+margin_right = -8.0
+margin_bottom = -14.0
+theme = ExtResource( 1 )
+custom_fonts/font = ExtResource( 3 )
+valign = 1
+autowrap = true
+percent_visible = 0.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Tween" type="Tween" parent="."]
diff --git a/cube_normal.png b/cube_normal.png
new file mode 100644
index 0000000..1106a55
--- /dev/null
+++ b/cube_normal.png
Binary files differ
diff --git a/cube_normal.png.import b/cube_normal.png.import
new file mode 100644
index 0000000..c64fcbb
--- /dev/null
+++ b/cube_normal.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/cube_normal.png-ff88bc9b783bfa228efa5945105d185b.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://cube_normal.png"
+dest_files=[ "res://.import/cube_normal.png-ff88bc9b783bfa228efa5945105d185b.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/cuberot.png b/cuberot.png
new file mode 100644
index 0000000..00d9ac2
--- /dev/null
+++ b/cuberot.png
Binary files differ
diff --git a/cuberot.png.import b/cuberot.png.import
new file mode 100644
index 0000000..f742b1b
--- /dev/null
+++ b/cuberot.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/cuberot.png-09a3b8edec03f9428006f7e69a73b4eb.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://cuberot.png"
+dest_files=[ "res://.import/cuberot.png-09a3b8edec03f9428006f7e69a73b4eb.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/decoration.png b/decoration.png
new file mode 100644
index 0000000..b975bc2
--- /dev/null
+++ b/decoration.png
Binary files differ
diff --git a/decoration.png.import b/decoration.png.import
new file mode 100644
index 0000000..628ea85
--- /dev/null
+++ b/decoration.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/decoration.png-2c41963842a7ec2bc4646726edcd568c.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://decoration.png"
+dest_files=[ "res://.import/decoration.png-2c41963842a7ec2bc4646726edcd568c.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/default_env.tres b/default_env.tres
new file mode 100644
index 0000000..20207a4
--- /dev/null
+++ b/default_env.tres
@@ -0,0 +1,7 @@
+[gd_resource type="Environment" load_steps=2 format=2]
+
+[sub_resource type="ProceduralSky" id=1]
+
+[resource]
+background_mode = 2
+background_sky = SubResource( 1 )
diff --git a/explode.png b/explode.png
new file mode 100644
index 0000000..707a6e8
--- /dev/null
+++ b/explode.png
Binary files differ
diff --git a/explode.png.import b/explode.png.import
new file mode 100644
index 0000000..a817c89
--- /dev/null
+++ b/explode.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/explode.png-d4ea30f12ff0a2274a9cd85ead11bc93.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://explode.png"
+dest_files=[ "res://.import/explode.png-d4ea30f12ff0a2274a9cd85ead11bc93.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/export_presets.cfg b/export_presets.cfg
index 9270cf2..b0a6f12 100644
--- a/export_presets.cfg
+++ b/export_presets.cfg
@@ -83,7 +83,7 @@ script_encryption_key=""
custom_template/debug=""
custom_template/release=""
-variant/export_type=0
+variant/export_type=1
vram_texture_compression/for_desktop=true
vram_texture_compression/for_mobile=false
html/export_icon=true
diff --git a/focus_box.tres b/focus_box.tres
new file mode 100644
index 0000000..85ab432
--- /dev/null
+++ b/focus_box.tres
@@ -0,0 +1,15 @@
+[gd_resource type="StyleBoxTexture" load_steps=2 format=2]
+
+[ext_resource path="res://focused.png" type="Texture" id=1]
+
+[resource]
+texture = ExtResource( 1 )
+region_rect = Rect2( 0, 0, 12, 12 )
+margin_left = 1.0
+margin_right = 1.0
+margin_top = 1.0
+margin_bottom = 1.0
+expand_margin_left = 2.0
+expand_margin_right = 2.0
+expand_margin_top = 2.0
+expand_margin_bottom = 2.0
diff --git a/focused.png b/focused.png
new file mode 100644
index 0000000..12b0188
--- /dev/null
+++ b/focused.png
Binary files differ
diff --git a/focused.png.import b/focused.png.import
new file mode 100644
index 0000000..204665a
--- /dev/null
+++ b/focused.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/focused.png-2787c2852fdac55d3bd87c2ee5c1d87d.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://focused.png"
+dest_files=[ "res://.import/focused.png-2787c2852fdac55d3bd87c2ee5c1d87d.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/font.tres b/font.tres
new file mode 100644
index 0000000..134b904
--- /dev/null
+++ b/font.tres
@@ -0,0 +1,7 @@
+[gd_resource type="DynamicFont" load_steps=2 format=2]
+
+[ext_resource path="res://04B_19__.TTF" type="DynamicFontData" id=1]
+
+[resource]
+size = 14
+font_data = ExtResource( 1 )
diff --git a/gameover.wav b/gameover.wav
new file mode 100644
index 0000000..489b8d8
--- /dev/null
+++ b/gameover.wav
Binary files differ
diff --git a/gameover.wav.import b/gameover.wav.import
new file mode 100644
index 0000000..59ef426
--- /dev/null
+++ b/gameover.wav.import
@@ -0,0 +1,21 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/gameover.wav-3be9b8c5e5110c6cb40d0384ce2294af.sample"
+
+[deps]
+
+source_file="res://gameover.wav"
+dest_files=[ "res://.import/gameover.wav-3be9b8c5e5110c6cb40d0384ce2294af.sample" ]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop=false
+compress/mode=0
diff --git a/globalsettings.gd b/globalsettings.gd
new file mode 100644
index 0000000..1ac14c5
--- /dev/null
+++ b/globalsettings.gd
@@ -0,0 +1,8 @@
+extends Node
+
+var stopwatch = false setget set_stopwatch
+
+
+func set_stopwatch(set):
+ stopwatch = set
+ MainInstances.stopwatch.visible = stopwatch
diff --git a/icon.ico b/icon.ico
new file mode 100644
index 0000000..df08788
--- /dev/null
+++ b/icon.ico
Binary files differ
diff --git a/icon.png b/icon.png
new file mode 100644
index 0000000..b54c5a3
--- /dev/null
+++ b/icon.png
Binary files differ
diff --git a/icon.png.import b/icon.png.import
new file mode 100644
index 0000000..eb3cdb6
--- /dev/null
+++ b/icon.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/light.png b/light.png
new file mode 100644
index 0000000..02a6db5
--- /dev/null
+++ b/light.png
Binary files differ
diff --git a/light.png.import b/light.png.import
new file mode 100644
index 0000000..a6a492c
--- /dev/null
+++ b/light.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/light.png-06e94102f0cce323cff7daad56cf3030.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://light.png"
+dest_files=[ "res://.import/light.png-06e94102f0cce323cff7daad56cf3030.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/light2.png b/light2.png
new file mode 100644
index 0000000..d881238
--- /dev/null
+++ b/light2.png
Binary files differ
diff --git a/light2.png.import b/light2.png.import
new file mode 100644
index 0000000..8346d66
--- /dev/null
+++ b/light2.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/light2.png-dee1bf19f8401eaf91e919d393d086f5.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://light2.png"
+dest_files=[ "res://.import/light2.png-dee1bf19f8401eaf91e919d393d086f5.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/lite_music.wav b/lite_music.wav
new file mode 100644
index 0000000..fbb17cf
--- /dev/null
+++ b/lite_music.wav
Binary files differ
diff --git a/lite_music.wav.import b/lite_music.wav.import
new file mode 100644
index 0000000..37b8651
--- /dev/null
+++ b/lite_music.wav.import
@@ -0,0 +1,21 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/lite_music.wav-8612a26230fdd6c75b9675c384a0f642.sample"
+
+[deps]
+
+source_file="res://lite_music.wav"
+dest_files=[ "res://.import/lite_music.wav-8612a26230fdd6c75b9675c384a0f642.sample" ]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop=false
+compress/mode=0
diff --git a/motion_box.wav b/motion_box.wav
new file mode 100644
index 0000000..fd9b973
--- /dev/null
+++ b/motion_box.wav
Binary files differ
diff --git a/motion_box.wav.import b/motion_box.wav.import
new file mode 100644
index 0000000..5ea14b3
--- /dev/null
+++ b/motion_box.wav.import
@@ -0,0 +1,21 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/motion_box.wav-738ca3888318f2d49b69099483b8cbb2.sample"
+
+[deps]
+
+source_file="res://motion_box.wav"
+dest_files=[ "res://.import/motion_box.wav-738ca3888318f2d49b69099483b8cbb2.sample" ]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop=false
+compress/mode=0
diff --git a/pause.png b/pause.png
new file mode 100644
index 0000000..d7d7b05
--- /dev/null
+++ b/pause.png
Binary files differ
diff --git a/pause.png.import b/pause.png.import
new file mode 100644
index 0000000..8aa515a
--- /dev/null
+++ b/pause.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/pause.png-fae43b08edb08fdf891c9b1e11f62ed7.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://pause.png"
+dest_files=[ "res://.import/pause.png-fae43b08edb08fdf891c9b1e11f62ed7.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/project.godot b/project.godot
index 663e841..47f6832 100644
--- a/project.godot
+++ b/project.godot
@@ -8,56 +8,165 @@
config_version=4
-_global_script_classes=[ {
-"base": "Reference",
-"class": "Arg",
-"language": "GDScript",
-"path": "res://addons/gdcli/Arg.gd"
-}, {
-"base": "Reference",
-"class": "Parser",
-"language": "GDScript",
-"path": "res://addons/gdcli/Parser.gd"
-} ]
-_global_script_class_icons={
-"Arg": "",
-"Parser": ""
-}
-
[application]
-config/name="Godot Template"
-run/main_scene="res://Main.tscn"
+config/name="sokoban"
+run/main_scene="res://StartScreen.tscn"
config/use_custom_user_dir=true
-config/custom_user_dir_name="GodotTemplate"
+config/custom_user_dir_name="sokoban"
+boot_splash/image="res://icon.png"
+boot_splash/use_filter=false
+boot_splash/bg_color=Color( 0.141176, 0.141176, 0.141176, 0 )
+config/icon="res://icon.png"
+config/windows_native_icon="res://icon.ico"
[autoload]
-CLI="*res://autoloads/CLI.gd"
+Music="*res://Music.tscn"
+SoundFx="*res://SoundFX.tscn"
+Utils="*res://Utils.gd"
+MainInstances="*res://MainInstances.gd"
+globalsettings="*res://globalsettings.gd"
+SaveLoad="*res://Save_Load.gd"
[debug]
+gdscript/warnings/narrowing_conversion=false
gdscript/warnings/return_value_discarded=false
[display]
window/size/width=320
-window/size/height=180
+window/size/height=320
+window/size/fullscreen=true
window/size/test_width=1280
window/size/test_height=720
-window/dpi/allow_hidpi=true
window/stretch/mode="2d"
-window/stretch/aspect="keep"
+window/stretch/aspect="expand"
+
+[importer_defaults]
+
+texture={
+"compress/bptc_ldr": 0,
+"compress/hdr_mode": 0,
+"compress/lossy_quality": 0.7,
+"compress/mode": 0,
+"compress/normal_map": 0,
+"detect_3d": false,
+"flags/anisotropic": false,
+"flags/filter": false,
+"flags/mipmaps": false,
+"flags/repeat": 0,
+"flags/srgb": 2,
+"process/HDR_as_SRGB": false,
+"process/fix_alpha_border": true,
+"process/invert_color": false,
+"process/normal_map_invert_y": false,
+"process/premult_alpha": false,
+"size_limit": 0,
+"stream": false,
+"svg/scale": 1.0
+}
+
+[input]
+
+ui_accept={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777221,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777222,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
+ ]
+}
+ui_select={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":3,"pressure":0.0,"pressed":false,"script":null)
+ ]
+}
+ui_left={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+ui_right={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":15,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+ui_up={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+ui_down={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+level_reload={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777217,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":5,"pressure":0.0,"pressed":false,"script":null)
+ ]
+}
+undo_last_move={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":90,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":true,"meta":true,"command":true,"pressed":false,"scancode":90,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+prtscrn={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":81,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+scrollup={
+"deadzone": 0.5,
+"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":4,"pressed":false,"doubleclick":false,"script":null)
+ ]
+}
+scrolldown={
+"deadzone": 0.5,
+"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":5,"pressed":false,"doubleclick":false,"script":null)
+ ]
+}
+next={
+"deadzone": 0.5,
+"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":92,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
+ ]
+}
+
+[layer_names]
+
+2d_physics/layer_1="player"
+2d_physics/layer_2="box"
-[logging]
+[physics]
-file_logging/enable_file_logging=true
+common/enable_pause_aware_picking=true
[rendering]
quality/driver/driver_name="GLES2"
-2d/options/use_nvidia_rect_flicker_workaround=true
-quality/intended_usage/framebuffer_allocation=0
-quality/intended_usage/framebuffer_allocation.mobile=0
-2d/snapping/use_gpu_pixel_snap=true
+quality/intended_usage/framebuffer_allocation=1
+quality/intended_usage/framebuffer_allocation.mobile=1
+threads/thread_model=2
vram_compression/import_etc=true
+vram_compression/import_etc2=false
+quality/filters/anisotropic_filter_level=1
+environment/default_environment="res://default_env.tres"
diff --git a/settings.png b/settings.png
new file mode 100644
index 0000000..1d90f42
--- /dev/null
+++ b/settings.png
Binary files differ
diff --git a/settings.png.import b/settings.png.import
new file mode 100644
index 0000000..2faf385
--- /dev/null
+++ b/settings.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/settings.png-ca1e7ab13a25083bf00852ad7dcec7ad.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://settings.png"
+dest_files=[ "res://.import/settings.png-ca1e7ab13a25083bf00852ad7dcec7ad.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/settingshover.png b/settingshover.png
new file mode 100644
index 0000000..1c25443
--- /dev/null
+++ b/settingshover.png
Binary files differ
diff --git a/settingshover.png.import b/settingshover.png.import
new file mode 100644
index 0000000..c1b2cbd
--- /dev/null
+++ b/settingshover.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/settingshover.png-2d84828ae06b96cd0a80e736fdacc9de.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://settingshover.png"
+dest_files=[ "res://.import/settingshover.png-2d84828ae06b96cd0a80e736fdacc9de.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/smallfont.tres b/smallfont.tres
new file mode 100644
index 0000000..644d717
--- /dev/null
+++ b/smallfont.tres
@@ -0,0 +1,7 @@
+[gd_resource type="DynamicFont" load_steps=2 format=2]
+
+[ext_resource path="res://04B_19__.TTF" type="DynamicFontData" id=1]
+
+[resource]
+size = 7
+font_data = ExtResource( 1 )
diff --git a/sokobanner.png b/sokobanner.png
new file mode 100644
index 0000000..3c1a0a1
--- /dev/null
+++ b/sokobanner.png
Binary files differ
diff --git a/sokobanner.png.import b/sokobanner.png.import
new file mode 100644
index 0000000..c2161c5
--- /dev/null
+++ b/sokobanner.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/sokobanner.png-f71309c3ebf55cd42f10170ef398c183.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://sokobanner.png"
+dest_files=[ "res://.import/sokobanner.png-f71309c3ebf55cd42f10170ef398c183.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/sound.wav b/sound.wav
new file mode 100644
index 0000000..037b743
--- /dev/null
+++ b/sound.wav
Binary files differ
diff --git a/sound.wav.import b/sound.wav.import
new file mode 100644
index 0000000..b03a40e
--- /dev/null
+++ b/sound.wav.import
@@ -0,0 +1,21 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/sound.wav-26df8465d7a854262785830b78357950.sample"
+
+[deps]
+
+source_file="res://sound.wav"
+dest_files=[ "res://.import/sound.wav-26df8465d7a854262785830b78357950.sample" ]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop=false
+compress/mode=0
diff --git a/spot.png b/spot.png
new file mode 100644
index 0000000..c2b3fa9
--- /dev/null
+++ b/spot.png
Binary files differ
diff --git a/spot.png.import b/spot.png.import
new file mode 100644
index 0000000..aac3111
--- /dev/null
+++ b/spot.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/spot.png-36b4dfbff4efeea17ec3137d266ffc4a.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://spot.png"
+dest_files=[ "res://.import/spot.png-36b4dfbff4efeea17ec3137d266ffc4a.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/swayshader.tres b/swayshader.tres
new file mode 100644
index 0000000..7ad80e1
--- /dev/null
+++ b/swayshader.tres
@@ -0,0 +1,58 @@
+[gd_resource type="ShaderMaterial" load_steps=2 format=2]
+
+[sub_resource type="Shader" id=1]
+code = "// original wind shader from https://github.com/Maujoe/godot-simple-wind-shader-2d/tree/master/assets/maujoe.simple_wind_shader_2d
+// original script modified by HungryProton so that the assets are moving differently : https://pastebin.com/VL3AfV8D
+//
+// speed - The speed of the wind movement.
+// minStrength - The minimal strength of the wind movement.
+// maxStrength - The maximal strength of the wind movement.
+// strengthScale - Scalefactor for the wind strength.
+// interval - The time between minimal and maximal strength changes.
+// detail - The detail (number of waves) of the wind movement.
+// distortion - The strength of geometry distortion.
+// heightOffset - The height where the wind begins to move. By default 0.0.
+
+shader_type canvas_item;
+render_mode blend_mix;
+
+// Wind settings.
+uniform float speed = 1.0;
+uniform float minStrength : hint_range(0.0, 1.0) = 0.05;
+uniform float maxStrength : hint_range(0.0, 1.0) = 0.01;
+uniform float strengthScale = 100.0;
+uniform float interval = 3.5;
+uniform float detail = 1.0;
+uniform float distortion : hint_range(0.0, 1.0);
+uniform float heightOffset : hint_range(0.0, 1.0);
+
+// With the offset value, you can if you want different moves for each asset. Just put a random value (1, 2, 3) in the editor. Don't forget to mark the material as unique if you use this
+uniform float offset = 0;
+
+
+float getWind(vec2 vertex, vec2 uv, float time){
+ float diff = pow(maxStrength - minStrength, 2.0);
+ float strength = clamp(minStrength + diff + sin(time / interval) * diff, minStrength, maxStrength) * strengthScale;
+ float wind = (sin(time) + cos(time * detail)) * strength * max(0.0, (1.0-uv.y) - heightOffset);
+
+ return wind;
+}
+
+void vertex() {
+ vec4 pos = WORLD_MATRIX * vec4(0.0, 0.0, 0.0, 1.0);
+ float time = TIME * speed + offset;
+ //float time = TIME * speed + pos.x * pos.y ; not working when moving...
+ VERTEX.x += getWind(VERTEX.xy, UV, time);
+}"
+
+[resource]
+shader = SubResource( 1 )
+shader_param/speed = 1.0
+shader_param/minStrength = 0.206
+shader_param/maxStrength = 0.01
+shader_param/strengthScale = 100.0
+shader_param/interval = 5.0
+shader_param/detail = 0.5
+shader_param/distortion = 0.0
+shader_param/heightOffset = 0.5
+shader_param/offset = 0.0
diff --git a/theme.tres b/theme.tres
new file mode 100644
index 0000000..081b167
--- /dev/null
+++ b/theme.tres
@@ -0,0 +1,71 @@
+[gd_resource type="Theme" load_steps=14 format=2]
+
+[ext_resource path="res://04B_19__.TTF" type="DynamicFontData" id=1]
+[ext_resource path="res://transparency.png" type="Texture" id=2]
+[ext_resource path="res://ButtonHoverStylebox.tres" type="StyleBox" id=3]
+[ext_resource path="res://ButtonStylebox.tres" type="StyleBox" id=4]
+[ext_resource path="res://font.tres" type="DynamicFont" id=5]
+[ext_resource path="res://unchecked_box.png" type="Texture" id=6]
+[ext_resource path="res://checked_box.png" type="Texture" id=7]
+[ext_resource path="res://focus_box.tres" type="StyleBox" id=8]
+
+[sub_resource type="StyleBoxEmpty" id=1]
+
+[sub_resource type="StyleBoxEmpty" id=5]
+
+[sub_resource type="DynamicFont" id=3]
+size = 14
+extra_spacing_top = 3
+extra_spacing_char = 1
+font_data = ExtResource( 1 )
+
+[sub_resource type="StyleBoxEmpty" id=6]
+
+[sub_resource type="StyleBoxFlat" id=4]
+bg_color = Color( 0.3009, 0.59, 0.3009, 1 )
+
+[resource]
+default_font = ExtResource( 5 )
+Button/colors/font_color = Color( 1, 1, 1, 1 )
+Button/colors/font_color_disabled = Color( 0.901961, 0.901961, 0.901961, 0 )
+Button/colors/font_color_focus = Color( 1, 1, 1, 1 )
+Button/colors/font_color_hover = Color( 0, 0, 0, 1 )
+Button/colors/font_color_pressed = Color( 0, 0, 0, 1 )
+Button/styles/disabled = SubResource( 1 )
+Button/styles/focus = ExtResource( 8 )
+Button/styles/hover = ExtResource( 3 )
+Button/styles/normal = ExtResource( 4 )
+Button/styles/pressed = ExtResource( 3 )
+CheckBox/colors/font_color = Color( 1, 1, 1, 1 )
+CheckBox/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 )
+CheckBox/colors/font_color_focus = Color( 1, 1, 1, 1 )
+CheckBox/colors/font_color_hover = Color( 0, 0, 0, 1 )
+CheckBox/colors/font_color_hover_pressed = Color( 0, 0, 0, 1 )
+CheckBox/colors/font_color_pressed = Color( 1, 1, 1, 1 )
+CheckBox/constants/check_vadjust = 0
+CheckBox/constants/hseparation = 9
+CheckBox/fonts/font = ExtResource( 5 )
+CheckBox/icons/checked = ExtResource( 7 )
+CheckBox/icons/checked_disabled = null
+CheckBox/icons/radio_checked = null
+CheckBox/icons/radio_checked_disabled = null
+CheckBox/icons/radio_unchecked = null
+CheckBox/icons/radio_unchecked_disabled = null
+CheckBox/icons/unchecked = ExtResource( 6 )
+CheckBox/icons/unchecked_disabled = null
+CheckBox/styles/disabled = SubResource( 5 )
+CheckBox/styles/focus = ExtResource( 8 )
+CheckBox/styles/hover = ExtResource( 3 )
+CheckBox/styles/hover_pressed = ExtResource( 3 )
+CheckBox/styles/normal = ExtResource( 4 )
+CheckBox/styles/pressed = ExtResource( 4 )
+LineEdit/colors/font_color_uneditable = Color( 0.878431, 0.878431, 0.878431, 0 )
+LineEdit/fonts/font = SubResource( 3 )
+LineEdit/styles/focus = ExtResource( 8 )
+LineEdit/styles/normal = ExtResource( 4 )
+LineEdit/styles/read_only = SubResource( 6 )
+ProgressBar/colors/font_color = Color( 1, 1, 1, 1 )
+ProgressBar/colors/font_color_shadow = Color( 0, 0, 0, 1 )
+ProgressBar/styles/bg = ExtResource( 4 )
+ProgressBar/styles/fg = SubResource( 4 )
+SpinBox/icons/updown = ExtResource( 2 )
diff --git a/tilemap.png b/tilemap.png
new file mode 100644
index 0000000..f73ed2b
--- /dev/null
+++ b/tilemap.png
Binary files differ
diff --git a/tilemap.png.import b/tilemap.png.import
new file mode 100644
index 0000000..0cdbd51
--- /dev/null
+++ b/tilemap.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/tilemap.png-838486f2ee5f5764f6a08fbb86e9df3c.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://tilemap.png"
+dest_files=[ "res://.import/tilemap.png-838486f2ee5f5764f6a08fbb86e9df3c.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/tilemap.tres b/tilemap.tres
new file mode 100644
index 0000000..32330f9
--- /dev/null
+++ b/tilemap.tres
@@ -0,0 +1,490 @@
+[gd_resource type="TileSet" load_steps=54 format=2]
+
+[ext_resource path="res://tilemap_normal.png" type="Texture" id=1]
+[ext_resource path="res://tilemap.png" type="Texture" id=2]
+
+[sub_resource type="ConvexPolygonShape2D" id=95]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=96]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=97]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=98]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=99]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=100]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=101]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=102]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=103]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=104]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=105]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=106]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=107]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=108]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=109]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=110]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=111]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=112]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=113]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=114]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=115]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=116]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=117]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=118]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=119]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=120]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=121]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=122]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=123]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=124]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=125]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=126]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=127]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=128]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=129]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=130]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=131]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=132]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=133]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=135]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=136]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=137]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=138]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=139]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=140]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=141]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=142]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=143]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=144]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=145]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[sub_resource type="ConvexPolygonShape2D" id=146]
+points = PoolVector2Array( 0, 0, 16, 0, 16, 16, 0, 16 )
+
+[resource]
+1/name = "tilemap.png 1"
+1/texture = ExtResource( 2 )
+1/normal_map = ExtResource( 1 )
+1/tex_offset = Vector2( 0, 0 )
+1/modulate = Color( 1, 1, 1, 1 )
+1/region = Rect2( 0, 0, 208, 96 )
+1/tile_mode = 1
+1/autotile/bitmask_mode = 1
+1/autotile/bitmask_flags = [ Vector2( 0, 0 ), 432, Vector2( 0, 1 ), 438, Vector2( 0, 2 ), 54, Vector2( 0, 3 ), 48, Vector2( 1, 0 ), 504, Vector2( 1, 1 ), 511, Vector2( 1, 2 ), 63, Vector2( 1, 3 ), 56, Vector2( 2, 0 ), 216, Vector2( 2, 1 ), 219, Vector2( 2, 2 ), 27, Vector2( 2, 3 ), 24, Vector2( 3, 0 ), 144, Vector2( 3, 1 ), 146, Vector2( 3, 2 ), 18, Vector2( 3, 3 ), 16, Vector2( 4, 0 ), 255, Vector2( 4, 1 ), 507, Vector2( 5, 0 ), 447, Vector2( 5, 1 ), 510, Vector2( 5, 2 ), 191, Vector2( 5, 3 ), 506, Vector2( 6, 0 ), 254, Vector2( 6, 1 ), 446, Vector2( 6, 2 ), 442, Vector2( 6, 3 ), 190, Vector2( 7, 0 ), 443, Vector2( 7, 1 ), 251, Vector2( 7, 2 ), 250, Vector2( 7, 3 ), 187, Vector2( 7, 4 ), 178, Vector2( 7, 5 ), 50, Vector2( 8, 0 ), 182, Vector2( 8, 1 ), 434, Vector2( 8, 2 ), 248, Vector2( 8, 3 ), 59, Vector2( 8, 4 ), 154, Vector2( 8, 5 ), 26, Vector2( 9, 0 ), 155, Vector2( 9, 1 ), 218, Vector2( 9, 2 ), 440, Vector2( 9, 3 ), 62, Vector2( 10, 0 ), 176, Vector2( 10, 1 ), 178, Vector2( 10, 2 ), 50, Vector2( 11, 0 ), 184, Vector2( 11, 1 ), 186, Vector2( 11, 2 ), 58, Vector2( 12, 0 ), 152, Vector2( 12, 1 ), 154, Vector2( 12, 2 ), 26 ]
+1/autotile/icon_coordinate = Vector2( 3, 3 )
+1/autotile/tile_size = Vector2( 16, 16 )
+1/autotile/spacing = 0
+1/autotile/occluder_map = [ ]
+1/autotile/navpoly_map = [ ]
+1/autotile/priority_map = [ ]
+1/autotile/z_index_map = [ ]
+1/occluder_offset = Vector2( 0, 0 )
+1/navigation_offset = Vector2( 0, 0 )
+1/shape_offset = Vector2( 0, 0 )
+1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
+1/shape = SubResource( 95 )
+1/shape_one_way = false
+1/shape_one_way_margin = 1.0
+1/shapes = [ {
+"autotile_coord": Vector2( 0, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 95 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 2, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 96 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 1, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 97 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 2, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 98 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 1, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 99 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 0, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 100 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 0, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 101 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 1, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 102 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 2, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 103 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 3, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 104 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 3, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 105 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 3, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 106 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 3, 3 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 107 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 1, 3 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 108 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 0, 3 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 109 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 2, 3 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 110 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 5, 3 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 111 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 5, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 112 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 6, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 113 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 6, 3 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 114 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 7, 3 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 115 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 7, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 116 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 6, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 117 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 7, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 118 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 10, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 119 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 11, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 120 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 12, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 121 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 12, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 122 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 12, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 123 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 11, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 124 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 10, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 125 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 10, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 126 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 11, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 127 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 9, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 128 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 8, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 129 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 8, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 130 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 9, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 131 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 8, 4 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 132 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 7, 4 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 133 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 6, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 135 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 7, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 136 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 8, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 137 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 9, 3 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 138 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 9, 2 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 139 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 8, 3 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 140 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 4, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 141 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 5, 0 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 142 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 4, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 143 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 5, 1 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 144 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 8, 5 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 145 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+}, {
+"autotile_coord": Vector2( 7, 5 ),
+"one_way": false,
+"one_way_margin": 1.0,
+"shape": SubResource( 146 ),
+"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
+} ]
+1/z_index = 0
diff --git a/tilemap_normal.png b/tilemap_normal.png
new file mode 100644
index 0000000..75db44b
--- /dev/null
+++ b/tilemap_normal.png
Binary files differ
diff --git a/tilemap_normal.png.import b/tilemap_normal.png.import
new file mode 100644
index 0000000..466481d
--- /dev/null
+++ b/tilemap_normal.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/tilemap_normal.png-0eff8adf9abadc23777d95b0cc7de0cb.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://tilemap_normal.png"
+dest_files=[ "res://.import/tilemap_normal.png-0eff8adf9abadc23777d95b0cc7de0cb.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/tileset.png b/tileset.png
new file mode 100644
index 0000000..db7a7a5
--- /dev/null
+++ b/tileset.png
Binary files differ
diff --git a/tileset.png.import b/tileset.png.import
new file mode 100644
index 0000000..d8ea61a
--- /dev/null
+++ b/tileset.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/tileset.png-a39e944f25b35d62f55d4f98a36e2b5e.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://tileset.png"
+dest_files=[ "res://.import/tileset.png-a39e944f25b35d62f55d4f98a36e2b5e.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/transparency.png b/transparency.png
new file mode 100644
index 0000000..6f51cc5
--- /dev/null
+++ b/transparency.png
Binary files differ
diff --git a/transparency.png.import b/transparency.png.import
new file mode 100644
index 0000000..0a9115c
--- /dev/null
+++ b/transparency.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/transparency.png-348497b2345afb8aa9666982c1fc0d27.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://transparency.png"
+dest_files=[ "res://.import/transparency.png-348497b2345afb8aa9666982c1fc0d27.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/tree.png b/tree.png
new file mode 100644
index 0000000..e8277cf
--- /dev/null
+++ b/tree.png
Binary files differ
diff --git a/tree.png.import b/tree.png.import
new file mode 100644
index 0000000..79826ea
--- /dev/null
+++ b/tree.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/tree.png-e0869f9fb9c148a5baf00bb62a85d6ad.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://tree.png"
+dest_files=[ "res://.import/tree.png-e0869f9fb9c148a5baf00bb62a85d6ad.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/unchecked_box.png b/unchecked_box.png
new file mode 100644
index 0000000..460b312
--- /dev/null
+++ b/unchecked_box.png
Binary files differ
diff --git a/unchecked_box.png.import b/unchecked_box.png.import
new file mode 100644
index 0000000..cb79345
--- /dev/null
+++ b/unchecked_box.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/unchecked_box.png-c64ad1219dc112c36269a905ae1a1e83.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://unchecked_box.png"
+dest_files=[ "res://.import/unchecked_box.png-c64ad1219dc112c36269a905ae1a1e83.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0
diff --git a/victory.wav b/victory.wav
new file mode 100644
index 0000000..4487897
--- /dev/null
+++ b/victory.wav
Binary files differ
diff --git a/victory.wav.import b/victory.wav.import
new file mode 100644
index 0000000..52e5cbd
--- /dev/null
+++ b/victory.wav.import
@@ -0,0 +1,21 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/victory.wav-77722d69fa30ee785088827217b1cbe2.sample"
+
+[deps]
+
+source_file="res://victory.wav"
+dest_files=[ "res://.import/victory.wav-77722d69fa30ee785088827217b1cbe2.sample" ]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop=false
+compress/mode=0
diff --git a/walk.wav b/walk.wav
new file mode 100644
index 0000000..b6c1f96
--- /dev/null
+++ b/walk.wav
Binary files differ
diff --git a/walk.wav.import b/walk.wav.import
new file mode 100644
index 0000000..396f2b6
--- /dev/null
+++ b/walk.wav.import
@@ -0,0 +1,21 @@
+[remap]
+
+importer="wav"
+type="AudioStreamSample"
+path="res://.import/walk.wav-bbe5667e3f079279fb04a584db26b7ff.sample"
+
+[deps]
+
+source_file="res://walk.wav"
+dest_files=[ "res://.import/walk.wav-bbe5667e3f079279fb04a584db26b7ff.sample" ]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop=false
+compress/mode=0
diff --git a/wall.png b/wall.png
new file mode 100644
index 0000000..b930cc8
--- /dev/null
+++ b/wall.png
Binary files differ
diff --git a/wall.png.import b/wall.png.import
new file mode 100644
index 0000000..25a5a07
--- /dev/null
+++ b/wall.png.import
@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/wall.png-e3261c66ad83b71f524576fb4f3c7b5b.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://wall.png"
+dest_files=[ "res://.import/wall.png-e3261c66ad83b71f524576fb4f3c7b5b.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=false
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+process/normal_map_invert_y=false
+stream=false
+size_limit=0
+detect_3d=false
+svg/scale=1.0