summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2024-09-28 15:27:57 +0200
committerDaniel Weipert <git@mail.dweipert.de>2024-09-28 15:27:57 +0200
commit6032b3dc82ccbb3710061059c90b7db40df19673 (patch)
treea99682fb23bcd8a1ddd01f4f137bee2d46fa4b1f
parenta38f65c261e9d7b23d046cb76b5aeedc05c4b54d (diff)
next commitHEADmain
-rw-r--r--Assets/Enemies/apple.pngbin0 -> 296 bytes
-rw-r--r--Assets/Enemies/apple.png.import34
-rw-r--r--Assets/Enemies/effects.pngbin0 -> 35723 bytes
-rw-r--r--Assets/Enemies/effects.png.import34
-rw-r--r--Assets/Enemies/enemy-flying-01.pngbin0 -> 297 bytes
-rw-r--r--Assets/Enemies/enemy-flying-01.png.import34
-rw-r--r--Assets/Enemies/enemy-flying-02.pngbin0 -> 299 bytes
-rw-r--r--Assets/Enemies/enemy-flying-02.png.import34
-rw-r--r--Assets/Enemies/enemy-jumping-01.pngbin0 -> 259 bytes
-rw-r--r--Assets/Enemies/enemy-jumping-01.png.import34
-rw-r--r--Assets/Enemies/enemy-jumping-02.pngbin0 -> 297 bytes
-rw-r--r--Assets/Enemies/enemy-jumping-02.png.import34
-rw-r--r--Assets/Enemies/enemy-jumping-03.pngbin0 -> 313 bytes
-rw-r--r--Assets/Enemies/enemy-jumping-03.png.import34
-rw-r--r--Assets/Map/DroppablePlatform01.tscn23
-rw-r--r--Assets/Map/DroppablePlatform02.tscn29
-rw-r--r--Assets/Map/DroppablePlatform03.tscn35
-rw-r--r--Assets/Map/TileMapLayer.tscn20
-rw-r--r--Assets/Map/droppable_platform_01.gd20
-rw-r--r--Assets/Map/potion.png~bin0 -> 224 bytes
-rw-r--r--Assets/Map/tileset.pngbin40520 -> 40587 bytes
-rw-r--r--Assets/Map/tileset.png~bin40529 -> 40588 bytes
-rw-r--r--Assets/Music/Boss.wav.import2
-rw-r--r--Door.gd11
-rw-r--r--Door.tscn11
-rw-r--r--Enemies/FlyingEnemy.tscn48
-rw-r--r--Enemies/WalkingEnemy.tscn (renamed from Enemies/Enemy.tscn)9
-rw-r--r--Enemies/enemy.gd16
-rw-r--r--Enemies/flying_enemy.gd30
-rw-r--r--Enemies/walking_enemy.gd40
-rw-r--r--Game.gd5
-rw-r--r--GreenGreens.tscn58
-rw-r--r--GreenGreensBoss.tscn15
-rw-r--r--GreenGreensIndoor.tscn76
-rw-r--r--Objects/potion.gd3
-rw-r--r--Objects/potion.pngbin0 -> 169 bytes
-rw-r--r--Objects/potion.png.import34
-rw-r--r--Objects/potion.png~bin0 -> 203 bytes
-rw-r--r--Objects/potion.tscn21
-rw-r--r--Player.tscn324
-rw-r--r--SoundManager.tscn1
-rw-r--r--air_shot.gd34
-rw-r--r--air_shot.tscn28
-rw-r--r--droppable_platform_02.tscn16
-rw-r--r--green_greens.gd17
-rw-r--r--green_greens_indoor.gd31
-rw-r--r--hud.gd1
-rw-r--r--player.gd196
-rw-r--r--project.godot8
-rw-r--r--whispy_woods.gd55
-rw-r--r--whispy_woods_sprite_frames.tres24
51 files changed, 1267 insertions, 212 deletions
diff --git a/Assets/Enemies/apple.png b/Assets/Enemies/apple.png
new file mode 100644
index 0000000..9cbe2c3
--- /dev/null
+++ b/Assets/Enemies/apple.png
Binary files differ
diff --git a/Assets/Enemies/apple.png.import b/Assets/Enemies/apple.png.import
new file mode 100644
index 0000000..50e2986
--- /dev/null
+++ b/Assets/Enemies/apple.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://curth07eq7amc"
+path="res://.godot/imported/apple.png-0fcf85f38763831f08a5426a222e3579.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/apple.png"
+dest_files=["res://.godot/imported/apple.png-0fcf85f38763831f08a5426a222e3579.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/Assets/Enemies/effects.png b/Assets/Enemies/effects.png
new file mode 100644
index 0000000..4c5e969
--- /dev/null
+++ b/Assets/Enemies/effects.png
Binary files differ
diff --git a/Assets/Enemies/effects.png.import b/Assets/Enemies/effects.png.import
new file mode 100644
index 0000000..9aec585
--- /dev/null
+++ b/Assets/Enemies/effects.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://sl3a0bgyr45b"
+path="res://.godot/imported/effects.png-a832aced9a839c0b39bafd17f44c13b2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/effects.png"
+dest_files=["res://.godot/imported/effects.png-a832aced9a839c0b39bafd17f44c13b2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/Assets/Enemies/enemy-flying-01.png b/Assets/Enemies/enemy-flying-01.png
new file mode 100644
index 0000000..9608725
--- /dev/null
+++ b/Assets/Enemies/enemy-flying-01.png
Binary files differ
diff --git a/Assets/Enemies/enemy-flying-01.png.import b/Assets/Enemies/enemy-flying-01.png.import
new file mode 100644
index 0000000..4fc9674
--- /dev/null
+++ b/Assets/Enemies/enemy-flying-01.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c62o6lkel0hm"
+path="res://.godot/imported/enemy-flying-01.png-d82a971226fd3618dfed0cdda7cb0af7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/enemy-flying-01.png"
+dest_files=["res://.godot/imported/enemy-flying-01.png-d82a971226fd3618dfed0cdda7cb0af7.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/Assets/Enemies/enemy-flying-02.png b/Assets/Enemies/enemy-flying-02.png
new file mode 100644
index 0000000..3941ced
--- /dev/null
+++ b/Assets/Enemies/enemy-flying-02.png
Binary files differ
diff --git a/Assets/Enemies/enemy-flying-02.png.import b/Assets/Enemies/enemy-flying-02.png.import
new file mode 100644
index 0000000..30d1e61
--- /dev/null
+++ b/Assets/Enemies/enemy-flying-02.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cmh7xpn5isthn"
+path="res://.godot/imported/enemy-flying-02.png-19dcf2eed84e89f90fed689af91a25ee.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/enemy-flying-02.png"
+dest_files=["res://.godot/imported/enemy-flying-02.png-19dcf2eed84e89f90fed689af91a25ee.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/Assets/Enemies/enemy-jumping-01.png b/Assets/Enemies/enemy-jumping-01.png
new file mode 100644
index 0000000..97074c0
--- /dev/null
+++ b/Assets/Enemies/enemy-jumping-01.png
Binary files differ
diff --git a/Assets/Enemies/enemy-jumping-01.png.import b/Assets/Enemies/enemy-jumping-01.png.import
new file mode 100644
index 0000000..1b2f620
--- /dev/null
+++ b/Assets/Enemies/enemy-jumping-01.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cnigv158w1233"
+path="res://.godot/imported/enemy-jumping-01.png-4d65c6c623f2658eaf231de710b5e1f2.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/enemy-jumping-01.png"
+dest_files=["res://.godot/imported/enemy-jumping-01.png-4d65c6c623f2658eaf231de710b5e1f2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/Assets/Enemies/enemy-jumping-02.png b/Assets/Enemies/enemy-jumping-02.png
new file mode 100644
index 0000000..4c453bf
--- /dev/null
+++ b/Assets/Enemies/enemy-jumping-02.png
Binary files differ
diff --git a/Assets/Enemies/enemy-jumping-02.png.import b/Assets/Enemies/enemy-jumping-02.png.import
new file mode 100644
index 0000000..226e4e4
--- /dev/null
+++ b/Assets/Enemies/enemy-jumping-02.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cagu5o5je7tdq"
+path="res://.godot/imported/enemy-jumping-02.png-0c67ebb072dda234971f579c2e45458b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/enemy-jumping-02.png"
+dest_files=["res://.godot/imported/enemy-jumping-02.png-0c67ebb072dda234971f579c2e45458b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/Assets/Enemies/enemy-jumping-03.png b/Assets/Enemies/enemy-jumping-03.png
new file mode 100644
index 0000000..9b8f310
--- /dev/null
+++ b/Assets/Enemies/enemy-jumping-03.png
Binary files differ
diff --git a/Assets/Enemies/enemy-jumping-03.png.import b/Assets/Enemies/enemy-jumping-03.png.import
new file mode 100644
index 0000000..1393ceb
--- /dev/null
+++ b/Assets/Enemies/enemy-jumping-03.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://rct3xvwbffoo"
+path="res://.godot/imported/enemy-jumping-03.png-552d3078e99903151c9744bf92b0db6c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/enemy-jumping-03.png"
+dest_files=["res://.godot/imported/enemy-jumping-03.png-552d3078e99903151c9744bf92b0db6c.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/Assets/Map/DroppablePlatform01.tscn b/Assets/Map/DroppablePlatform01.tscn
new file mode 100644
index 0000000..345fd4b
--- /dev/null
+++ b/Assets/Map/DroppablePlatform01.tscn
@@ -0,0 +1,23 @@
+[gd_scene load_steps=4 format=3 uid="uid://cltusavcxucip"]
+
+[ext_resource type="Script" path="res://Assets/Map/droppable_platform_01.gd" id="1_npqdr"]
+[ext_resource type="Texture2D" uid="uid://mcgvpb1lh3ve" path="res://Assets/Map/tileset.png" id="2_s554b"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_fmc1n"]
+size = Vector2(48, 1)
+
+[node name="DroppablePlatform01" type="StaticBody2D" groups=["droppable_platforms"]]
+collision_layer = 4112
+collision_mask = 0
+script = ExtResource("1_npqdr")
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture_filter = 1
+texture = ExtResource("2_s554b")
+region_enabled = true
+region_rect = Rect2(91, 19, 16, 16)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+position = Vector2(0, -7.5)
+shape = SubResource("RectangleShape2D_fmc1n")
+one_way_collision = true
diff --git a/Assets/Map/DroppablePlatform02.tscn b/Assets/Map/DroppablePlatform02.tscn
new file mode 100644
index 0000000..1050b8c
--- /dev/null
+++ b/Assets/Map/DroppablePlatform02.tscn
@@ -0,0 +1,29 @@
+[gd_scene load_steps=3 format=3 uid="uid://dhkkcjjqk7xmc"]
+
+[ext_resource type="Texture2D" uid="uid://mcgvpb1lh3ve" path="res://Assets/Map/tileset.png" id="1_ipgq4"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_fmc1n"]
+size = Vector2(32, 1)
+
+[node name="DroppablePlatform01" type="StaticBody2D" groups=["droppable_platforms"]]
+collision_layer = 16
+collision_mask = 0
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture_filter = 1
+position = Vector2(-8, 0)
+texture = ExtResource("1_ipgq4")
+region_enabled = true
+region_rect = Rect2(91, 19, 16, 16)
+
+[node name="Sprite2D2" type="Sprite2D" parent="."]
+texture_filter = 1
+position = Vector2(8, 0)
+texture = ExtResource("1_ipgq4")
+region_enabled = true
+region_rect = Rect2(91, 19, 16, 16)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+position = Vector2(0, -7.5)
+shape = SubResource("RectangleShape2D_fmc1n")
+one_way_collision = true
diff --git a/Assets/Map/DroppablePlatform03.tscn b/Assets/Map/DroppablePlatform03.tscn
new file mode 100644
index 0000000..03f680b
--- /dev/null
+++ b/Assets/Map/DroppablePlatform03.tscn
@@ -0,0 +1,35 @@
+[gd_scene load_steps=3 format=3 uid="uid://cdtfard8j7uj"]
+
+[ext_resource type="Texture2D" uid="uid://mcgvpb1lh3ve" path="res://Assets/Map/tileset.png" id="1_s4aiw"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_fmc1n"]
+size = Vector2(48, 0.5)
+
+[node name="DroppablePlatform01" type="StaticBody2D" groups=["droppable_platforms"]]
+collision_layer = 16
+collision_mask = 0
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture_filter = 1
+position = Vector2(-16, 0)
+texture = ExtResource("1_s4aiw")
+region_enabled = true
+region_rect = Rect2(91, 19, 16, 16)
+
+[node name="Sprite2D2" type="Sprite2D" parent="."]
+texture_filter = 1
+texture = ExtResource("1_s4aiw")
+region_enabled = true
+region_rect = Rect2(91, 19, 16, 16)
+
+[node name="Sprite2D3" type="Sprite2D" parent="."]
+texture_filter = 1
+position = Vector2(16, 0)
+texture = ExtResource("1_s4aiw")
+region_enabled = true
+region_rect = Rect2(91, 19, 16, 16)
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+position = Vector2(0, -7.75)
+shape = SubResource("RectangleShape2D_fmc1n")
+one_way_collision = true
diff --git a/Assets/Map/TileMapLayer.tscn b/Assets/Map/TileMapLayer.tscn
index f304f16..49b6be9 100644
--- a/Assets/Map/TileMapLayer.tscn
+++ b/Assets/Map/TileMapLayer.tscn
@@ -1,7 +1,10 @@
-[gd_scene load_steps=6 format=3 uid="uid://b1si77qfmut5x"]
+[gd_scene load_steps=10 format=3 uid="uid://b1si77qfmut5x"]
[ext_resource type="Texture2D" uid="uid://mcgvpb1lh3ve" path="res://Assets/Map/tileset.png" id="1_odmhe"]
+[ext_resource type="PackedScene" uid="uid://cltusavcxucip" path="res://Assets/Map/DroppablePlatform01.tscn" id="2_5xc4i"]
[ext_resource type="Script" path="res://Assets/Map/tile_map_layer.gd" id="2_qi2a0"]
+[ext_resource type="PackedScene" uid="uid://dhkkcjjqk7xmc" path="res://Assets/Map/DroppablePlatform02.tscn" id="3_2l35j"]
+[ext_resource type="PackedScene" uid="uid://cdtfard8j7uj" path="res://Assets/Map/DroppablePlatform03.tscn" id="4_3obh5"]
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_3qgmv"]
friction = 0.0
@@ -42,6 +45,9 @@ separation = Vector2i(2, 2)
3:1/0 = 0
4:1/0 = 0
5:1/0 = 0
+5:1/0/y_sort_origin = -8
+5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, -3, 8, -3, 8, -8)
+5:1/0/physics_layer_0/polygon_0/one_way = true
6:1/0 = 0
7:1/0 = 0
8:1/0 = 0
@@ -90,6 +96,7 @@ separation = Vector2i(2, 2)
28:2/0 = 0
29:2/0 = 0
0:3/0 = 0
+0:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
1:3/0 = 0
2:3/0 = 0
3:3/0 = 0
@@ -106,10 +113,14 @@ separation = Vector2i(2, 2)
14:3/0 = 0
15:3/0 = 0
16:3/0 = 0
+16:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
17:3/0 = 0
+17:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
18:3/0 = 0
+18:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
19:3/0 = 0
20:3/0 = 0
+20:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8)
23:3/0 = 0
24:3/0 = 0
25:3/0 = 0
@@ -501,6 +512,12 @@ separation = Vector2i(2, 2)
26:6/animation_frame_1/duration = 0.5
26:6/0 = 0
26:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+29:8/0 = 0
+
+[sub_resource type="TileSetScenesCollectionSource" id="TileSetScenesCollectionSource_pe6ej"]
+scenes/1/scene = ExtResource("2_5xc4i")
+scenes/4/scene = ExtResource("3_2l35j")
+scenes/5/scene = ExtResource("4_3obh5")
[sub_resource type="TileSet" id="TileSet_8jo18"]
physics_layer_0/collision_layer = 16
@@ -509,6 +526,7 @@ physics_layer_1/collision_layer = 128
physics_layer_1/collision_mask = 0
physics_layer_1/physics_material = SubResource("PhysicsMaterial_3qgmv")
sources/0 = SubResource("TileSetAtlasSource_iu5yc")
+sources/1 = SubResource("TileSetScenesCollectionSource_pe6ej")
[node name="TileMapLayer" type="TileMapLayer"]
texture_filter = 1
diff --git a/Assets/Map/droppable_platform_01.gd b/Assets/Map/droppable_platform_01.gd
new file mode 100644
index 0000000..7f8b276
--- /dev/null
+++ b/Assets/Map/droppable_platform_01.gd
@@ -0,0 +1,20 @@
+@tool
+extends StaticBody2D
+
+
+@export var width = 1
+
+
+func _ready() -> void:
+ var sprite_width = $Sprite2D.region_rect.size.x
+
+ if width > 1:
+ for n in range(width - 1):
+ var next_sprite = $Sprite2D.duplicate()
+ if Engine.is_editor_hint():
+ next_sprite.owner = get_tree().edited_scene_root
+ next_sprite.position.x = sprite_width * (n + 1)
+ add_child(next_sprite)
+
+ $CollisionShape2D.shape.size.x = sprite_width * width
+ $CollisionShape2D.position.x = ((sprite_width * width) / 2) - (sprite_width / 2)
diff --git a/Assets/Map/potion.png~ b/Assets/Map/potion.png~
new file mode 100644
index 0000000..acf9eaa
--- /dev/null
+++ b/Assets/Map/potion.png~
Binary files differ
diff --git a/Assets/Map/tileset.png b/Assets/Map/tileset.png
index ee740c1..e9cc47a 100644
--- a/Assets/Map/tileset.png
+++ b/Assets/Map/tileset.png
Binary files differ
diff --git a/Assets/Map/tileset.png~ b/Assets/Map/tileset.png~
index abbf411..a764e16 100644
--- a/Assets/Map/tileset.png~
+++ b/Assets/Map/tileset.png~
Binary files differ
diff --git a/Assets/Music/Boss.wav.import b/Assets/Music/Boss.wav.import
index 1d12ab6..1e133d5 100644
--- a/Assets/Music/Boss.wav.import
+++ b/Assets/Music/Boss.wav.import
@@ -18,7 +18,7 @@ force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
-edit/loop_mode=0
+edit/loop_mode=2
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0
diff --git a/Door.gd b/Door.gd
index cf95dc9..1742e09 100644
--- a/Door.gd
+++ b/Door.gd
@@ -11,6 +11,17 @@ extends Node2D
16 - 7 # door offset to player center from bottom
)
+@export_enum("Black", "White") var color = 0
+
+
+func _ready():
+ if color == 0:
+ $Black.visible = true
+ $White.visible = false
+ elif color == 1:
+ $Black.visible = false
+ $White.visible = true
+
#func _process(delta: float) -> void:
#var bodies = $Area2D.get_overlapping_bodies()
diff --git a/Door.tscn b/Door.tscn
index 095a34e..759b103 100644
--- a/Door.tscn
+++ b/Door.tscn
@@ -9,7 +9,7 @@ size = Vector2(2, 8)
[node name="Door" type="Node2D"]
script = ExtResource("1_mfnfa")
-[node name="Sprite2D" type="Sprite2D" parent="."]
+[node name="Black" type="Sprite2D" parent="."]
texture_filter = 1
position = Vector2(8, 0)
scale = Vector2(1, 0.970588)
@@ -17,6 +17,15 @@ texture = ExtResource("2_8514t")
region_enabled = true
region_rect = Rect2(343, 181, 16, 34)
+[node name="White" type="Sprite2D" parent="."]
+visible = false
+texture_filter = 1
+position = Vector2(8, 0)
+scale = Vector2(1, 0.970588)
+texture = ExtResource("2_8514t")
+region_enabled = true
+region_rect = Rect2(343, 145, 16, 34)
+
[node name="Sprite2D2" type="Sprite2D" parent="."]
texture_filter = 1
position = Vector2(8, -16)
diff --git a/Enemies/FlyingEnemy.tscn b/Enemies/FlyingEnemy.tscn
new file mode 100644
index 0000000..0389300
--- /dev/null
+++ b/Enemies/FlyingEnemy.tscn
@@ -0,0 +1,48 @@
+[gd_scene load_steps=6 format=3 uid="uid://bsqgvrwpn3ll5"]
+
+[ext_resource type="Script" path="res://Enemies/flying_enemy.gd" id="1_6lct6"]
+[ext_resource type="Texture2D" uid="uid://c62o6lkel0hm" path="res://Assets/Enemies/enemy-flying-01.png" id="2_xlcih"]
+[ext_resource type="Texture2D" uid="uid://cmh7xpn5isthn" path="res://Assets/Enemies/enemy-flying-02.png" id="3_nmmbb"]
+
+[sub_resource type="CircleShape2D" id="CircleShape2D_p646n"]
+radius = 8.0
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_n2gm8"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("2_xlcih")
+}, {
+"duration": 1.0,
+"texture": ExtResource("3_nmmbb")
+}],
+"loop": true,
+"name": &"default",
+"speed": 4.0
+}]
+
+[node name="FlyingEnemy" type="CharacterBody2D" groups=["enemy"]]
+collision_layer = 2
+collision_mask = 17
+script = ExtResource("1_6lct6")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+shape = SubResource("CircleShape2D_p646n")
+
+[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
+texture_filter = 1
+sprite_frames = SubResource("SpriteFrames_n2gm8")
+
+[node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="."]
+process_mode = 3
+
+[node name="RayLeft" type="RayCast2D" parent="."]
+target_position = Vector2(-9, 0)
+collision_mask = 16
+
+[node name="RayRight" type="RayCast2D" parent="."]
+target_position = Vector2(9, 0)
+collision_mask = 16
+
+[connection signal="screen_entered" from="VisibleOnScreenNotifier2D" to="." method="_on_visible_on_screen_notifier_2d_screen_entered"]
+[connection signal="screen_exited" from="VisibleOnScreenNotifier2D" to="." method="_on_visible_on_screen_notifier_2d_screen_exited"]
diff --git a/Enemies/Enemy.tscn b/Enemies/WalkingEnemy.tscn
index 2791e05..28ce169 100644
--- a/Enemies/Enemy.tscn
+++ b/Enemies/WalkingEnemy.tscn
@@ -1,7 +1,7 @@
[gd_scene load_steps=6 format=3 uid="uid://6d20yrqejxs8"]
+[ext_resource type="Script" path="res://Enemies/walking_enemy.gd" id="1_kngny"]
[ext_resource type="Texture2D" uid="uid://cduruhn8mecgn" path="res://Assets/Enemies/enemy-walk-01.png" id="1_v3aim"]
-[ext_resource type="Script" path="res://Enemies/enemy.gd" id="1_x68ej"]
[ext_resource type="Texture2D" uid="uid://ysaejkoo1bnw" path="res://Assets/Enemies/enemy-walk-02.png" id="2_madb5"]
[sub_resource type="CircleShape2D" id="CircleShape2D_p646n"]
@@ -21,10 +21,10 @@ animations = [{
"speed": 4.0
}]
-[node name="Enemy" type="CharacterBody2D" groups=["enemy"]]
+[node name="WalkingEnemy" type="CharacterBody2D" groups=["enemy"]]
collision_layer = 2
collision_mask = 17
-script = ExtResource("1_x68ej")
+script = ExtResource("1_kngny")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("CircleShape2D_p646n")
@@ -44,5 +44,8 @@ collision_mask = 16
target_position = Vector2(9, 0)
collision_mask = 16
+[node name="BackForthTimer" type="Timer" parent="."]
+
[connection signal="screen_entered" from="VisibleOnScreenNotifier2D" to="." method="_on_visible_on_screen_notifier_2d_screen_entered"]
[connection signal="screen_exited" from="VisibleOnScreenNotifier2D" to="." method="_on_visible_on_screen_notifier_2d_screen_exited"]
+[connection signal="timeout" from="BackForthTimer" to="." method="_on_back_forth_timer_timeout"]
diff --git a/Enemies/enemy.gd b/Enemies/enemy.gd
index 428f6ca..eed482d 100644
--- a/Enemies/enemy.gd
+++ b/Enemies/enemy.gd
@@ -2,15 +2,22 @@ class_name Enemy
extends CharacterBody2D
-const SPEED = 30
+@export var speed: float = 30.0
var direction = -1 :
set(value):
direction = value
$AnimatedSprite2D.flip_h = direction > 0
+@onready var disable_timer = Timer.new()
+
func _ready() -> void:
+ disable_timer.wait_time = 3.0
+ disable_timer.one_shot = true
+ disable_timer.timeout.connect(_on_disable_timer_timeout)
+ add_child(disable_timer)
+
process_mode = PROCESS_MODE_DISABLED
@@ -20,7 +27,7 @@ func _physics_process(delta: float) -> void:
if not is_on_floor():
velocity += get_gravity() * delta
- velocity.x = direction * SPEED
+ velocity.x = direction * speed
move_and_slide()
if get_last_slide_collision():
@@ -66,8 +73,11 @@ func on_hit(projectile_position: Vector2):
func _on_visible_on_screen_notifier_2d_screen_entered() -> void:
+ disable_timer.stop()
process_mode = PROCESS_MODE_INHERIT
func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
- return
+ disable_timer.start()
+
+func _on_disable_timer_timeout():
process_mode = PROCESS_MODE_DISABLED
diff --git a/Enemies/flying_enemy.gd b/Enemies/flying_enemy.gd
new file mode 100644
index 0000000..701affc
--- /dev/null
+++ b/Enemies/flying_enemy.gd
@@ -0,0 +1,30 @@
+extends Enemy
+
+
+@export var angular_speed = 3.0
+var alpha = 0
+
+enum MovementType {
+ UP_DOWN,
+ FORWARD,
+}
+@export var movement_type: MovementType = MovementType.UP_DOWN
+
+
+func _physics_process(delta: float) -> void:
+ $AnimatedSprite2D.play()
+
+ if movement_type == MovementType.UP_DOWN:
+ velocity.y = sin(alpha) * 32
+ elif movement_type == MovementType.FORWARD:
+ velocity.x = direction * speed
+ velocity.y = sin(alpha) * 16
+
+ alpha += delta * angular_speed
+
+ move_and_slide()
+ if get_last_slide_collision():
+ if $RayLeft.is_colliding():
+ direction = 1
+ elif $RayRight.is_colliding():
+ direction = -1
diff --git a/Enemies/walking_enemy.gd b/Enemies/walking_enemy.gd
new file mode 100644
index 0000000..be36e2d
--- /dev/null
+++ b/Enemies/walking_enemy.gd
@@ -0,0 +1,40 @@
+extends Enemy
+
+
+@export var acceleration: float = 10.0
+
+enum MovementType {
+ BACK_FORTH,
+ FORWARD,
+}
+@export var movement_type: MovementType = MovementType.BACK_FORTH
+
+@export var back_forth_time: float = 1.0
+
+
+func _ready() -> void:
+ super._ready()
+
+ if movement_type == MovementType.BACK_FORTH:
+ $BackForthTimer.wait_time = back_forth_time
+ $BackForthTimer.start()
+
+
+func _physics_process(delta: float) -> void:
+ $AnimatedSprite2D.play()
+
+ if not is_on_floor():
+ velocity += get_gravity() * delta
+
+ velocity.x = move_toward(velocity.x, direction * speed, acceleration)
+
+ move_and_slide()
+ if get_last_slide_collision():
+ if $RayLeft.is_colliding():
+ direction = 1
+ elif $RayRight.is_colliding():
+ direction = -1
+
+
+func _on_back_forth_timer_timeout() -> void:
+ direction = -direction
diff --git a/Game.gd b/Game.gd
index 37391b2..bb99ada 100644
--- a/Game.gd
+++ b/Game.gd
@@ -15,6 +15,11 @@ var score = 0 :
score = value
score_changed.emit()
+var player_state := {
+ "hp": null,
+ "life": 4,
+}
+
func _ready():
var canvas_layer = CanvasLayer.new()
diff --git a/GreenGreens.tscn b/GreenGreens.tscn
index a4bb2d5..0be126b 100644
--- a/GreenGreens.tscn
+++ b/GreenGreens.tscn
@@ -1,14 +1,16 @@
-[gd_scene load_steps=15 format=4 uid="uid://b7lbvuc5roqaq"]
+[gd_scene load_steps=17 format=4 uid="uid://b7lbvuc5roqaq"]
[ext_resource type="Script" path="res://green_greens.gd" id="1_8lfgl"]
[ext_resource type="PackedScene" uid="uid://bb8nnbftq04df" path="res://HUD.tscn" id="2_xugoh"]
[ext_resource type="Texture2D" uid="uid://dq3ybrhi8w24p" path="res://Assets/Map/green_greens/Clouds-transparent.png" id="2_ysjyp"]
[ext_resource type="Texture2D" uid="uid://bu4keik2lmexj" path="res://Assets/Map/green_greens/background-transparent.png" id="3_cwh0s"]
+[ext_resource type="PackedScene" uid="uid://cjrb8n36og5f3" path="res://KnockoutPlane.tscn" id="9_4vibw"]
[ext_resource type="Texture2D" uid="uid://blq6u731g8p1d" path="res://Assets/Map/green_greens/inner-01.png" id="10_tx0pl"]
[ext_resource type="PackedScene" uid="uid://7ndl8hvg4e38" path="res://Door.tscn" id="11_jpc1n"]
+[ext_resource type="PackedScene" uid="uid://bsqgvrwpn3ll5" path="res://Enemies/FlyingEnemy.tscn" id="11_tqgog"]
[ext_resource type="PackedScene" uid="uid://fe6exyigjb72" path="res://Player.tscn" id="12_n6enf"]
[ext_resource type="Script" path="res://Assets/Map/tile_map_layer.gd" id="13_5fv8j"]
-[ext_resource type="PackedScene" uid="uid://6d20yrqejxs8" path="res://Enemies/Enemy.tscn" id="13_bft13"]
+[ext_resource type="PackedScene" uid="uid://6d20yrqejxs8" path="res://Enemies/WalkingEnemy.tscn" id="13_bft13"]
[ext_resource type="PackedScene" uid="uid://b1si77qfmut5x" path="res://Assets/Map/TileMapLayer.tscn" id="13_cw8ip"]
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_hnnog"]
@@ -49,59 +51,79 @@ position = Vector2(175, 74)
texture = ExtResource("3_cwh0s")
[node name="TileMapLayer" parent="." instance=ExtResource("13_cw8ip")]
-tile_map_data = PackedByteArray("AAAAAAgAAAARAAAAAAABAAgAAAARAAAAAAACAAgAAAARAAAAAAADAAgAAAARAAAAAAAEAAgAAAARAAAAAAAFAAgAAAARAAAAAAAGAAgAAAARAAAAAAAHAAgAAAARAAAAAAAIAAgAAAARAAAAAAAJAAgAAAARAAAAAAAKAAgAAAARAAEAAAALAAgAAAARAAEAAAAMAAgAAAARAAAAAAANAAgAAAARAAAAAAAOAAgAAAARAAAAAAAPAAgAAAARAAAAAAAQAAgAAAARAAAAAAARAAgAAAARAAAAAAASAAgAAAARAAAAAAATAAgAAAARAAAAAAAUAAgAAAARAAAAAAAVAAgAAAARAAAAAAAWAAgAAAARAAAAAAAXAAgAAAARAAAAAAAYAAgAAAARAAAAAAAaAAcAAAARAAAAAAAbAAcAAAARAAAAAAAcAAcAAAARAAAAAAAdAAcAAAARAAAAAAAeAAcAAAARAAAAAAAfAAcAAAARAAAAAAAgAAcAAAARAAAAAAAhAAcAAAARAAAAAAAjAAgAAAARAAAAAAAkAAgAAAARAAAAAAAlAAgAAAARAAAAAAAmAAgAAAARAAAAAAAnAAgAAAARAAAAAAAoAAgAAAARAAAAAAApAAgAAAARAAAAAAAqAAgAAAARAAAAAAArAAgAAAARAAAAAAAsAAgAAAARAAAAAAAtAAgAAAARAAAAAAAuAAgAAAARAAAAAAAvAAgAAAARAAAAAAAwAAgAAAARAAAAAAAxAAgAAAARAAAAAAAyAAgAAAARAAAAAAAzAAgAAAARAAAAAAA2AAgAAAARAAAAAAA3AAgAAAARAAAAAAA4AAgAAAASAAAAAAA1AAQAAAASAAAAAAAiAAcAAAASAAAAAAAAAAkAAAARAAEAAAABAAkAAAARAAEAAAACAAkAAAARAAEAAAADAAkAAAARAAEAAAAEAAkAAAARAAEAAAAFAAkAAAARAAEAAAAGAAkAAAARAAEAAAAHAAkAAAARAAEAAAAIAAkAAAARAAEAAAAJAAkAAAARAAEAAAAKAAkAAAARAAEAAAALAAkAAAARAAEAAAAMAAkAAAARAAEAAAANAAkAAAARAAEAAAAOAAkAAAARAAEAAAAPAAkAAAARAAEAAAAQAAkAAAARAAEAAAARAAkAAAARAAEAAAASAAkAAAARAAEAAAATAAkAAAARAAEAAAAUAAkAAAARAAEAAAAVAAkAAAARAAEAAAAWAAkAAAARAAEAAAAXAAkAAAARAAEAAAAYAAkAAAARAAEAAAAZAAkAAAARAAEAAAAaAAkAAAARAAEAAAAbAAkAAAARAAEAAAAcAAkAAAARAAEAAAAdAAkAAAARAAEAAAAeAAkAAAARAAEAAAAfAAkAAAARAAEAAAAgAAkAAAARAAEAAAAhAAkAAAARAAEAAAAiAAkAAAARAAEAAAAaAAgAAAARAAEAAAAbAAgAAAARAAEAAAAcAAgAAAARAAEAAAAdAAgAAAARAAEAAAAeAAgAAAARAAEAAAAfAAgAAAARAAEAAAAgAAgAAAARAAEAAAAhAAgAAAARAAEAAAAiAAgAAAARAAEAAAAZAAgAAAARAAEAAAAZAAcAAAAQAAAAAAA0AAQAAAAQAAAAAAA0AAUAAAAQAAEAAAA0AAYAAAAQAAEAAAA0AAcAAAAQAAEAAAA1AAUAAAASAAEAAAA1AAYAAAASAAEAAAA1AAcAAAASAAEAAAA0AAgAAAARAAEAAAA1AAgAAAARAAEAAAAjAAkAAAARAAEAAAAkAAkAAAARAAEAAAAlAAkAAAARAAEAAAAmAAkAAAARAAEAAAAnAAkAAAARAAEAAAAoAAkAAAARAAEAAAApAAkAAAARAAEAAAAqAAkAAAARAAEAAAArAAkAAAARAAEAAAAsAAkAAAARAAEAAAAtAAkAAAARAAEAAAAuAAkAAAARAAEAAAAvAAkAAAARAAEAAAAwAAkAAAARAAEAAAAxAAkAAAARAAEAAAAyAAkAAAARAAEAAAAzAAkAAAARAAEAAAA0AAkAAAARAAEAAAA1AAkAAAARAAEAAAA2AAkAAAARAAEAAAA3AAkAAAARAAEAAAA4AAkAAAASAAEAAAA4AAoAAAASAAEAAAA3AAoAAAARAAEAAAA2AAoAAAARAAEAAAA1AAoAAAARAAEAAAA0AAoAAAARAAEAAAAzAAoAAAARAAEAAAAyAAoAAAARAAEAAAAxAAoAAAARAAEAAAAwAAoAAAARAAEAAAAvAAoAAAARAAEAAAAuAAoAAAARAAEAAAAtAAoAAAARAAEAAAAsAAoAAAARAAEAAAArAAoAAAARAAEAAAAqAAoAAAARAAEAAAApAAoAAAARAAEAAAAoAAoAAAARAAEAAAAnAAoAAAARAAEAAAAmAAoAAAARAAEAAAAlAAoAAAARAAEAAAAkAAoAAAARAAEAAAAjAAoAAAARAAEAAAAiAAoAAAARAAEAAAAhAAoAAAARAAEAAAAgAAoAAAARAAEAAAAfAAoAAAARAAEAAAAeAAoAAAARAAEAAAAdAAoAAAARAAEAAAAcAAoAAAARAAEAAAAbAAoAAAARAAEAAAAaAAoAAAARAAEAAAAZAAoAAAARAAEAAAAYAAoAAAARAAEAAAAXAAoAAAARAAEAAAAWAAoAAAARAAEAAAAVAAoAAAARAAEAAAAUAAoAAAARAAEAAAATAAoAAAARAAEAAAASAAoAAAARAAEAAAARAAoAAAARAAEAAAAQAAoAAAARAAEAAAAPAAoAAAARAAEAAAAOAAoAAAARAAEAAAANAAoAAAARAAEAAAAMAAoAAAARAAEAAAALAAoAAAARAAEAAAAKAAoAAAARAAEAAAAJAAoAAAARAAEAAAAIAAoAAAARAAEAAAAHAAoAAAARAAEAAAAGAAoAAAARAAEAAAAFAAoAAAARAAEAAAAEAAoAAAARAAEAAAADAAoAAAARAAEAAAACAAoAAAARAAEAAAABAAoAAAARAAEAAAAAAAoAAAARAAEAAAB7AAMAAAAQAAAAAAB8AAMAAAASAAAAAAB7AAQAAAAQAAEAAAB7AAUAAAAQAAEAAAB7AAYAAAAQAAEAAAB7AAcAAAAQAAEAAAB7AAgAAAAQAAEAAAB7AAkAAAAQAAEAAAB7AAoAAAAQAAEAAAB7AAsAAAAQAAEAAAB7AAwAAAASAAAAADB8AAwAAAARAAAAADB9AAwAAAARAAAAADB+AAwAAAARAAAAADB/AAwAAAARAAAAADCAAAwAAAARAAAAADCBAAwAAAARAAAAADCCAAwAAAARAAAAADCDAAwAAAARAAAAADCEAAwAAAARAAAAADCFAAwAAAARAAAAADCGAAwAAAARAAAAADCHAAwAAAARAAAAADCIAAwAAAARAAAAADCJAAwAAAARAAAAADCKAAwAAAARAAAAADCLAAwAAAARAAAAADCMAAwAAAARAAAAADCNAAwAAAARAAAAADCOAAwAAAARAAAAADCPAAwAAAARAAAAADCQAAwAAAARAAAAADCRAAwAAAARAAAAADCSAAwAAAARAAAAADCTAAwAAAARAAAAADCUAAwAAAAQAAAAADCUAAsAAAASAAEAAACUAAoAAAASAAEAAACSAAsAAAARAAAAAACRAAsAAAARAAAAAACQAAsAAAARAAAAAACPAAsAAAARAAAAAACOAAsAAAARAAAAAACNAAsAAAARAAAAAACMAAsAAAARAAAAAACLAAsAAAARAAAAAACKAAsAAAARAAAAAACJAAsAAAARAAAAAACIAAsAAAARAAAAAACHAAsAAAARAAAAAACGAAsAAAARAAAAAACFAAsAAAARAAAAAACEAAsAAAARAAAAAACDAAsAAAARAAAAAACCAAsAAAARAAAAAACBAAsAAAARAAAAAACAAAsAAAARAAAAAAB/AAoAAAASAAAAAAB+AAkAAAASAAAAAAB9AAgAAAASAAAAAAB8AAQAAAASAAEAAAB8AAUAAAASAAEAAAB8AAYAAAASAAEAAAB8AAcAAAASAAEAAAB8AAgAAAARAAEAAAB8AAkAAAARAAEAAAB8AAoAAAARAAEAAAB8AAsAAAARAAEAAAB9AAsAAAARAAEAAAB+AAsAAAARAAEAAAB/AAsAAAARAAEAAAB+AAoAAAARAAEAAAB9AAoAAAARAAEAAAB9AAkAAAARAAEAAACBAAgAAAAQAAAAAACCAAgAAAARAAAAAACDAAgAAAARAAAAAACEAAgAAAARAAAAAACFAAgAAAARAAAAAACGAAgAAAARAAAAAACHAAgAAAARAAAAAACIAAgAAAARAAAAAACJAAgAAAARAAAAAACKAAgAAAARAAAAAACLAAgAAAARAAAAAACMAAgAAAARAAAAAACNAAgAAAARAAAAAACOAAgAAAARAAAAAACPAAcAAAAQAAAAAACQAAYAAAAQAAAAAACRAAUAAAAQAAAAAACSAAQAAAAQAAAAAACTAAMAAAAQAAAAAACUAAIAAAAQAAAAAACVAAEAAAAQAAAAAACWAAAAAAAQAAAAAACXAP//AAAQAAAAAACYAP7/AAAQAAAAAACZAP3/AAAQAAAAAACaAPz/AAAQAAAAAACbAPv/AAAQAAAAAACcAPv/AAASAAAAAACcAPz/AAASAAEAAACcAP3/AAASAAEAAACcAP7/AAASAAEAAACcAP//AAASAAEAAACcAAAAAAASAAEAAACcAAEAAAASAAEAAACcAAIAAAASAAEAAACcAAMAAAASAAEAAACcAAQAAAASAAEAAACcAAUAAAAQAAAAADCbAAUAAAARAAAAADCaAAUAAAARAAAAADCZAAUAAAARAAAAADCYAAUAAAARAAAAADCXAAUAAAARAAAAADCWAAUAAAARAAAAADCVAAUAAAARAAAAADCUAAUAAAARAAAAADCSAAYAAAARAAAAADCQAAkAAAARAAAAADCPAAkAAAARAAAAADCOAAkAAAARAAAAADCNAAkAAAARAAAAADCMAAkAAAARAAAAADCLAAkAAAARAAAAADCKAAkAAAARAAAAADCJAAkAAAARAAAAADCIAAkAAAARAAAAADCHAAkAAAARAAAAADCGAAkAAAARAAAAADCFAAkAAAARAAAAADCEAAkAAAARAAAAADCDAAkAAAARAAAAADCCAAkAAAARAAAAADCBAAkAAAASAAAAADCGAP7/AAASAAAAADCRAAkAAAAQAAAAADCTAAYAAAAQAAAAADCVAP7/AAAQAAAAADCqAAkAAAAQAAAAADCVAAkAAAARAAAAADCWAAkAAAARAAAAADCXAAkAAAARAAAAADCYAAkAAAARAAAAADCZAAkAAAARAAAAADCaAAkAAAARAAAAADCbAAkAAAARAAAAADCcAAkAAAARAAAAADCdAAkAAAARAAAAADCeAAkAAAARAAAAADCfAAkAAAARAAAAADCgAAkAAAARAAAAADChAAkAAAARAAAAADCiAAkAAAARAAAAADCjAAkAAAARAAAAADCkAAkAAAARAAAAADClAAkAAAARAAAAADCmAAkAAAARAAAAADCnAAkAAAARAAAAADCoAAkAAAARAAAAADCpAAkAAAARAAAAADCHAP7/AAARAAAAADCIAP7/AAARAAAAADCJAP7/AAARAAAAADCKAP7/AAARAAAAADCLAP7/AAARAAAAADCMAP7/AAARAAAAADCNAP7/AAARAAAAADCOAP7/AAARAAAAADCPAP7/AAARAAAAADCQAP7/AAARAAAAADCRAP7/AAARAAAAADCSAP7/AAARAAAAADCTAP7/AAARAAAAADCUAP7/AAARAAAAADCRAPv/AAARAAAAAACQAPv/AAARAAAAAACPAPv/AAARAAAAAACOAPv/AAARAAAAAACNAPv/AAARAAAAAACMAPv/AAARAAAAAACLAPv/AAARAAAAAACKAPv/AAARAAAAAACJAPv/AAARAAAAAACIAPv/AAARAAAAAACHAPv/AAARAAAAAACoAAgAAAARAAAAAACnAAgAAAARAAAAAACmAAgAAAARAAAAAAClAAgAAAARAAAAAACkAAgAAAARAAAAAACjAAgAAAARAAAAAACiAAgAAAARAAAAAAChAAgAAAARAAAAAACgAAgAAAARAAAAAACfAAgAAAARAAAAAACeAAgAAAARAAAAAACcAAcAAAARAAAAAACbAAcAAAARAAAAAACaAAcAAAARAAAAAACZAAcAAAARAAAAAACYAAcAAAARAAAAAACXAAcAAAARAAAAAACWAAcAAAARAAAAAACUAAgAAAARAAAAAACTAAgAAAAQAAAAAACVAAcAAAAQAAAAAACpAAIAAAAQAAAAAACGAPv/AAAQAAAAAACSAPv/AAASAAAAAACTAPz/AAASAAAAAACVAP3/AAASAAAAAACUAP3/AAARAAAAAACqAAIAAAASAAAAAACdAAcAAAASAAAAAACdAAgAAAARAAEAAACcAAgAAAARAAEAAACbAAgAAAARAAEAAACaAAgAAAARAAEAAACZAAgAAAARAAEAAACYAAgAAAARAAEAAACXAAgAAAARAAEAAACWAAgAAAARAAEAAACVAAgAAAARAAEAAACUAAkAAAARAAEAAACTAAkAAAAQAAEAAACTAAoAAAAQAAEAAACTAAsAAAARAAEAAACPAAgAAAARAAEAAACQAAgAAAARAAEAAACQAAcAAAARAAEAAACRAAYAAAARAAEAAACSAAUAAAARAAEAAACTAAUAAAARAAEAAACTAAQAAAARAAEAAACbAPz/AAARAAEAAACbAP3/AAARAAEAAACbAP7/AAARAAEAAACbAP//AAARAAEAAACbAAAAAAARAAEAAACbAAEAAAARAAEAAACbAAIAAAARAAEAAACbAAMAAAARAAEAAACbAAQAAAARAAEAAACaAAQAAAARAAEAAACZAAQAAAARAAEAAACYAAQAAAARAAEAAACXAAQAAAARAAEAAACWAAQAAAARAAEAAACVAAQAAAARAAEAAACUAAQAAAARAAEAAACUAAMAAAARAAEAAACVAAMAAAARAAEAAACWAAMAAAARAAEAAACXAAMAAAARAAEAAACYAAMAAAARAAEAAACZAAMAAAARAAEAAACaAAMAAAARAAEAAACaAAIAAAARAAEAAACaAAEAAAARAAEAAACaAAAAAAARAAEAAACaAP//AAARAAEAAACaAP7/AAARAAEAAACaAP3/AAARAAEAAACZAP7/AAARAAEAAACZAP//AAARAAEAAACZAAAAAAARAAEAAACZAAEAAAARAAEAAACZAAIAAAARAAEAAACYAAEAAAARAAEAAACYAAAAAAARAAEAAACYAP//AAARAAEAAACYAAIAAAARAAEAAACXAAIAAAARAAEAAACXAAEAAAARAAEAAACXAAAAAAARAAEAAACWAAIAAAARAAEAAACWAAEAAAARAAEAAACVAAIAAAARAAEAAACTAP3/AAARAAEAAACSAP3/AAARAAEAAACRAP3/AAARAAEAAACQAP3/AAARAAEAAACPAP3/AAARAAEAAACOAP3/AAARAAEAAACNAP3/AAARAAEAAACMAP3/AAARAAEAAACLAP3/AAARAAEAAACKAP3/AAARAAEAAACJAP3/AAARAAEAAACIAP3/AAARAAEAAACHAP3/AAARAAEAAACHAPz/AAARAAEAAACIAPz/AAARAAEAAACJAPz/AAARAAEAAACKAPz/AAARAAEAAACLAPz/AAARAAEAAACMAPz/AAARAAEAAACNAPz/AAARAAEAAACOAPz/AAARAAEAAACPAPz/AAARAAEAAACQAPz/AAARAAEAAACRAPz/AAARAAEAAACSAPz/AAARAAEAAACGAPz/AAAQAAEAAACGAP3/AAAQAAEAAACRAAcAAAASAAEAAACRAAgAAAASAAEAAACqAAMAAAASAAEAAACqAAQAAAASAAEAAACqAAUAAAASAAEAAACqAAYAAAASAAEAAACqAAcAAAASAAEAAACqAAgAAAASAAEAAACpAAMAAAAQAAEAAACpAAQAAAAQAAEAAACpAAUAAAAQAAEAAACpAAYAAAAQAAEAAACpAAcAAAAQAAEAAACpAAgAAAARAAEAAAAAAAAAAAAcAA8AAAAKAAcAAAAQAAAAAAALAAcAAAASAAAAAAA=")
+tile_map_data = PackedByteArray("AAAAAAgAAAARAAAAAAABAAgAAAARAAAAAAACAAgAAAARAAAAAAADAAgAAAARAAAAAAAEAAgAAAARAAAAAAAFAAgAAAARAAAAAAAGAAgAAAARAAAAAAAHAAgAAAARAAAAAAAIAAgAAAARAAAAAAAJAAgAAAARAAAAAAAKAAgAAAARAAAAAAALAAgAAAARAAAAAAAMAAgAAAARAAAAAAANAAgAAAARAAAAAAAOAAgAAAARAAAAAAAPAAgAAAARAAAAAAAQAAgAAAARAAAAAAARAAgAAAARAAAAAAASAAgAAAARAAAAAAATAAgAAAARAAAAAAAUAAgAAAARAAEAAAAVAAgAAAARAAEAAAAWAAgAAAARAAEAAAAXAAgAAAARAAEAAAAYAAgAAAARAAEAAAAjAAgAAAARAAAAAAAkAAgAAAARAAAAAAAlAAgAAAARAAAAAAAmAAgAAAARAAAAAAAnAAgAAAARAAAAAAAoAAgAAAARAAAAAAAtAAgAAAARAAAAAAAuAAgAAAARAAAAAAAvAAgAAAARAAAAAAAwAAgAAAARAAAAAAAxAAgAAAARAAAAAAAyAAgAAAARAAAAAAAzAAgAAAARAAAAAAA2AAgAAAARAAAAAAA3AAgAAAARAAAAAAA4AAgAAAARAAAAAAAAAAkAAAARAAEAAAABAAkAAAARAAEAAAACAAkAAAARAAEAAAADAAkAAAARAAEAAAAEAAkAAAARAAEAAAAFAAkAAAARAAEAAAAGAAkAAAARAAEAAAAHAAkAAAARAAEAAAAIAAkAAAARAAEAAAAJAAkAAAARAAEAAAAKAAkAAAARAAEAAAALAAkAAAARAAEAAAAMAAkAAAARAAEAAAANAAkAAAARAAEAAAAOAAkAAAARAAEAAAAPAAkAAAARAAEAAAAQAAkAAAARAAEAAAARAAkAAAARAAEAAAASAAkAAAARAAEAAAATAAkAAAARAAEAAAAUAAkAAAARAAEAAAAVAAkAAAARAAEAAAAWAAkAAAARAAEAAAAXAAkAAAARAAEAAAAYAAkAAAARAAEAAAAZAAkAAAARAAEAAAAaAAkAAAARAAEAAAAbAAkAAAARAAEAAAAcAAkAAAARAAEAAAAdAAkAAAARAAEAAAAeAAkAAAARAAEAAAAfAAkAAAARAAEAAAAgAAkAAAARAAEAAAAhAAkAAAARAAEAAAAiAAkAAAARAAEAAAAaAAgAAAARAAEAAAAbAAgAAAARAAEAAAAcAAgAAAARAAEAAAAdAAgAAAARAAEAAAAeAAgAAAARAAEAAAAfAAgAAAARAAEAAAAgAAgAAAARAAEAAAAhAAgAAAARAAEAAAAiAAgAAAARAAEAAAAZAAgAAAARAAEAAAAjAAkAAAARAAEAAAAkAAkAAAARAAEAAAAlAAkAAAARAAEAAAAmAAkAAAARAAEAAAAnAAkAAAARAAEAAAAoAAkAAAARAAEAAAApAAkAAAARAAEAAAAqAAkAAAARAAEAAAAtAAkAAAARAAEAAAAuAAkAAAARAAEAAAAvAAkAAAARAAEAAAAwAAkAAAARAAEAAAAxAAkAAAARAAEAAAAyAAkAAAARAAEAAAAzAAkAAAARAAEAAAA0AAkAAAARAAEAAAA1AAkAAAARAAEAAAA2AAkAAAARAAEAAAA3AAkAAAARAAEAAAA4AAkAAAARAAEAAAB7AAMAAAAQAAAAAAB8AAMAAAASAAAAAAB7AAQAAAAQAAEAAAB7AAUAAAAQAAEAAAB7AAYAAAAQAAEAAAB7AAcAAAAQAAEAAAB7AAgAAAAQAAEAAAB7AAkAAAAQAAEAAAB7AAoAAAAQAAEAAAB7AAsAAAAQAAEAAAB7AAwAAAASAAAAADB8AAwAAAARAAAAADB9AAwAAAARAAAAADB+AAwAAAARAAAAADB/AAwAAAARAAAAADCAAAwAAAARAAAAADCBAAwAAAARAAAAADCCAAwAAAARAAAAADCDAAwAAAARAAAAADCEAAwAAAARAAAAADCFAAwAAAARAAAAADCGAAwAAAARAAAAADCHAAwAAAARAAAAADCIAAwAAAARAAAAADCJAAwAAAARAAAAADCKAAwAAAARAAAAADCLAAwAAAARAAAAADCMAAwAAAARAAAAADCNAAwAAAARAAAAADCOAAwAAAARAAAAADCPAAwAAAARAAAAADCQAAwAAAARAAAAADCRAAwAAAARAAAAADCSAAwAAAARAAAAADCTAAwAAAARAAAAADCUAAwAAAAQAAAAADCUAAsAAAASAAEAAACUAAoAAAASAAEAAACSAAsAAAARAAAAAACRAAsAAAARAAAAAACQAAsAAAARAAAAAACPAAsAAAARAAAAAACOAAsAAAARAAAAAACNAAsAAAARAAAAAACMAAsAAAARAAAAAACLAAsAAAARAAAAAACKAAsAAAARAAAAAACJAAsAAAARAAAAAACIAAsAAAARAAAAAACHAAsAAAARAAAAAACGAAsAAAARAAAAAACFAAsAAAARAAAAAACEAAsAAAARAAAAAACDAAsAAAARAAAAAACCAAsAAAARAAAAAACBAAsAAAARAAAAAACAAAsAAAARAAAAAAB/AAoAAAASAAAAAAB+AAkAAAASAAAAAAB9AAgAAAASAAAAAAB8AAQAAAASAAEAAAB8AAUAAAASAAEAAAB8AAYAAAASAAEAAAB8AAcAAAASAAEAAAB8AAgAAAARAAEAAAB8AAkAAAARAAEAAAB8AAoAAAARAAEAAAB8AAsAAAARAAEAAAB9AAsAAAARAAEAAAB+AAsAAAARAAEAAAB/AAsAAAARAAEAAAB+AAoAAAARAAEAAAB9AAoAAAARAAEAAAB9AAkAAAARAAEAAACBAAgAAAAQAAAAAACCAAgAAAARAAAAAACDAAgAAAARAAAAAACEAAgAAAARAAAAAACFAAgAAAARAAAAAACGAAgAAAARAAAAAACHAAgAAAARAAAAAACIAAgAAAARAAAAAACJAAgAAAARAAAAAACKAAgAAAARAAAAAACLAAgAAAARAAAAAACMAAgAAAARAAAAAACNAAgAAAARAAAAAACOAAgAAAARAAAAAACPAAcAAAAQAAAAAACQAAYAAAAQAAAAAACRAAUAAAAQAAAAAACSAAQAAAAQAAAAAACTAAMAAAAQAAAAAACUAAIAAAAQAAAAAACVAAEAAAAQAAAAAACWAAAAAAAQAAAAAACXAP//AAAQAAAAAACYAP7/AAAQAAAAAACZAP3/AAAQAAAAAACaAPz/AAAQAAAAAACbAPv/AAAQAAAAAACcAPv/AAASAAAAAACcAPz/AAASAAEAAACcAP3/AAASAAEAAACcAP7/AAASAAEAAACcAP//AAASAAEAAACcAAAAAAASAAEAAACcAAEAAAASAAEAAACcAAIAAAASAAEAAACcAAMAAAASAAEAAACcAAQAAAASAAEAAACcAAUAAAAQAAAAADCbAAUAAAARAAAAADCaAAUAAAARAAAAADCZAAUAAAARAAAAADCYAAUAAAARAAAAADCXAAUAAAARAAAAADCWAAUAAAARAAAAADCVAAUAAAARAAAAADCUAAUAAAARAAAAADCSAAYAAAARAAAAADCQAAkAAAARAAAAADCPAAkAAAARAAAAADCOAAkAAAARAAAAADCNAAkAAAARAAAAADCMAAkAAAARAAAAADCLAAkAAAARAAAAADCKAAkAAAARAAAAADCJAAkAAAARAAAAADCIAAkAAAARAAAAADCHAAkAAAARAAAAADCGAAkAAAARAAAAADCFAAkAAAARAAAAADCEAAkAAAARAAAAADCDAAkAAAARAAAAADCCAAkAAAARAAAAADCBAAkAAAASAAAAADCGAP7/AAASAAAAADCRAAkAAAAQAAAAADCTAAYAAAAQAAAAADCVAP7/AAAQAAAAADCqAAkAAAAQAAAAADCVAAkAAAARAAAAADCWAAkAAAARAAAAADCXAAkAAAARAAAAADCYAAkAAAARAAAAADCZAAkAAAARAAAAADCaAAkAAAARAAAAADCbAAkAAAARAAAAADCcAAkAAAARAAAAADCdAAkAAAARAAAAADCeAAkAAAARAAAAADCfAAkAAAARAAAAADCgAAkAAAARAAAAADChAAkAAAARAAAAADCiAAkAAAARAAAAADCjAAkAAAARAAAAADCkAAkAAAARAAAAADClAAkAAAARAAAAADCmAAkAAAARAAAAADCnAAkAAAARAAAAADCoAAkAAAARAAAAADCpAAkAAAARAAAAADCHAP7/AAARAAAAADCIAP7/AAARAAAAADCJAP7/AAARAAAAADCKAP7/AAARAAAAADCLAP7/AAARAAAAADCMAP7/AAARAAAAADCNAP7/AAARAAAAADCOAP7/AAARAAAAADCPAP7/AAARAAAAADCQAP7/AAARAAAAADCRAP7/AAARAAAAADCSAP7/AAARAAAAADCTAP7/AAARAAAAADCUAP7/AAARAAAAADCRAPv/AAARAAAAAACQAPv/AAARAAAAAACPAPv/AAARAAAAAACOAPv/AAARAAAAAACNAPv/AAARAAAAAACMAPv/AAARAAAAAACLAPv/AAARAAAAAACKAPv/AAARAAAAAACJAPv/AAARAAAAAACIAPv/AAARAAAAAACHAPv/AAARAAAAAACoAAgAAAARAAAAAACnAAgAAAARAAAAAACmAAgAAAARAAAAAAClAAgAAAARAAAAAACkAAgAAAARAAAAAACjAAgAAAARAAAAAACiAAgAAAARAAAAAAChAAgAAAARAAAAAACgAAgAAAARAAAAAACfAAgAAAARAAAAAACeAAgAAAARAAAAAACcAAcAAAARAAAAAACbAAcAAAARAAAAAACaAAcAAAARAAAAAACZAAcAAAARAAAAAACYAAcAAAARAAAAAACXAAcAAAARAAAAAACWAAcAAAARAAAAAACUAAgAAAARAAAAAACTAAgAAAAQAAAAAACVAAcAAAAQAAAAAACpAAIAAAAQAAAAAACGAPv/AAAQAAAAAACSAPv/AAASAAAAAACTAPz/AAASAAAAAACVAP3/AAASAAAAAACUAP3/AAARAAAAAACqAAIAAAASAAAAAACdAAcAAAASAAAAAACdAAgAAAARAAEAAACcAAgAAAARAAEAAACbAAgAAAARAAEAAACaAAgAAAARAAEAAACZAAgAAAARAAEAAACYAAgAAAARAAEAAACXAAgAAAARAAEAAACWAAgAAAARAAEAAACVAAgAAAARAAEAAACUAAkAAAARAAEAAACTAAkAAAAQAAEAAACTAAoAAAAQAAEAAACTAAsAAAARAAEAAACPAAgAAAARAAEAAACQAAgAAAARAAEAAACQAAcAAAARAAEAAACRAAYAAAARAAEAAACSAAUAAAARAAEAAACTAAUAAAARAAEAAACTAAQAAAARAAEAAACbAPz/AAARAAEAAACbAP3/AAARAAEAAACbAP7/AAARAAEAAACbAP//AAARAAEAAACbAAAAAAARAAEAAACbAAEAAAARAAEAAACbAAIAAAARAAEAAACbAAMAAAARAAEAAACbAAQAAAARAAEAAACaAAQAAAARAAEAAACZAAQAAAARAAEAAACYAAQAAAARAAEAAACXAAQAAAARAAEAAACWAAQAAAARAAEAAACVAAQAAAARAAEAAACUAAQAAAARAAEAAACUAAMAAAARAAEAAACVAAMAAAARAAEAAACWAAMAAAARAAEAAACXAAMAAAARAAEAAACYAAMAAAARAAEAAACZAAMAAAARAAEAAACaAAMAAAARAAEAAACaAAIAAAARAAEAAACaAAEAAAARAAEAAACaAAAAAAARAAEAAACaAP//AAARAAEAAACaAP7/AAARAAEAAACaAP3/AAARAAEAAACZAP7/AAARAAEAAACZAP//AAARAAEAAACZAAAAAAARAAEAAACZAAEAAAARAAEAAACZAAIAAAARAAEAAACYAAEAAAARAAEAAACYAAAAAAARAAEAAACYAP//AAARAAEAAACYAAIAAAARAAEAAACXAAIAAAARAAEAAACXAAEAAAARAAEAAACXAAAAAAARAAEAAACWAAIAAAARAAEAAACWAAEAAAARAAEAAACVAAIAAAARAAEAAACTAP3/AAARAAEAAACSAP3/AAARAAEAAACRAP3/AAARAAEAAACQAP3/AAARAAEAAACPAP3/AAARAAEAAACOAP3/AAARAAEAAACNAP3/AAARAAEAAACMAP3/AAARAAEAAACLAP3/AAARAAEAAACKAP3/AAARAAEAAACJAP3/AAARAAEAAACIAP3/AAARAAEAAACHAP3/AAARAAEAAACHAPz/AAARAAEAAACIAPz/AAARAAEAAACJAPz/AAARAAEAAACKAPz/AAARAAEAAACLAPz/AAARAAEAAACMAPz/AAARAAEAAACNAPz/AAARAAEAAACOAPz/AAARAAEAAACPAPz/AAARAAEAAACQAPz/AAARAAEAAACRAPz/AAARAAEAAACSAPz/AAARAAEAAACGAPz/AAAQAAEAAACGAP3/AAAQAAEAAACRAAcAAAASAAEAAACRAAgAAAASAAEAAACqAAMAAAASAAEAAACqAAQAAAASAAEAAACqAAUAAAASAAEAAACqAAYAAAASAAEAAACqAAcAAAASAAEAAACqAAgAAAASAAEAAACpAAMAAAAQAAEAAACpAAQAAAAQAAEAAACpAAUAAAAQAAEAAACpAAYAAAAQAAEAAACpAAcAAAAQAAEAAACpAAgAAAARAAEAAAAZAAcAAAARAAAAAAAaAAcAAAARAAAAAAAbAAcAAAARAAAAAAAcAAcAAAARAAAAAAAdAAcAAAARAAAAAAAUAAcAAAAQAAAAAAAVAAcAAAARAAAAAAAWAAcAAAARAAAAAAAXAAcAAAARAAAAAAAYAAcAAAARAAAAAAAeAAcAAAARAAAAAAAfAAcAAAARAAAAAAAgAAcAAAARAAAAAAAhAAcAAAARAAAAAAAiAAcAAAASAAAAAAA1AAgAAAARAAAAAAA0AAgAAAARAAAAAAArAAUAAAAQAAEAAAArAAYAAAAQAAEAAAArAAcAAAAQAAEAAAArAAgAAAARAAEAAAAsAAUAAAASAAEAAAAsAAYAAAASAAEAAAAsAAcAAAASAAEAAAAsAAgAAAARAAEAAAAsAAkAAAARAAEAAAArAAkAAAARAAEAAAApAAgAAAARAAAAAAAqAAgAAAARAAAAAAAsAAQAAAASAAAAAAArAAQAAAAQAAAAAAA5AAcAAAAQAAAAAAA6AAYAAAAQAAAAAAA7AAYAAAASAAAAAAA/AAYAAAARAAAAAAA+AAYAAAAQAAAAAAA6AAkAAAARAAEAAAA7AAkAAAASAAEAAAA7AAgAAAASAAEAAAA7AAcAAAASAAEAAAA6AAcAAAARAAEAAAA6AAgAAAARAAEAAAA5AAkAAAARAAEAAAA5AAgAAAARAAEAAAA+AAcAAAAQAAEAAAA+AAgAAAAQAAEAAAA+AAkAAAAQAAEAAABAAAYAAAASAAAAAABBAAcAAAASAAAAAABCAAgAAAARAAAAAABDAAgAAAARAAAAAABEAAgAAAARAAAAAAA/AAcAAAARAAEAAABAAAcAAAARAAEAAABAAAgAAAARAAEAAAA/AAgAAAARAAEAAAA/AAkAAAARAAEAAABBAAkAAAARAAEAAABBAAgAAAARAAEAAABAAAkAAAARAAEAAABDAAkAAAARAAEAAABEAAkAAAARAAEAAABCAAkAAAARAAEAAABFAAgAAAARAAAAAABGAAgAAAARAAAAAABHAAgAAAARAAAAAABIAAgAAAARAAAAAABJAAgAAAARAAAAAABKAAgAAAARAAAAAABLAAgAAAARAAAAAABMAAgAAAARAAAAAABNAAgAAAARAAAAAABOAAgAAAARAAAAAABPAAgAAAARAAAAAABQAAgAAAARAAAAAABRAAgAAAARAAAAAABSAAgAAAARAAAAAABTAAcAAAAQAAAAAABUAAcAAAARAAAAAABVAAYAAAAQAAAAAABWAAYAAAARAAAAAABXAAYAAAARAAAAAABYAAYAAAARAAAAAABZAAYAAAARAAAAAABaAAYAAAAUAAAAAABaAAcAAAAUAAEAAABZAAcAAAATAAEAAABYAAcAAAATAAIAAABXAAgAAAATAAIAAABWAAkAAAATAAIAAABFAAkAAAARAAEAAABUAAkAAAARAAEAAABUAAgAAAARAAEAAABTAAgAAAARAAEAAABTAAkAAAARAAEAAABSAAkAAAARAAEAAABRAAkAAAARAAEAAABQAAkAAAARAAEAAABPAAkAAAARAAEAAABOAAkAAAARAAEAAABNAAkAAAARAAEAAABMAAkAAAARAAEAAABLAAkAAAARAAEAAABKAAkAAAARAAEAAABJAAkAAAARAAEAAABIAAkAAAARAAEAAABHAAkAAAARAAEAAABGAAkAAAARAAEAAABVAAcAAAARAAEAAABWAAcAAAARAAEAAABXAAcAAAARAAEAAABWAAgAAAARAAEAAABVAAgAAAARAAEAAABVAAkAAAARAAEAAABZAAgAAAAUAAMAAABZAAkAAAAUAAMAAABYAAgAAAAUAAIAAABXAAkAAAAUAAIAAABYAAkAAAATAAMAAAAzAAQAAAAEAAAAAAAzAAUAAAAEAAEAAAAzAAYAAAAEAAIAAAAzAAcAAAAEAAMAAAA0AAQAAAAFAAAAAAA1AAQAAAAGAAAAAAA2AAQAAAAHAAAAAAA2AAUAAAAHAAEAAAA2AAYAAAAHAAIAAAA2AAcAAAAHAAMAAAA8AAkAAAAAAAYAAAA9AAkAAAAAAAYAAAA0AAUAAAAdAAgAAAA1AAUAAAAdAAgAAAA1AAYAAAAdAAgAAAA1AAcAAAAdAAgAAAA0AAYAAAAdAAgAAAAAAAIAAAAcAA8AAAA8AAgAAAAdAAgAAAA9AAgAAAAdAAgAAAA9AAcAAAAdAAgAAAA8AAcAAAAdAAgAAAA8AAYAAAAdAAgAAAA9AAYAAAAdAAgAAAA8AAUAAAAdAAgAAAA9AAUAAAAdAAgAAAA+AAUAAAAdAAgAAAA/AAUAAAAdAAgAAABaAAgAAAAdAAgAAABaAAUAAAAdAAgAAABZAAUAAAAdAAgAAABYAAUAAAAdAAgAAAA=")
[node name="Door" parent="TileMapLayer" instance=ExtResource("11_jpc1n")]
-position = Vector2(0, 112)
-target_scene = "res://GreenGreens.tscn"
-target_position = Vector2(2064, 112)
+position = Vector2(832, 112)
+target_scene = "res://GreenGreensIndoor.tscn"
+target_position = Vector2(96, 63)
[node name="Door2" parent="TileMapLayer" instance=ExtResource("11_jpc1n")]
position = Vector2(2064, 112)
target_scene = "res://GreenGreens.tscn"
-target_position = Vector2(0, 112)
+target_position = Vector2(832, 112)
[node name="DoorBoss" parent="TileMapLayer" instance=ExtResource("11_jpc1n")]
-position = Vector2(104, 112)
+position = Vector2(1408, 80)
target_scene = "res://GreenGreensBoss.tscn"
target_position = Vector2(0, 112)
[node name="Wall" type="TileMapLayer" parent="."]
modulate = Color(1, 1, 1, 0.392157)
-tile_map_data = PackedByteArray("AAAAAP//AAAAAAAAAAABAP//AAAAAAAAAAACAP//AAAAAAAAAAADAP//AAAAAAAAAAAEAP//AAAAAAAAAAAFAP//AAAAAAAAAAAGAP//AAAAAAAAAAAHAP//AAAAAAAAAAAIAP//AAAAAAAAAAAJAP//AAAAAAAAAAAKAP//AAAAAAAAAAALAP//AAAAAAAAAAAMAP//AAAAAAAAAAANAP//AAAAAAAAAAAOAP//AAAAAAAAAAAPAP//AAAAAAAAAAAQAP//AAAAAAAAAAARAP//AAAAAAAAAAASAP//AAAAAAAAAAATAP//AAAAAAAAAAAUAP//AAAAAAAAAAAVAP//AAAAAAAAAAAWAP//AAAAAAAAAAAXAP//AAAAAAAAAAAYAP//AAAAAAAAAAAZAP//AAAAAAAAAAAaAP//AAAAAAAAAAAbAP//AAAAAAAAAAAcAP//AAAAAAAAAAAdAP//AAAAAAAAAAAeAP//AAAAAAAAAAAfAP//AAAAAAAAAAAgAP//AAAAAAAAAAAhAP//AAAAAAAAAAAiAP//AAAAAAAAAAAjAP//AAAAAAAAAAAkAP//AAAAAAAAAAAlAP//AAAAAAAAAAAmAP//AAAAAAAAAAAnAP//AAAAAAAAAAAoAP//AAAAAAAAAAApAP//AAAAAAAAAAAqAP//AAAAAAAAAAArAP//AAAAAAAAAAAsAP//AAAAAAAAAAD/////AAAAAAAAAAAtAP//AAAAAAAAAAAuAP//AAAAAAAAAAAvAP//AAAAAAAAAAAwAP//AAAAAAAAAAAxAP//AAAAAAAAAAAyAP//AAAAAAAAAAAzAP//AAAAAAAAAAA0AP//AAAAAAAAAAA1AP//AAAAAAAAAAA2AP//AAAAAAAAAAA3AP//AAAAAAAAAAA4AP//AAAAAAAAAAA5AP//AAAAAAAAAAA6AP//AAAAAAAAAAA7AP//AAAAAAAAAAA8AP//AAAAAAAAAAA9AP//AAAAAAAAAAA+AP//AAAAAAAAAAA/AP//AAAAAAAAAABAAP//AAAAAAAAAABBAP//AAAAAAAAAABCAP//AAAAAAAAAABDAP//AAAAAAAAAAD//wAAAAAAAAAAAAD//wEAAAAAAAAAAAD//wIAAAAAAAAAAAD//wMAAAAAAAAAAAD//wQAAAAAAAAAAAD//wUAAAAAAAAAAAD//wYAAAAAAAAAAABEAP//AAAAAAAAAABFAP//AAAAAAAAAABGAP//AAAAAAAAAABHAP//AAAAAAAAAABIAP//AAAAAAAAAABJAP//AAAAAAAAAABKAP//AAAAAAAAAABLAP//AAAAAAAAAABMAP//AAAAAAAAAABNAP//AAAAAAAAAABOAP//AAAAAAAAAABPAP//AAAAAAAAAABQAP//AAAAAAAAAABRAP//AAAAAAAAAABSAP//AAAAAAAAAABTAP//AAAAAAAAAABUAP//AAAAAAAAAABVAP//AAAAAAAAAABWAP//AAAAAAAAAABXAP//AAAAAAAAAABYAP//AAAAAAAAAABZAP//AAAAAAAAAABaAP//AAAAAAAAAABbAP//AAAAAAAAAABcAP//AAAAAAAAAABdAP//AAAAAAAAAABeAP//AAAAAAAAAABfAP//AAAAAAAAAABgAP//AAAAAAAAAABhAP//AAAAAAAAAABiAP//AAAAAAAAAABjAP//AAAAAAAAAABkAP//AAAAAAAAAABlAP//AAAAAAAAAABmAP//AAAAAAAAAABnAP//AAAAAAAAAABoAP//AAAAAAAAAABpAP//AAAAAAAAAABqAP//AAAAAAAAAABrAP//AAAAAAAAAABsAP//AAAAAAAAAABtAP//AAAAAAAAAABuAP//AAAAAAAAAABvAP//AAAAAAAAAABwAP//AAAAAAAAAABxAP//AAAAAAAAAAByAP//AAAAAAAAAAD//wcAAAAAAAAAAAD//wgAAAAAAAAAAAD//wkAAAAAAAAAAAA=")
+tile_map_data = PackedByteArray("AAD//wEAAAAAAAAAAAD//wIAAAAAAAAAAAD//wMAAAAAAAAAAAD//wQAAAAAAAAAAAD//wUAAAAAAAAAAAD//wYAAAAAAAAAAAD//wcAAAAAAAAAAAD//wgAAAAAAAAAAAD//wkAAAAAAAAAAABbAAIAAAAAAAAAAABbAAMAAAAAAAAAAABbAAQAAAAAAAAAAABbAAUAAAAAAAAAAABbAAYAAAAAAAAAAAAAAAEAAAAAAAAAAAABAAEAAAAAAAAAAAACAAEAAAAAAAAAAAADAAEAAAAAAAAAAAAEAAEAAAAAAAAAAAAFAAEAAAAAAAAAAAAGAAEAAAAAAAAAAAAHAAEAAAAAAAAAAAAIAAEAAAAAAAAAAAAJAAEAAAAAAAAAAAAKAAEAAAAAAAAAAAALAAEAAAAAAAAAAAAMAAEAAAAAAAAAAAANAAEAAAAAAAAAAAAOAAEAAAAAAAAAAAAPAAEAAAAAAAAAAAAQAAEAAAAAAAAAAAARAAEAAAAAAAAAAAASAAEAAAAAAAAAAAATAAEAAAAAAAAAAAAUAAEAAAAAAAAAAAAVAAEAAAAAAAAAAAAWAAEAAAAAAAAAAAAXAAEAAAAAAAAAAAAYAAEAAAAAAAAAAAAZAAEAAAAAAAAAAAAaAAEAAAAAAAAAAAAbAAEAAAAAAAAAAAAcAAEAAAAAAAAAAAAdAAEAAAAAAAAAAAAeAAEAAAAAAAAAAAAfAAEAAAAAAAAAAAAgAAEAAAAAAAAAAAAhAAEAAAAAAAAAAAAiAAEAAAAAAAAAAAAjAAEAAAAAAAAAAAAkAAEAAAAAAAAAAAAlAAEAAAAAAAAAAAAmAAEAAAAAAAAAAAAnAAEAAAAAAAAAAAAoAAEAAAAAAAAAAAApAAEAAAAAAAAAAAAqAAEAAAAAAAAAAAArAAEAAAAAAAAAAAAsAAEAAAAAAAAAAAAtAAEAAAAAAAAAAAAuAAEAAAAAAAAAAAAvAAEAAAAAAAAAAAAwAAEAAAAAAAAAAAAxAAEAAAAAAAAAAAAyAAEAAAAAAAAAAAAzAAEAAAAAAAAAAAA0AAEAAAAAAAAAAAA1AAEAAAAAAAAAAAA2AAEAAAAAAAAAAAA3AAEAAAAAAAAAAAA4AAEAAAAAAAAAAAA5AAEAAAAAAAAAAAA6AAEAAAAAAAAAAAA7AAEAAAAAAAAAAAA8AAEAAAAAAAAAAAA9AAEAAAAAAAAAAAA+AAEAAAAAAAAAAAA/AAEAAAAAAAAAAABAAAEAAAAAAAAAAABBAAEAAAAAAAAAAABCAAEAAAAAAAAAAABDAAEAAAAAAAAAAABEAAEAAAAAAAAAAABFAAEAAAAAAAAAAABGAAEAAAAAAAAAAABHAAEAAAAAAAAAAABIAAEAAAAAAAAAAABJAAEAAAAAAAAAAABKAAEAAAAAAAAAAABLAAEAAAAAAAAAAABMAAEAAAAAAAAAAABNAAEAAAAAAAAAAABOAAEAAAAAAAAAAABPAAEAAAAAAAAAAABQAAEAAAAAAAAAAABRAAEAAAAAAAAAAABSAAEAAAAAAAAAAABTAAEAAAAAAAAAAABUAAEAAAAAAAAAAABVAAEAAAAAAAAAAABWAAEAAAAAAAAAAABXAAEAAAAAAAAAAABYAAEAAAAAAAAAAABZAAEAAAAAAAAAAABaAAEAAAAAAAAAAABbAAEAAAAAAAAAAAA=")
tile_set = SubResource("TileSet_dimm0")
script = ExtResource("13_5fv8j")
+[node name="KnockoutPlane" parent="." instance=ExtResource("9_4vibw")]
+tile_map_data = PackedByteArray("AAA8AAoAAQAAAAAAAAA9AAoAAQAAAAAAAAA=")
+
[node name="Player" parent="." instance=ExtResource("12_n6enf")]
-position = Vector2(37, 58)
+position = Vector2(24, 72)
[node name="Enemies" type="Node2D" parent="."]
[node name="Enemy" parent="Enemies" instance=ExtResource("13_bft13")]
-position = Vector2(416, 104)
+position = Vector2(376, 104)
[node name="Enemy2" parent="Enemies" instance=ExtResource("13_bft13")]
-position = Vector2(224, 115)
+position = Vector2(256, 120)
+movement_type = 1
[node name="Enemy3" parent="Enemies" instance=ExtResource("13_bft13")]
-position = Vector2(552, 104)
+position = Vector2(1160, 120)
+speed = 60.0
[node name="Enemy4" parent="Enemies" instance=ExtResource("13_bft13")]
-position = Vector2(816, 120)
+position = Vector2(1272, 120)
[node name="Enemy5" parent="Enemies" instance=ExtResource("13_bft13")]
-position = Vector2(229, 104)
+position = Vector2(288, 120)
+movement_type = 1
[node name="Enemy6" parent="Enemies" instance=ExtResource("13_bft13")]
position = Vector2(648, 120)
-[node name="Enemy7" parent="Enemies" instance=ExtResource("13_bft13")]
-position = Vector2(848, 56)
+[node name="FlyingEnemy" parent="Enemies" instance=ExtResource("11_tqgog")]
+position = Vector2(904, 40)
+movement_type = 1
+
+[node name="FlyingEnemy2" parent="Enemies" instance=ExtResource("11_tqgog")]
+position = Vector2(648, 64)
+
+[node name="FlyingEnemy4" parent="Enemies" instance=ExtResource("11_tqgog")]
+position = Vector2(1112, 72)
+
+[node name="FlyingEnemy3" parent="Enemies" instance=ExtResource("11_tqgog")]
+position = Vector2(936, 48)
+movement_type = 1
+
+[node name="Objects" type="Node2D" parent="."]
[node name="Area2D" type="Area2D" parent="."]
collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
+position = Vector2(0, 32)
shape = SubResource("RectangleShape2D_gog7l")
[node name="Area2D2" type="Area2D" parent="."]
@@ -111,5 +133,7 @@ collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D2"]
shape = SubResource("RectangleShape2D_208d0")
+[connection signal="area_entered" from="Area2D" to="." method="_on_area_2d_area_entered"]
[connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"]
+[connection signal="area_entered" from="Area2D2" to="." method="_on_area_2d_2_area_entered"]
[connection signal="body_entered" from="Area2D2" to="." method="_on_area_2d_2_body_entered"]
diff --git a/GreenGreensBoss.tscn b/GreenGreensBoss.tscn
index 432542b..5e996fd 100644
--- a/GreenGreensBoss.tscn
+++ b/GreenGreensBoss.tscn
@@ -31,6 +31,7 @@ script = ExtResource("1_4ry16")
[node name="HUD" parent="." instance=ExtResource("2_ne1kh")]
[node name="TileMapLayer" parent="." instance=ExtResource("5_hkgd5")]
+visible = false
tile_map_data = PackedByteArray("AAAAAAgAAAARAAAAAAABAAgAAAARAAAAAAACAAgAAAARAAAAAAADAAgAAAARAAAAAAAEAAgAAAARAAAAAAAFAAgAAAARAAAAAAAGAAgAAAARAAAAAAAHAAgAAAARAAAAAAAIAAgAAAARAAAAAAAJAAgAAAARAAAAAAA=")
[node name="Wall" type="TileMapLayer" parent="."]
@@ -42,7 +43,7 @@ script = ExtResource("8_au054")
[node name="Sprite2D" type="Sprite2D" parent="."]
texture_filter = 1
-position = Vector2(80, 80)
+position = Vector2(80, 79)
scale = Vector2(1, 1.00787)
texture = ExtResource("3_rtuo7")
@@ -59,7 +60,7 @@ shape = SubResource("RectangleShape2D_na0iy")
texture_filter = 1
position = Vector2(122, 72)
sprite_frames = ExtResource("8_rne3o")
-animation = &"eye_open"
+animation = &"hole_idle"
[node name="Tear" type="Sprite2D" parent="WhispyWoods"]
visible = false
@@ -71,13 +72,17 @@ texture = ExtResource("9_iwq4r")
texture_filter = 1
position = Vector2(130, 72)
sprite_frames = ExtResource("8_rne3o")
-animation = &"eye_open"
+animation = &"hole_idle"
[node name="Mouth" type="AnimatedSprite2D" parent="WhispyWoods"]
texture_filter = 1
position = Vector2(124, 98)
sprite_frames = ExtResource("8_rne3o")
-animation = &"mouth_idle"
+animation = &"hole_idle"
+
+[node name="BlinkTimer" type="Timer" parent="WhispyWoods"]
+wait_time = 5.0
+autostart = true
[node name="Door" parent="." instance=ExtResource("6_ga2l4")]
position = Vector2(0, 112)
@@ -86,3 +91,5 @@ target_position = Vector2(104, 112)
[node name="Player" parent="." instance=ExtResource("9_b0r1m")]
position = Vector2(32, 72)
+
+[connection signal="timeout" from="WhispyWoods/BlinkTimer" to="WhispyWoods" method="_on_blink_timer_timeout"]
diff --git a/GreenGreensIndoor.tscn b/GreenGreensIndoor.tscn
new file mode 100644
index 0000000..6965038
--- /dev/null
+++ b/GreenGreensIndoor.tscn
@@ -0,0 +1,76 @@
+[gd_scene load_steps=14 format=4 uid="uid://cy8lbbxx3ciwm"]
+
+[ext_resource type="Script" path="res://green_greens_indoor.gd" id="1_ydo2r"]
+[ext_resource type="PackedScene" uid="uid://bb8nnbftq04df" path="res://HUD.tscn" id="2_uulf3"]
+[ext_resource type="Texture2D" uid="uid://dq3ybrhi8w24p" path="res://Assets/Map/green_greens/Clouds-transparent.png" id="3_6v6ut"]
+[ext_resource type="Texture2D" uid="uid://bu4keik2lmexj" path="res://Assets/Map/green_greens/background-transparent.png" id="4_mjhoa"]
+[ext_resource type="PackedScene" uid="uid://b1si77qfmut5x" path="res://Assets/Map/TileMapLayer.tscn" id="5_6c002"]
+[ext_resource type="PackedScene" uid="uid://7ndl8hvg4e38" path="res://Door.tscn" id="6_46evu"]
+[ext_resource type="Texture2D" uid="uid://blq6u731g8p1d" path="res://Assets/Map/green_greens/inner-01.png" id="7_l023l"]
+[ext_resource type="Script" path="res://Assets/Map/tile_map_layer.gd" id="8_p8fvd"]
+[ext_resource type="PackedScene" uid="uid://fe6exyigjb72" path="res://Player.tscn" id="10_242rd"]
+[ext_resource type="PackedScene" uid="uid://cltusavcxucip" path="res://Assets/Map/DroppablePlatform01.tscn" id="10_qp1xu"]
+[ext_resource type="PackedScene" uid="uid://cqii1000vi1y3" path="res://Objects/potion.tscn" id="13_ltn11"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_hnnog"]
+texture = ExtResource("7_l023l")
+0:0/0 = 0
+0:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+
+[sub_resource type="TileSet" id="TileSet_dimm0"]
+physics_layer_0/collision_layer = 16
+physics_layer_0/collision_mask = 0
+sources/0 = SubResource("TileSetAtlasSource_hnnog")
+
+[node name="GreenGreensIndoor" type="Node2D"]
+script = ExtResource("1_ydo2r")
+
+[node name="HUD" parent="." instance=ExtResource("2_uulf3")]
+
+[node name="BackgroundClouds" type="Parallax2D" parent="."]
+scroll_scale = Vector2(0.5, 1)
+repeat_size = Vector2(190, 0)
+
+[node name="Sprite2D" type="Sprite2D" parent="BackgroundClouds"]
+texture_filter = 1
+position = Vector2(96, 24)
+texture = ExtResource("3_6v6ut")
+
+[node name="Background" type="Parallax2D" parent="."]
+scroll_scale = Vector2(0.8, 1)
+repeat_size = Vector2(360, 0)
+
+[node name="Sprite2D" type="Sprite2D" parent="Background"]
+texture_filter = 1
+position = Vector2(175, 26)
+texture = ExtResource("4_mjhoa")
+
+[node name="TileMapLayer" parent="." instance=ExtResource("5_6c002")]
+tile_map_data = PackedByteArray("AAACAAEAAAAAAAMAAAACAAIAAAAAAAMAAAACAAMAAAAAAAMAAAACAAQAAAAAAAMAAAACAAUAAAAAAAMAAAACAAYAAAAAAAMAAAACAAcAAAARAAMAAAADAAEAAAATAAsAAAADAAIAAAATAAsAAAADAAMAAAATAAsAAAADAAQAAAATAAsAAAADAAUAAAATAAsAAAADAAYAAAATAAsAAAADAAcAAAARAAMAAAAEAAIAAAATAAsAAAAEAAMAAAATAAsAAAAEAAQAAAATAAsAAAAEAAUAAAATAAsAAAAEAAYAAAATAAsAAAAEAAcAAAARAAMAAAAFAAEAAAATAAsAAAAFAAIAAAATAAsAAAAFAAMAAAATAAsAAAAFAAQAAAATAAsAAAAFAAYAAAATAAsAAAAFAAcAAAARAAMAAAAGAAEAAAATAAsAAAAGAAIAAAATAAsAAAAGAAMAAAATAAsAAAAGAAYAAAATAAsAAAAHAAIAAAATAAsAAAAHAAMAAAATAAsAAAAHAAQAAAATAAsAAAAHAAYAAAATAAsAAAAHAAcAAAARAAMAAAAIAAEAAAATAAsAAAAIAAIAAAATAAsAAAAIAAMAAAATAAsAAAAIAAQAAAATAAsAAAAIAAUAAAATAAsAAAAIAAYAAAATAAsAAAAIAAcAAAARAAMAAAAJAAEAAAAAAAMAAAAJAAIAAAAAAAMAAAAJAAMAAAAAAAMAAAAJAAQAAAAAAAMAAAAJAAUAAAAAAAMAAAAJAAYAAAAAAAMAAAAJAAcAAAARAAMAAAAAAAUAAAARAAAAAAAAAAYAAAARAAEAAAAAAAcAAAARAAEAAAABAAUAAAARAAAAAAABAAYAAAARAAEAAAABAAcAAAAQAAMAAAACAP7/AAAAAAMAAAACAP//AAAAAAMAAAACAAAAAAAAAAMAAAADAP7/AAATAAsAAAADAP//AAATAAsAAAADAAAAAAATAAsAAAAEAP7/AAATAAsAAAAEAP//AAATAAsAAAAEAAAAAAATAAsAAAAFAP7/AAATAAsAAAAFAP//AAATAAsAAAAFAAAAAAATAAsAAAAGAP7/AAATAAsAAAAGAP//AAATAAsAAAAGAAAAAAATAAsAAAAGAAcAAAARAAMAAAAHAP7/AAATAAsAAAAHAP//AAATAAsAAAAHAAAAAAATAAsAAAAIAP7/AAATAAsAAAAIAP//AAATAAsAAAAIAAAAAAATAAsAAAAJAP7/AAAAAAMAAAAJAP//AAAAAAMAAAAJAAAAAAAAAAMAAAAKAAUAAAARAAAAAAAKAAYAAAARAAEAAAAKAAcAAAASAAMAAAALAAUAAAARAAAAAAALAAYAAAARAAEAAAALAAcAAAARAAEAAAAEAAEAAAATAAsAAAAHAAEAAAATAAsAAAAFAAUAAAATAAsAAAAGAAUAAAATAAsAAAAHAAUAAAATAAsAAAA=")
+
+[node name="Wall" type="TileMapLayer" parent="."]
+modulate = Color(1, 1, 1, 0.392157)
+tile_map_data = PackedByteArray("AAD//wAAAAAAAAAAAAD//wEAAAAAAAAAAAD//wIAAAAAAAAAAAD//wMAAAAAAAAAAAD//wQAAAAAAAAAAAD//wUAAAAAAAAAAAD//wYAAAAAAAAAAAAMAP//AAAAAAAAAAAMAAAAAAAAAAAAAAAMAAEAAAAAAAAAAAAMAAIAAAAAAAAAAAAMAAMAAAAAAAAAAAAMAAQAAAAAAAAAAAAMAAUAAAAAAAAAAAAMAAYAAAAAAAAAAAD//wcAAAAAAAAAAAAMAAcAAAAAAAAAAAD/////AAAAAAAAAAAAAP7/AAAAAAAAAAABAP7/AAAAAAAAAAACAP7/AAAAAAAAAAADAP7/AAAAAAAAAAAEAP7/AAAAAAAAAAAFAP7/AAAAAAAAAAAGAP7/AAAAAAAAAAAHAP7/AAAAAAAAAAAIAP7/AAAAAAAAAAAJAP7/AAAAAAAAAAAKAP7/AAAAAAAAAAALAP7/AAAAAAAAAAA=")
+tile_set = SubResource("TileSet_dimm0")
+script = ExtResource("8_p8fvd")
+
+[node name="Objects" type="Node2D" parent="."]
+
+[node name="Door" parent="Objects" instance=ExtResource("6_46evu")]
+position = Vector2(96, 64)
+target_scene = "res://GreenGreens.tscn"
+target_position = Vector2(832, 112)
+color = 1
+
+[node name="Potion" parent="Objects" instance=ExtResource("13_ltn11")]
+position = Vector2(53, 104)
+
+[node name="Potion2" parent="Objects" instance=ExtResource("13_ltn11")]
+position = Vector2(134, 104)
+
+[node name="DroppablePlatform01" parent="Objects" instance=ExtResource("10_qp1xu")]
+position = Vector2(88, 88)
+width = 3
+
+[node name="Player" parent="." instance=ExtResource("10_242rd")]
+position = Vector2(88, 72)
diff --git a/Objects/potion.gd b/Objects/potion.gd
new file mode 100644
index 0000000..75c336b
--- /dev/null
+++ b/Objects/potion.gd
@@ -0,0 +1,3 @@
+extends Area2D
+
+@export var heal_power = 2
diff --git a/Objects/potion.png b/Objects/potion.png
new file mode 100644
index 0000000..969152a
--- /dev/null
+++ b/Objects/potion.png
Binary files differ
diff --git a/Objects/potion.png.import b/Objects/potion.png.import
new file mode 100644
index 0000000..7b67e86
--- /dev/null
+++ b/Objects/potion.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c85chn8gpwbi4"
+path="res://.godot/imported/potion.png-f20ea806bb8634477399acb02decb4a1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Objects/potion.png"
+dest_files=["res://.godot/imported/potion.png-f20ea806bb8634477399acb02decb4a1.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/Objects/potion.png~ b/Objects/potion.png~
new file mode 100644
index 0000000..db422b4
--- /dev/null
+++ b/Objects/potion.png~
Binary files differ
diff --git a/Objects/potion.tscn b/Objects/potion.tscn
new file mode 100644
index 0000000..7a53025
--- /dev/null
+++ b/Objects/potion.tscn
@@ -0,0 +1,21 @@
+[gd_scene load_steps=4 format=3 uid="uid://cqii1000vi1y3"]
+
+[ext_resource type="Texture2D" uid="uid://c85chn8gpwbi4" path="res://Objects/potion.png" id="1_ru42e"]
+[ext_resource type="Script" path="res://Objects/potion.gd" id="1_x6nne"]
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_7il5r"]
+size = Vector2(2, 10)
+
+[node name="Potion" type="Area2D" groups=["object_heal"]]
+collision_layer = 4
+script = ExtResource("1_x6nne")
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture_filter = 1
+position = Vector2(0, -6)
+texture = ExtResource("1_ru42e")
+centered = false
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+position = Vector2(3, 1)
+shape = SubResource("RectangleShape2D_7il5r")
diff --git a/Player.tscn b/Player.tscn
index 19d5567..2fdbefe 100644
--- a/Player.tscn
+++ b/Player.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=73 format=3 uid="uid://fe6exyigjb72"]
+[gd_scene load_steps=75 format=3 uid="uid://fe6exyigjb72"]
[ext_resource type="Script" path="res://player.gd" id="1_d2vao"]
[ext_resource type="Texture2D" uid="uid://tvalc858lt0n" path="res://Assets/Kirby/duck.png" id="1_wgfub"]
@@ -33,7 +33,6 @@
[ext_resource type="AudioStream" uid="uid://dch55m1hjpa7n" path="res://Assets/Sounds/star-shot.wav" id="18_8tquw"]
[ext_resource type="AudioStream" uid="uid://fc5lm052l0ci" path="res://Assets/Sounds/air-shot.wav" id="18_b0jy8"]
[ext_resource type="Texture2D" uid="uid://c5qsow60trggu" path="res://Assets/Kirby/knockout-2.png" id="18_enx47"]
-[ext_resource type="Texture2D" uid="uid://d0u6jw880abmk" path="res://Assets/Kirby/air-shot.png" id="19_8bfby"]
[ext_resource type="Texture2D" uid="uid://b2smrgiobqc24" path="res://Assets/Kirby/knockout-3.png" id="19_b07rj"]
[ext_resource type="Texture2D" uid="uid://dwnmiim6wpj3h" path="res://Assets/Kirby/knockout-4.png" id="20_dcmki"]
[ext_resource type="Texture2D" uid="uid://v3mqtnbs3e8g" path="res://Assets/Kirby/star-shot-01.png" id="20_ptn6m"]
@@ -49,6 +48,7 @@
[ext_resource type="AudioStream" uid="uid://denc1y7sjgm3o" path="res://Assets/Sounds/enter-door.wav" id="30_bqihm"]
[ext_resource type="Texture2D" uid="uid://p5id24wo3axc" path="res://Assets/Kirby/wall-bounce.png" id="30_jvald"]
[ext_resource type="AudioStream" uid="uid://brufyhxonh3jr" path="res://Assets/Music/knockout.wav" id="32_cphxk"]
+[ext_resource type="AudioStream" uid="uid://c71kp7jc5nf2t" path="res://Assets/Sounds/pickup.wav" id="45_ujcvn"]
[sub_resource type="Gradient" id="Gradient_1p6gt"]
offsets = PackedFloat32Array(0, 0.188525)
@@ -257,9 +257,6 @@ animations = [{
[sub_resource type="CircleShape2D" id="CircleShape2D_ncpg1"]
radius = 8.0
-[sub_resource type="CircleShape2D" id="CircleShape2D_vtlrr"]
-radius = 8.0
-
[sub_resource type="CircleShape2D" id="CircleShape2D_5n68u"]
radius = 8.0
@@ -486,6 +483,91 @@ tracks/7/keys = {
"values": [Vector2(0, -4), Vector2(0, 0)]
}
+[sub_resource type="Animation" id="Animation_5k0g6"]
+resource_name = "duck"
+length = 0.1
+step = 0.1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("AnimatedSprite2D:animation")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [&"duck"]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("AnimatedSprite2D:frame")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [0]
+}
+
+[sub_resource type="Animation" id="Animation_xd0ce"]
+resource_name = "enter_door"
+step = 0.1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("AnimatedSprite2D:animation")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [&"enter_door"]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("AnimatedSprite2D:frame")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [0]
+}
+
+[sub_resource type="Animation" id="Animation_54067"]
+resource_name = "exit_door"
+step = 0.1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("AnimatedSprite2D:animation")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [&"exit_door"]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("AnimatedSprite2D:frame")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [0]
+}
+
[sub_resource type="Animation" id="Animation_qpvoi"]
resource_name = "fly"
loop_mode = 1
@@ -919,6 +1001,108 @@ tracks/7/keys = {
"values": [Vector2(0, -4)]
}
+[sub_resource type="Animation" id="Animation_c5bfn"]
+resource_name = "inflated_walk"
+length = 0.4
+loop_mode = 1
+step = 0.1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("AnimatedSprite2D:animation")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [&"inflated_walk"]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("AnimatedSprite2D:frame")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0, 0.2),
+"transitions": PackedFloat32Array(1, 1),
+"update": 1,
+"values": [0, 1]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("AnimatedSprite2D:position")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [Vector2(-4, -8)]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("NavigationShape:shape:radius")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [11.5]
+}
+tracks/4/type = "value"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("NavigationShape:position")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector2(0, -4)]
+}
+tracks/5/type = "value"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("HurtArea/HurtShape:position")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector2(0, -4)]
+}
+tracks/6/type = "value"
+tracks/6/imported = false
+tracks/6/enabled = true
+tracks/6/path = NodePath("HurtArea/HurtShape:shape:radius")
+tracks/6/interp = 1
+tracks/6/loop_wrap = true
+tracks/6/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [12.0]
+}
+tracks/7/type = "value"
+tracks/7/imported = false
+tracks/7/enabled = true
+tracks/7/path = NodePath("CollisionArea/CollisionShape:position")
+tracks/7/interp = 1
+tracks/7/loop_wrap = true
+tracks/7/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector2(0, -4)]
+}
+
[sub_resource type="Animation" id="Animation_73rqc"]
resource_name = "inhale"
length = 0.1
@@ -1035,108 +1219,6 @@ tracks/1/keys = {
"values": [0, 1, 2, 3]
}
-[sub_resource type="Animation" id="Animation_c5bfn"]
-resource_name = "inflated_walk"
-length = 0.4
-loop_mode = 1
-step = 0.1
-tracks/0/type = "value"
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/path = NodePath("AnimatedSprite2D:animation")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 1,
-"values": [&"inflated_walk"]
-}
-tracks/1/type = "value"
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/path = NodePath("AnimatedSprite2D:frame")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/keys = {
-"times": PackedFloat32Array(0, 0.2),
-"transitions": PackedFloat32Array(1, 1),
-"update": 1,
-"values": [0, 1]
-}
-tracks/2/type = "value"
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/path = NodePath("AnimatedSprite2D:position")
-tracks/2/interp = 1
-tracks/2/loop_wrap = true
-tracks/2/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 1,
-"values": [Vector2(-4, -8)]
-}
-tracks/3/type = "value"
-tracks/3/imported = false
-tracks/3/enabled = true
-tracks/3/path = NodePath("NavigationShape:shape:radius")
-tracks/3/interp = 1
-tracks/3/loop_wrap = true
-tracks/3/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 0,
-"values": [11.5]
-}
-tracks/4/type = "value"
-tracks/4/imported = false
-tracks/4/enabled = true
-tracks/4/path = NodePath("NavigationShape:position")
-tracks/4/interp = 1
-tracks/4/loop_wrap = true
-tracks/4/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 0,
-"values": [Vector2(0, -4)]
-}
-tracks/5/type = "value"
-tracks/5/imported = false
-tracks/5/enabled = true
-tracks/5/path = NodePath("HurtArea/HurtShape:position")
-tracks/5/interp = 1
-tracks/5/loop_wrap = true
-tracks/5/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 0,
-"values": [Vector2(0, -4)]
-}
-tracks/6/type = "value"
-tracks/6/imported = false
-tracks/6/enabled = true
-tracks/6/path = NodePath("HurtArea/HurtShape:shape:radius")
-tracks/6/interp = 1
-tracks/6/loop_wrap = true
-tracks/6/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 0,
-"values": [12.0]
-}
-tracks/7/type = "value"
-tracks/7/imported = false
-tracks/7/enabled = true
-tracks/7/path = NodePath("CollisionArea/CollisionShape:position")
-tracks/7/interp = 1
-tracks/7/loop_wrap = true
-tracks/7/keys = {
-"times": PackedFloat32Array(0),
-"transitions": PackedFloat32Array(1),
-"update": 0,
-"values": [Vector2(0, -4)]
-}
-
[sub_resource type="Animation" id="Animation_kgxu5"]
resource_name = "wall_bounce"
length = 0.1
@@ -1170,6 +1252,9 @@ tracks/1/keys = {
_data = {
"RESET": SubResource("Animation_hqb8a"),
"digest": SubResource("Animation_hekxe"),
+"duck": SubResource("Animation_5k0g6"),
+"enter_door": SubResource("Animation_xd0ce"),
+"exit_door": SubResource("Animation_54067"),
"fly": SubResource("Animation_qpvoi"),
"fly_exhale": SubResource("Animation_soeb7"),
"idle": SubResource("Animation_6ns5d"),
@@ -1184,6 +1269,7 @@ _data = {
}
[node name="Player" type="CharacterBody2D" groups=["player"]]
+collision_layer = 0
collision_mask = 18
script = ExtResource("1_d2vao")
@@ -1209,13 +1295,13 @@ shape = ExtResource("26_pm11k")
debug_color = Color(0.145291, 0.463217, 5.77569e-07, 0.42)
[node name="HurtArea" type="Area2D" parent="."]
-collision_mask = 34
+collision_mask = 546
[node name="HurtShape" type="CollisionShape2D" parent="HurtArea"]
shape = SubResource("CircleShape2D_ncpg1")
debug_color = Color(1, 0.560108, 0.528855, 0.42)
-[node name="CollisionArea" type="Area2D" parent="."]
+[node name="CollisionArea" type="Area2D" parent="." groups=["collision_area"]]
collision_mask = 198
[node name="CollisionShape" type="CollisionShape2D" parent="CollisionArea"]
@@ -1283,21 +1369,12 @@ stream = ExtResource("30_bqihm")
unique_name_in_owner = true
stream = ExtResource("32_cphxk")
-[node name="AirShot" type="Area2D" parent="."]
-position = Vector2(40, 0)
-collision_layer = 8
-collision_mask = 518
-metadata/_edit_group_ = true
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="AirShot"]
-shape = SubResource("CircleShape2D_vtlrr")
-
-[node name="Sprite2D" type="Sprite2D" parent="AirShot"]
-texture_filter = 1
-texture = ExtResource("19_8bfby")
+[node name="SoundPickup" type="AudioStreamPlayer" parent="Sounds"]
+unique_name_in_owner = true
+stream = ExtResource("45_ujcvn")
[node name="StarShot" type="Area2D" parent="."]
-position = Vector2(64, 0)
+position = Vector2(40, 0)
collision_layer = 8
collision_mask = 518
metadata/_edit_group_ = true
@@ -1347,9 +1424,12 @@ one_shot = true
one_shot = true
[node name="InvincibilityTimer" type="Timer" parent="."]
+wait_time = 2.0
one_shot = true
+[connection signal="area_entered" from="HurtArea" to="." method="_on_hurt_area_area_entered"]
[connection signal="body_entered" from="HurtArea" to="." method="_on_hurt_area_body_entered"]
+[connection signal="area_entered" from="CollisionArea" to="." method="_on_collision_area_area_entered"]
[connection signal="body_entered" from="CollisionArea" to="." method="_on_collision_area_body_entered"]
[connection signal="body_exited" from="CollisionArea" to="." method="_on_collision_area_body_exited"]
[connection signal="timeout" from="InvincibilityTimer" to="." method="_on_invincibility_timer_timeout"]
diff --git a/SoundManager.tscn b/SoundManager.tscn
index 810d8c9..c50b4f5 100644
--- a/SoundManager.tscn
+++ b/SoundManager.tscn
@@ -62,6 +62,7 @@ Vector2i(1, 1): {
}
[node name="SoundManager" type="Node"]
+process_mode = 3
script = ExtResource("1_640nc")
[node name="EnterDoor" type="AudioStreamPlayer" parent="."]
diff --git a/air_shot.gd b/air_shot.gd
new file mode 100644
index 0000000..ba2688d
--- /dev/null
+++ b/air_shot.gd
@@ -0,0 +1,34 @@
+extends Area2D
+
+
+signal hit(node: Node2D)
+signal end_of_life
+
+var tween: Tween
+
+@export var direction: float
+
+
+func _ready() -> void:
+ $Sound.play()
+ $Sprite2D.flip_h = direction < 0
+
+ tween = get_tree().create_tween()
+ tween.tween_property(
+ self,
+ "global_position",
+ global_position + Vector2(sign(direction) * 64, 0),
+ 0.3
+ ).set_ease(Tween.EASE_OUT)
+ tween.tween_callback(func():
+ end_of_life.emit()
+ )
+
+
+func _on_area_entered(area: Area2D) -> void:
+ tween.stop()
+ hit.emit(area)
+
+func _on_body_entered(body: Node2D) -> void:
+ tween.stop()
+ hit.emit(body)
diff --git a/air_shot.tscn b/air_shot.tscn
new file mode 100644
index 0000000..0777453
--- /dev/null
+++ b/air_shot.tscn
@@ -0,0 +1,28 @@
+[gd_scene load_steps=5 format=3 uid="uid://c3nbnc688ygrc"]
+
+[ext_resource type="Texture2D" uid="uid://d0u6jw880abmk" path="res://Assets/Kirby/air-shot.png" id="1_s42hn"]
+[ext_resource type="Script" path="res://air_shot.gd" id="1_wqsc5"]
+[ext_resource type="AudioStream" uid="uid://fc5lm052l0ci" path="res://Assets/Sounds/air-shot.wav" id="3_7so2k"]
+
+[sub_resource type="CircleShape2D" id="CircleShape2D_vtlrr"]
+radius = 8.0
+
+[node name="AirShot" type="Area2D"]
+position = Vector2(40, 0)
+collision_layer = 8
+collision_mask = 518
+script = ExtResource("1_wqsc5")
+metadata/_edit_group_ = true
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+shape = SubResource("CircleShape2D_vtlrr")
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture_filter = 1
+texture = ExtResource("1_s42hn")
+
+[node name="Sound" type="AudioStreamPlayer" parent="."]
+stream = ExtResource("3_7so2k")
+
+[connection signal="area_entered" from="." to="." method="_on_area_entered"]
+[connection signal="body_entered" from="." to="." method="_on_body_entered"]
diff --git a/droppable_platform_02.tscn b/droppable_platform_02.tscn
new file mode 100644
index 0000000..ce4b46d
--- /dev/null
+++ b/droppable_platform_02.tscn
@@ -0,0 +1,16 @@
+[gd_scene load_steps=3 format=3 uid="uid://bhaksunbwbdmb"]
+
+[ext_resource type="PackedScene" uid="uid://cflnk0gcbspkt" path="res://Assets/Map/DroppablePlatform01.tscn" id="1_rv81x"]
+[ext_resource type="Texture2D" uid="uid://mcgvpb1lh3ve" path="res://Assets/Map/tileset.png" id="2_plvea"]
+
+[node name="DroppablePlatform02" instance=ExtResource("1_rv81x")]
+
+[node name="Sprite2D" parent="." index="0"]
+position = Vector2(-8, 0)
+
+[node name="Sprite2D2" type="Sprite2D" parent="." index="1"]
+texture_filter = 1
+position = Vector2(8, 0)
+texture = ExtResource("2_plvea")
+region_enabled = true
+region_rect = Rect2(91, 19, 16, 16)
diff --git a/green_greens.gd b/green_greens.gd
index 2f35176..d01bb90 100644
--- a/green_greens.gd
+++ b/green_greens.gd
@@ -11,12 +11,12 @@ func _ready() -> void:
SoundManager.play_background("GreenGreens")
if starting_position:
- player.visual_position = starting_position
+ player.global_position = starting_position
player.get_node("Camera2D").limit_top = $Wall.get_wall_limits().top
player.get_node("Camera2D").limit_bottom = $Wall.get_wall_limits().bottom
player.get_node("Camera2D").limit_left = $Wall.get_wall_limits().left
- #player.get_node("Camera2D").limit_right = $Wall.get_wall_limits().right
+ player.get_node("Camera2D").limit_right = $Wall.get_wall_limits().right
if fade_in_from_door:
player.current_state = player.state_exit_door()
@@ -31,11 +31,12 @@ func _ready() -> void:
)
-func _on_area_2d_body_entered(body: Node2D) -> void:
- if body is Player:
+func _on_area_2d_area_entered(area: Area2D) -> void:
+ if area.is_in_group("collision_area"):
SoundManager.fade_out(SoundManager.current_background)
Game.transition_to_scene("res://FloatIslandsIntro.tscn")
-func _on_area_2d_2_body_entered(_body: Node2D) -> void:
- Game.boss_initialized.emit(3)
- await get_tree().create_timer(1.0).timeout
- get_tree().current_scene.get_node("HUD").get_node("%BossHPBar").get_child(0).get_child(3-1).set_empty()
+func _on_area_2d_2_area_entered(area: Area2D) -> void:
+ if area.is_in_group("collision_area"):
+ Game.boss_initialized.emit(3)
+ await get_tree().create_timer(1.0).timeout
+ get_tree().current_scene.get_node("HUD").get_node("%BossHPBar").get_child(0).get_child(3-1).set_empty()
diff --git a/green_greens_indoor.gd b/green_greens_indoor.gd
new file mode 100644
index 0000000..4987577
--- /dev/null
+++ b/green_greens_indoor.gd
@@ -0,0 +1,31 @@
+extends Node2D
+
+
+@export var starting_position: Vector2
+@export var fade_in_from_door: bool = true
+
+@onready var player: Player = get_tree().get_first_node_in_group("player")
+
+
+func _ready() -> void:
+ SoundManager.play_background("GreenGreens")
+
+ if starting_position:
+ player.global_position = starting_position
+
+ player.get_node("Camera2D").limit_top = $Wall.get_wall_limits().top
+ player.get_node("Camera2D").limit_bottom = $Wall.get_wall_limits().bottom
+ player.get_node("Camera2D").limit_left = $Wall.get_wall_limits().left
+ player.get_node("Camera2D").limit_right = $Wall.get_wall_limits().right
+
+ if fade_in_from_door:
+ player.current_state = player.state_exit_door()
+ player.get_node("AnimatedSprite2D").self_modulate = Color(0,0,0,1)
+
+ var tween = get_tree().create_tween()
+ tween.tween_property(
+ player.get_node("AnimatedSprite2D"),
+ "self_modulate",
+ Color(1,1,1,1),
+ 0.3
+ )
diff --git a/hud.gd b/hud.gd
index 72d5b96..0efc33a 100644
--- a/hud.gd
+++ b/hud.gd
@@ -3,6 +3,7 @@ extends CanvasLayer
func _ready() -> void:
%Score.text = str(Game.score)
+ %Life.text = str(Game.player_state.life).pad_zeros(2)
Game.score_changed.connect(func():
%Score.text = str(Game.score)
diff --git a/player.gd b/player.gd
index 9a06615..6bbb038 100644
--- a/player.gd
+++ b/player.gd
@@ -6,7 +6,7 @@ signal hp_changed
signal inhale_finished
-const MAX_SPEED = 70.0
+const MAX_SPEED = 75.0
const ACCELERATION = MAX_SPEED * 0.1
const DECELERATION = ACCELERATION
const JUMP_VELOCITY = -200.0
@@ -39,8 +39,10 @@ var hp = max_hp :
set(value):
hp = clamp(value, 0, max_hp)
hp_changed.emit()
+ Game.player_state.hp = value
+var life = 4
+
var sprite_small_star_base: PackedScene
-var air_shot_base: Area2D
var star_shot_base: Area2D
var is_inhaling = false
@@ -75,13 +77,15 @@ var visual_global_position: Vector2 :
func _ready():
+ if Game.player_state.hp:
+ hp = Game.player_state.hp
+ if Game.player_state.life:
+ life = Game.player_state.life
+
current_state = state_idle()
sprite_small_star_base = preload("res://effect_star.tscn")
- air_shot_base = $AirShot.duplicate()
- $AirShot.queue_free()
-
star_shot_base = $StarShot.duplicate()
$StarShot.queue_free()
@@ -146,19 +150,14 @@ func spawn_small_star():
)
func air_shot(direction: float):
- var shot = air_shot_base.duplicate() as Area2D
+ var shot = preload("res://air_shot.tscn").instantiate() as Area2D
shot.global_position = visual_global_position
+ shot.direction = direction
get_tree().current_scene.add_child(shot)
- %SoundAirShot.play()
- shot.get_node("Sprite2D").flip_h = direction < 0
-
- var tween = get_tree().create_tween()
-
- var shot_hit = func(node):
+ shot.hit.connect(func(node):
Game.score += 400
%ShotObstacleHit.play()
- tween.stop()
if node.has_method("hit_by_projectile"):
node.hit_by_projectile(shot.global_position)
@@ -166,16 +165,9 @@ func air_shot(direction: float):
Game.hit_enemy(node, shot.global_position)
shot.queue_free()
- shot.body_entered.connect(shot_hit)
- shot.area_entered.connect(shot_hit)
+ )
- tween.tween_property(
- shot,
- "global_position",
- shot.global_position + Vector2(sign(direction) * 64, 0),
- 0.3
- ).set_ease(Tween.EASE_OUT)
- tween.tween_callback(func():
+ shot.end_of_life.connect(func():
await get_tree().create_timer(0.2).timeout
if is_instance_valid(shot):
shot.queue_free()
@@ -286,17 +278,43 @@ func wall_bounce_check():
#return false
-func _on_hurt_area_body_entered(body: Node2D) -> void:
- if body.is_in_group("enemy"):
+func on_hurt(node: Node2D):
+ if node.is_in_group("enemy"):
if is_invincible:
%ShotObstacleHit.play()
- body.queue_free()
+ node.queue_free()
else:
- current_state.id = "" # to force trigger state change into hurt
- current_state = state_hurt({"collider": body})
- elif body is TileMapLayer:
+ #current_state.id = "" # to force trigger state change into hurt # not needed anymore because of no double-hurt
+ current_state = state_hurt({
+ "collider": node,
+ "is_inflated": is_inflated,
+ "is_flying": is_flying,
+ })
+ elif node is TileMapLayer:
current_state = state_knockout()
+func _on_hurt_area_body_entered(body: Node2D) -> void:
+ on_hurt(body)
+
+func _on_hurt_area_area_entered(area: Area2D) -> void:
+ on_hurt(area)
+
+
+func _on_collision_area_area_entered(area: Area2D) -> void:
+ if area.is_in_group("object_heal"):
+ %SoundPickup.play()
+ area.visible = false
+
+ if hp == max_hp:
+ Game.score += 50
+ else:
+ for n in range(clamp(max_hp - hp, 0, area.heal_power)):
+ hp += 1
+ SoundManager.play_sound("BossHpFill")
+ await get_tree().create_timer(0.1).timeout
+
+ area.queue_free()
+
func _on_invincibility_timer_timeout() -> void:
stop_blink()
@@ -462,7 +480,10 @@ func state_bump():
"id": "bump",
"enter": func():
$AnimatedSprite2D.play("fall")
- velocity = Vector2(sign(last_direction), -1) * clamp(velocity.x * 1.5, MAX_SPEED * 0.75, MAX_SPEED)
+ velocity = (
+ Vector2(sign(last_direction), -1) *
+ clamp(velocity.x * 1.5, MAX_SPEED * 0.75, MAX_SPEED * 2)
+ )
,
"process": func(_delta):
move_and_slide()
@@ -484,11 +505,18 @@ func state_duck():
return {
"id": "duck",
"enter": func():
- $AnimatedSprite2D.play("duck")
+ $AnimationPlayer.play("duck")
,
"process": func(_delta):
if not Input.is_action_pressed("duck"):
current_state = state_idle()
+
+ var collision := get_last_slide_collision()
+ if collision:
+ var collider = collision.get_collider()
+ if collider.is_in_group("droppable_platforms"):
+ global_position.y += 1
+ current_state = state_fall()
,
"exit": func():
pass
@@ -823,10 +851,14 @@ func state_hurt(data):
else:
%SoundHurt.play()
- if is_inflated:
+ if previous_state.id.contains("exhale"):
+ $AnimationPlayer.play("jump")
+ elif previous_state.id.contains("inflated"):
$AnimatedSprite2D.play("inflated_jump")
+ elif previous_state.id.contains("fly"):
+ $AnimatedSprite2D.play("fly")
else:
- $AnimatedSprite2D.play("jump")
+ $AnimationPlayer.play("jump")
var impulse = sign(visual_global_position - data.collider.global_position) * HURT_VELOCITY
velocity.x = impulse.x
@@ -837,8 +869,12 @@ func state_hurt(data):
start_blink()
await get_tree().create_timer(0.4).timeout
- if is_inflated:
+ if previous_state.id.contains("exhale"):
+ current_state = state_idle()
+ elif previous_state.id.contains("inflated"):
current_state = state_inflated_idle()
+ elif previous_state.id.contains("fly"):
+ current_state = state_fly_idle()
else:
current_state = state_idle()
,
@@ -857,6 +893,7 @@ func state_wall_bounce(return_state):
"enter": func():
%SoundFall.play()
spawn_small_star()
+ $AnimatedSprite2D.position.x = 4 * last_direction # nudge into wall
$AnimationPlayer.play("wall_bounce")
await $AnimationPlayer.animation_finished
@@ -864,6 +901,20 @@ func state_wall_bounce(return_state):
,
"process": func(_delta):
move_and_slide()
+
+ if check_door_enter():
+ current_state = state_enter_door()
+ elif Input.is_action_just_pressed("jump"):
+ current_state = state_jump()
+
+ if not is_on_floor():
+ current_state = state_fall()
+
+ if Input.is_action_pressed("duck"):
+ current_state = state_duck()
+
+ if Input.is_action_just_pressed("inhale_exhale"):
+ current_state = state_inhale()
,
"exit": func():
pass
@@ -937,7 +988,7 @@ func state_enter_door():
"id": "enter_door",
"enter": func():
SoundManager.play_sound("EnterDoor")
- $AnimatedSprite2D.play("enter_door")
+ $AnimationPlayer.play("enter_door")
var tween = get_tree().create_tween()
tween.tween_property($AnimatedSprite2D, "self_modulate", Color(0,0,0,1), 0.3)
@@ -956,7 +1007,7 @@ func state_exit_door():
return {
"id": "exit_door",
"enter": func():
- $AnimatedSprite2D.play("exit_door")
+ $AnimationPlayer.play("exit_door")
await get_tree().create_timer(0.3).timeout
current_state = state_idle()
,
@@ -973,6 +1024,9 @@ func state_knockout():
return {
"id": "knockout",
"enter": func():
+ process_mode = PROCESS_MODE_ALWAYS
+ get_tree().paused = true
+
SoundManager.current_background.stop()
$AnimatedSprite2D.play("knockout")
@@ -1009,9 +1063,77 @@ func state_knockout():
%SoundKnockout.play()
await %SoundKnockout.finished
- Game.transition_to_scene(
- get_tree().current_scene.scene_file_path.replace(".tscn", "Intro.tscn")
+ var scene_path = get_tree().current_scene.scene_file_path
+ if scene_path.contains("Boss"):
+ scene_path = scene_path.replace("Boss.tscn", "Intro.tscn")
+ else:
+ scene_path = scene_path.replace(".tscn", "Intro.tscn")
+ Game.transition_to_scene(scene_path)
+
+ process_mode = PROCESS_MODE_INHERIT
+ get_tree().paused = false
+ ,
+ "process": func(_delta):
+ pass
+ ,
+ "exit": func():
+ pass
+ ,
+ }
+
+
+func state_win():
+ return {
+ "id": "win",
+ "enter": func():
+ process_mode = PROCESS_MODE_ALWAYS
+ get_tree().paused = true
+
+ SoundManager.current_background.stop()
+
+ $AnimatedSprite2D.play("knockout")
+ $AnimatedSprite2D.stop()
+ $AnimatedSprite2D.set_frame_and_progress(0, 0)
+
+ %SoundNoHp.play()
+ await %SoundNoHp.finished
+
+ $AnimatedSprite2D.play("knockout")
+ $Camera2D.drag_top_margin = 1.0
+ var tween = get_tree().create_tween()
+ var to_up_difference = visual_global_position.y - 16
+ var to_down_difference = visual_global_position.y + get_viewport_rect().size.y
+ tween.tween_property(
+ self,
+ "visual_global_position",
+ Vector2(
+ visual_global_position.x,
+ to_up_difference
+ ),
+ (to_up_difference / to_down_difference) * 1.0
)
+ tween.tween_property(
+ self,
+ "visual_global_position",
+ Vector2(
+ visual_global_position.x,
+ to_down_difference
+ ),
+ 1.0
+ )
+
+ %SoundKnockout.play()
+ await %SoundKnockout.finished
+
+ var scene_path = get_tree().current_scene.scene_file_path
+ if scene_path.contains("Boss"):
+ scene_path = scene_path.replace("Boss.tscn", "Intro.tscn")
+ else:
+ scene_path = scene_path.replace(".tscn", "Intro.tscn")
+ Game.transition_to_scene(scene_path)
+
+ process_mode = PROCESS_MODE_INHERIT
+ get_tree().paused = false
,
"process": func(_delta):
pass
diff --git a/project.godot b/project.godot
index 11d8326..d1c6207 100644
--- a/project.godot
+++ b/project.godot
@@ -30,6 +30,13 @@ window/size/viewport_width=160
window/size/viewport_height=144
window/stretch/mode="viewport"
+[file_customization]
+
+folder_colors={
+"res://Assets/": "yellow",
+"res://Objects/": "teal"
+}
+
[input]
duck={
@@ -74,6 +81,7 @@ up={
2d_physics/layer_7="Door"
2d_physics/layer_8="Water"
2d_physics/layer_10="Boss"
+2d_physics/layer_13="Platform"
[physics]
diff --git a/whispy_woods.gd b/whispy_woods.gd
index b5f4058..71fe5a4 100644
--- a/whispy_woods.gd
+++ b/whispy_woods.gd
@@ -17,20 +17,53 @@ func _process(_delta: float) -> void:
pass
+func blow_wind():
+ $BlinkTimer.paused = true
+
+ for i in range(3):
+ $Mouth.play("mouth_shoot")
+
+ var shot = preload("res://air_shot.tscn").instantiate() as Area2D
+ shot.global_position = $Mouth.global_position + Vector2(0, randi() % 8)
+ shot.direction = -1
+ shot.collision_layer = 0
+ shot.set_collision_layer_value(2, true)
+ shot.set_collision_layer_value(10, true)
+ shot.collision_mask = 0
+ shot.set_collision_mask_value(1, true)
+ shot.add_to_group("enemy")
+ get_tree().current_scene.add_child(shot)
+ shot.hit.connect(func(_node):
+ if is_instance_valid(shot):
+ shot.queue_free()
+ )
+ shot.end_of_life.connect(func():
+ await get_tree().create_timer(0.2).timeout
+ if is_instance_valid(shot):
+ shot.queue_free()
+ )
+
+ await get_tree().create_timer(0.25).timeout
+ $Mouth.play("hole_idle")
+ await get_tree().create_timer(0.25).timeout
+
+ $BlinkTimer.paused = false
+
+
func hit_by_projectile(hit_position: Vector2):
var effect_star_scene := preload("res://effect_star.tscn")
for direction in [Vector2(1, 1), Vector2(1, -1), Vector2(-1, -1), Vector2(-1, 1)]:
var effect_star := effect_star_scene.instantiate()
effect_star.global_position = hit_position
get_tree().current_scene.add_child(effect_star)
- var tween := get_tree().create_tween()
- tween.tween_property(
+ var effect_tween := get_tree().create_tween()
+ effect_tween.tween_property(
effect_star,
"global_position",
effect_star.global_position + direction * 16,
0.1
)
- tween.tween_callback(func():
+ effect_tween.tween_callback(func():
effect_star.queue_free()
)
@@ -38,8 +71,8 @@ func hit_by_projectile(hit_position: Vector2):
hp -= 1
+ $EyeLeft.play("eye_closed")
$EyeRight.play("eye_closed")
- $Mouth.play("eye_closed")
$Tear.visible = true
var tween = get_tree().create_tween()
tween.tween_property(self, "modulate", Color(1, 1, 1, 0.2), 0.1)
@@ -50,9 +83,19 @@ func hit_by_projectile(hit_position: Vector2):
if hp > 0:
tween.tween_callback(func():
modulate = Color(1, 1, 1, 1.0)
- $EyeRight.play("eye_open")
- $Mouth.play("mouth_idle")
+ $EyeLeft.play("hole_idle")
+ $EyeRight.play("hole_idle")
$Tear.visible = false
)
elif hp <= 0:
Game.boss_defeated.emit()
+
+
+func _on_blink_timer_timeout() -> void:
+ $EyeLeft.play("blink")
+ $EyeRight.play("blink")
+ await $EyeRight.animation_finished
+ $EyeLeft.play("hole_idle")
+ $EyeRight.play("hole_idle")
+
+ blow_wind()
diff --git a/whispy_woods_sprite_frames.tres b/whispy_woods_sprite_frames.tres
index 4886a71..99d610d 100644
--- a/whispy_woods_sprite_frames.tres
+++ b/whispy_woods_sprite_frames.tres
@@ -9,33 +9,39 @@
animations = [{
"frames": [{
"duration": 1.0,
+"texture": ExtResource("2_g2etd")
+}, {
+"duration": 1.0,
"texture": ExtResource("1_yjx1b")
+}, {
+"duration": 1.0,
+"texture": ExtResource("2_g2etd")
}],
"loop": false,
-"name": &"eye_closed",
-"speed": 5.0
+"name": &"blink",
+"speed": 8.0
}, {
"frames": [{
"duration": 1.0,
-"texture": ExtResource("2_g2etd")
+"texture": ExtResource("1_yjx1b")
}],
"loop": false,
-"name": &"eye_open",
-"speed": 5.0
+"name": &"eye_closed",
+"speed": 4.0
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("3_xrihg")
}],
"loop": false,
-"name": &"mouth_idle",
-"speed": 5.0
+"name": &"hole_idle",
+"speed": 4.0
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("4_53nbh")
}],
-"loop": true,
+"loop": false,
"name": &"mouth_shoot",
-"speed": 5.0
+"speed": 4.0
}]