summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Assets/Enemies/boss-sprites.pngbin0 -> 23401 bytes
-rw-r--r--Assets/Enemies/boss-sprites.png.import34
-rw-r--r--Assets/Enemies/green-greens-boss.pngbin0 -> 2933 bytes
-rw-r--r--Assets/Enemies/green-greens-boss.png.import34
-rw-r--r--Assets/Enemies/whispy-woods-eye-01.pngbin0 -> 197 bytes
-rw-r--r--Assets/Enemies/whispy-woods-eye-01.png.import34
-rw-r--r--Assets/Enemies/whispy-woods-eye-01.png~bin0 -> 188 bytes
-rw-r--r--Assets/Enemies/whispy-woods-eye-02.pngbin0 -> 118 bytes
-rw-r--r--Assets/Enemies/whispy-woods-eye-02.png.import34
-rw-r--r--Assets/Enemies/whispy-woods-mouth-01.pngbin0 -> 188 bytes
-rw-r--r--Assets/Enemies/whispy-woods-mouth-01.png.import34
-rw-r--r--Assets/Enemies/whispy-woods-mouth-02.pngbin0 -> 192 bytes
-rw-r--r--Assets/Enemies/whispy-woods-mouth-02.png.import34
-rw-r--r--Assets/Enemies/whispy-woods-mouth-02.png~bin0 -> 191 bytes
-rw-r--r--Assets/Enemies/whispy-woods-tear.pngbin0 -> 200 bytes
-rw-r--r--Assets/Enemies/whispy-woods-tear.png.import34
-rw-r--r--Assets/HUD/boss-hp-empty.pngbin0 -> 148 bytes
-rw-r--r--Assets/HUD/boss-hp-empty.png.import34
-rw-r--r--Assets/HUD/boss-hp-empty.png~bin0 -> 143 bytes
-rw-r--r--Assets/HUD/boss.pngbin0 -> 143 bytes
-rw-r--r--Assets/HUD/boss.png.import34
-rw-r--r--Assets/HUD/hp-empty.pngbin0 -> 143 bytes
-rw-r--r--Assets/HUD/hp-empty.png.import34
-rw-r--r--Assets/HUD/hp-empty.png~bin0 -> 140 bytes
-rw-r--r--Assets/HUD/theme.tres8
-rw-r--r--Assets/Kirby/air-shot.png (renamed from Assets/Kirby/air-shoot.png)bin270 -> 270 bytes
-rw-r--r--Assets/Kirby/air-shot.png.import (renamed from Assets/Kirby/air-shoot.png.import)6
-rw-r--r--Assets/Kirby/dance-sheet.pngbin0 -> 948 bytes
-rw-r--r--Assets/Kirby/dance-sheet.png.import34
-rw-r--r--Assets/Kirby/fly-01.pngbin398 -> 408 bytes
-rw-r--r--Assets/Kirby/fly-01.png~bin0 -> 400 bytes
-rw-r--r--Assets/Kirby/fly-02.png~bin0 -> 388 bytes
-rw-r--r--Assets/Kirby/fly-exhale-01.pngbin0 -> 387 bytes
-rw-r--r--Assets/Kirby/fly-exhale-01.png.import34
-rw-r--r--Assets/Kirby/fly-exhale-02.pngbin0 -> 330 bytes
-rw-r--r--Assets/Kirby/fly-exhale-02.png.import34
-rw-r--r--Assets/Kirby/fly-transition-01.pngbin0 -> 317 bytes
-rw-r--r--Assets/Kirby/fly-transition-01.png.import34
-rw-r--r--Assets/Kirby/fly-transition-02.pngbin0 -> 393 bytes
-rw-r--r--Assets/Kirby/fly-transition-02.png.import34
-rw-r--r--Assets/Kirby/inflated-exhale-01.pngbin0 -> 409 bytes
-rw-r--r--Assets/Kirby/inflated-exhale-01.png.import34
-rw-r--r--Assets/Kirby/inflated-exhale-02.pngbin0 -> 339 bytes
-rw-r--r--Assets/Kirby/inflated-exhale-02.png.import34
-rw-r--r--Assets/Kirby/inflated-exhale-02.png~bin0 -> 339 bytes
-rw-r--r--Assets/Kirby/inflated-transition-01.pngbin0 -> 409 bytes
-rw-r--r--Assets/Kirby/inflated-transition-01.png.import34
-rw-r--r--Assets/Kirby/inflated-transition-02.pngbin0 -> 408 bytes
-rw-r--r--Assets/Kirby/inflated-transition-02.png.import34
-rw-r--r--Assets/Kirby/knockout-1.png (renamed from Assets/Kirby/ko-1.png)bin298 -> 298 bytes
-rw-r--r--Assets/Kirby/knockout-1.png.import (renamed from Assets/Kirby/ko-1.png.import)6
-rw-r--r--Assets/Kirby/knockout-2.png (renamed from Assets/Kirby/ko-2.png)bin302 -> 302 bytes
-rw-r--r--Assets/Kirby/knockout-2.png.import (renamed from Assets/Kirby/ko-2.png.import)6
-rw-r--r--Assets/Kirby/knockout-3.png (renamed from Assets/Kirby/ko-3.png)bin293 -> 293 bytes
-rw-r--r--Assets/Kirby/knockout-3.png.import (renamed from Assets/Kirby/ko-3.png.import)6
-rw-r--r--Assets/Kirby/knockout-4.png (renamed from Assets/Kirby/ko-4.png)bin297 -> 297 bytes
-rw-r--r--Assets/Kirby/knockout-4.png.import (renamed from Assets/Kirby/ko-4.png.import)6
-rw-r--r--Assets/Kirby/wall-bounce.pngbin0 -> 238 bytes
-rw-r--r--Assets/Kirby/wall-bounce.png.import34
-rw-r--r--Assets/Map/TileMapLayer.tscn31
-rw-r--r--Assets/Map/tile_map_layer.gd2
-rw-r--r--Assets/Map/tileset.pngbin38805 -> 40520 bytes
-rw-r--r--Assets/Map/tileset.png~bin38849 -> 40529 bytes
-rw-r--r--Assets/Music/Boss.wavbin0 -> 14825070 bytes
-rw-r--r--Assets/Music/Boss.wav.import24
-rw-r--r--Assets/Music/Win.wavbin0 -> 1234878 bytes
-rw-r--r--Assets/Music/Win.wav.import24
-rw-r--r--Assets/Music/knockout.wav (renamed from Assets/Music/ko.wav)bin495694 -> 495694 bytes
-rw-r--r--Assets/Music/knockout.wav.import (renamed from Assets/Music/ko.wav.import)6
-rw-r--r--Assets/Sounds/boss-hp-fill.wavbin0 -> 32558 bytes
-rw-r--r--Assets/Sounds/boss-hp-fill.wav.import24
-rw-r--r--BossHP.tscn29
-rw-r--r--BossHPBar.tscn26
-rw-r--r--Enemies/Enemy.tscn8
-rw-r--r--Enemies/enemy.gd50
-rw-r--r--FloatIslands.tscn33
-rw-r--r--FloatIslandsIntro.tscn21
-rw-r--r--Game.gd11
-rw-r--r--GreenGreens.tscn26
-rw-r--r--GreenGreensBoss.tscn88
-rw-r--r--GreenGreensIntro.tscn22
-rw-r--r--HP.tscn20
-rw-r--r--HUD.tscn55
-rw-r--r--KnockoutPlane.tscn (renamed from KOPlane.tscn)4
-rw-r--r--Player.tscn1074
-rw-r--r--SoundManager.gd2
-rw-r--r--SoundManager.tscn20
-rw-r--r--boss_hp.gd10
-rw-r--r--boss_hp_bar.gd26
-rw-r--r--effect_star.tscn8
-rw-r--r--float_islands.gd5
-rw-r--r--green_greens.gd6
-rw-r--r--green_greens_boss.gd37
-rw-r--r--hud.gd10
-rw-r--r--icon_monochrome_light.svg1
-rw-r--r--icon_monochrome_light.svg.import37
-rw-r--r--knockout_plane.gd (renamed from ko_plane.gd)0
-rw-r--r--navigation_shape.tres4
-rw-r--r--player.gd464
-rw-r--r--project.godot7
-rw-r--r--whispy_woods.gd58
-rw-r--r--whispy_woods_sprite_frames.tres41
102 files changed, 2824 insertions, 208 deletions
diff --git a/Assets/Enemies/boss-sprites.png b/Assets/Enemies/boss-sprites.png
new file mode 100644
index 0000000..c064d5a
--- /dev/null
+++ b/Assets/Enemies/boss-sprites.png
Binary files differ
diff --git a/Assets/Enemies/boss-sprites.png.import b/Assets/Enemies/boss-sprites.png.import
new file mode 100644
index 0000000..a68b5bf
--- /dev/null
+++ b/Assets/Enemies/boss-sprites.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bu0hhuow58mry"
+path="res://.godot/imported/boss-sprites.png-91f8720c14cab410aa1393e5cf9bcc5a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/boss-sprites.png"
+dest_files=["res://.godot/imported/boss-sprites.png-91f8720c14cab410aa1393e5cf9bcc5a.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/green-greens-boss.png b/Assets/Enemies/green-greens-boss.png
new file mode 100644
index 0000000..dd656b1
--- /dev/null
+++ b/Assets/Enemies/green-greens-boss.png
Binary files differ
diff --git a/Assets/Enemies/green-greens-boss.png.import b/Assets/Enemies/green-greens-boss.png.import
new file mode 100644
index 0000000..c40330b
--- /dev/null
+++ b/Assets/Enemies/green-greens-boss.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://xdehc2ineqjf"
+path="res://.godot/imported/green-greens-boss.png-b861223020f2d523e178617b807476da.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/green-greens-boss.png"
+dest_files=["res://.godot/imported/green-greens-boss.png-b861223020f2d523e178617b807476da.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/whispy-woods-eye-01.png b/Assets/Enemies/whispy-woods-eye-01.png
new file mode 100644
index 0000000..7b6addd
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-eye-01.png
Binary files differ
diff --git a/Assets/Enemies/whispy-woods-eye-01.png.import b/Assets/Enemies/whispy-woods-eye-01.png.import
new file mode 100644
index 0000000..c94bb47
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-eye-01.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bpr1plfnw77fh"
+path="res://.godot/imported/whispy-woods-eye-01.png-42c1c7b4622d93a9af1586370062b18d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/whispy-woods-eye-01.png"
+dest_files=["res://.godot/imported/whispy-woods-eye-01.png-42c1c7b4622d93a9af1586370062b18d.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/whispy-woods-eye-01.png~ b/Assets/Enemies/whispy-woods-eye-01.png~
new file mode 100644
index 0000000..54f78bc
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-eye-01.png~
Binary files differ
diff --git a/Assets/Enemies/whispy-woods-eye-02.png b/Assets/Enemies/whispy-woods-eye-02.png
new file mode 100644
index 0000000..72327fb
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-eye-02.png
Binary files differ
diff --git a/Assets/Enemies/whispy-woods-eye-02.png.import b/Assets/Enemies/whispy-woods-eye-02.png.import
new file mode 100644
index 0000000..a374882
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-eye-02.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://duscdq6p858dt"
+path="res://.godot/imported/whispy-woods-eye-02.png-4c5b97c7f9d2dcb91e987e146ce25e44.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/whispy-woods-eye-02.png"
+dest_files=["res://.godot/imported/whispy-woods-eye-02.png-4c5b97c7f9d2dcb91e987e146ce25e44.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/whispy-woods-mouth-01.png b/Assets/Enemies/whispy-woods-mouth-01.png
new file mode 100644
index 0000000..eb44269
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-mouth-01.png
Binary files differ
diff --git a/Assets/Enemies/whispy-woods-mouth-01.png.import b/Assets/Enemies/whispy-woods-mouth-01.png.import
new file mode 100644
index 0000000..1ea0185
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-mouth-01.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c547eyj1dga2p"
+path="res://.godot/imported/whispy-woods-mouth-01.png-0318194c3a3707a6f19976b909d76f16.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/whispy-woods-mouth-01.png"
+dest_files=["res://.godot/imported/whispy-woods-mouth-01.png-0318194c3a3707a6f19976b909d76f16.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/whispy-woods-mouth-02.png b/Assets/Enemies/whispy-woods-mouth-02.png
new file mode 100644
index 0000000..ff37653
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-mouth-02.png
Binary files differ
diff --git a/Assets/Enemies/whispy-woods-mouth-02.png.import b/Assets/Enemies/whispy-woods-mouth-02.png.import
new file mode 100644
index 0000000..586fe9b
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-mouth-02.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://qxh5qqh8oso"
+path="res://.godot/imported/whispy-woods-mouth-02.png-3ab315a0e9441ead1438bfc3220b7269.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/whispy-woods-mouth-02.png"
+dest_files=["res://.godot/imported/whispy-woods-mouth-02.png-3ab315a0e9441ead1438bfc3220b7269.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/whispy-woods-mouth-02.png~ b/Assets/Enemies/whispy-woods-mouth-02.png~
new file mode 100644
index 0000000..88285d8
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-mouth-02.png~
Binary files differ
diff --git a/Assets/Enemies/whispy-woods-tear.png b/Assets/Enemies/whispy-woods-tear.png
new file mode 100644
index 0000000..4c34f78
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-tear.png
Binary files differ
diff --git a/Assets/Enemies/whispy-woods-tear.png.import b/Assets/Enemies/whispy-woods-tear.png.import
new file mode 100644
index 0000000..3a7bba7
--- /dev/null
+++ b/Assets/Enemies/whispy-woods-tear.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cr8mi3iehl3q2"
+path="res://.godot/imported/whispy-woods-tear.png-06e392265974c90c220423e1c1d683a5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Enemies/whispy-woods-tear.png"
+dest_files=["res://.godot/imported/whispy-woods-tear.png-06e392265974c90c220423e1c1d683a5.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/HUD/boss-hp-empty.png b/Assets/HUD/boss-hp-empty.png
new file mode 100644
index 0000000..8021502
--- /dev/null
+++ b/Assets/HUD/boss-hp-empty.png
Binary files differ
diff --git a/Assets/HUD/boss-hp-empty.png.import b/Assets/HUD/boss-hp-empty.png.import
new file mode 100644
index 0000000..4ad0fb0
--- /dev/null
+++ b/Assets/HUD/boss-hp-empty.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b2xjcvm2xycud"
+path="res://.godot/imported/boss-hp-empty.png-9360cb3cedb169f761b095ffd3707a35.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/HUD/boss-hp-empty.png"
+dest_files=["res://.godot/imported/boss-hp-empty.png-9360cb3cedb169f761b095ffd3707a35.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/HUD/boss-hp-empty.png~ b/Assets/HUD/boss-hp-empty.png~
new file mode 100644
index 0000000..f587ff9
--- /dev/null
+++ b/Assets/HUD/boss-hp-empty.png~
Binary files differ
diff --git a/Assets/HUD/boss.png b/Assets/HUD/boss.png
new file mode 100644
index 0000000..6d6fc88
--- /dev/null
+++ b/Assets/HUD/boss.png
Binary files differ
diff --git a/Assets/HUD/boss.png.import b/Assets/HUD/boss.png.import
new file mode 100644
index 0000000..6f80d0f
--- /dev/null
+++ b/Assets/HUD/boss.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bmvik2d2p8vqp"
+path="res://.godot/imported/boss.png-f8734c4ed3bbf21bb316553c5fda6ef4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/HUD/boss.png"
+dest_files=["res://.godot/imported/boss.png-f8734c4ed3bbf21bb316553c5fda6ef4.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/HUD/hp-empty.png b/Assets/HUD/hp-empty.png
new file mode 100644
index 0000000..28f0725
--- /dev/null
+++ b/Assets/HUD/hp-empty.png
Binary files differ
diff --git a/Assets/HUD/hp-empty.png.import b/Assets/HUD/hp-empty.png.import
new file mode 100644
index 0000000..38196b9
--- /dev/null
+++ b/Assets/HUD/hp-empty.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dqy7sy62yms28"
+path="res://.godot/imported/hp-empty.png-d9909810dc65b7319cfa3655afda5062.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/HUD/hp-empty.png"
+dest_files=["res://.godot/imported/hp-empty.png-d9909810dc65b7319cfa3655afda5062.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/HUD/hp-empty.png~ b/Assets/HUD/hp-empty.png~
new file mode 100644
index 0000000..1a0548a
--- /dev/null
+++ b/Assets/HUD/hp-empty.png~
Binary files differ
diff --git a/Assets/HUD/theme.tres b/Assets/HUD/theme.tres
new file mode 100644
index 0000000..4975282
--- /dev/null
+++ b/Assets/HUD/theme.tres
@@ -0,0 +1,8 @@
+[gd_resource type="Theme" load_steps=2 format=3 uid="uid://c1jnbt5h4hwmi"]
+
+[ext_resource type="FontFile" uid="uid://cskj32qqejbjx" path="res://Assets/HUD/Minimal5x5Monospaced.ttf" id="1_tb5hy"]
+
+[resource]
+Label/colors/font_color = Color(0, 0, 0, 1)
+Label/font_sizes/font_size = 8
+Label/fonts/font = ExtResource("1_tb5hy")
diff --git a/Assets/Kirby/air-shoot.png b/Assets/Kirby/air-shot.png
index e31cd27..e31cd27 100644
--- a/Assets/Kirby/air-shoot.png
+++ b/Assets/Kirby/air-shot.png
Binary files differ
diff --git a/Assets/Kirby/air-shoot.png.import b/Assets/Kirby/air-shot.png.import
index 3ca6aa9..37ad3dc 100644
--- a/Assets/Kirby/air-shoot.png.import
+++ b/Assets/Kirby/air-shot.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://d0u6jw880abmk"
-path="res://.godot/imported/air-shoot.png-970d544e65cd5a117d9cb44ce25eeb37.ctex"
+path="res://.godot/imported/air-shot.png-6b12381f57487ca253a6a5e5b996d553.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://Assets/Kirby/air-shoot.png"
-dest_files=["res://.godot/imported/air-shoot.png-970d544e65cd5a117d9cb44ce25eeb37.ctex"]
+source_file="res://Assets/Kirby/air-shot.png"
+dest_files=["res://.godot/imported/air-shot.png-6b12381f57487ca253a6a5e5b996d553.ctex"]
[params]
diff --git a/Assets/Kirby/dance-sheet.png b/Assets/Kirby/dance-sheet.png
new file mode 100644
index 0000000..83dae61
--- /dev/null
+++ b/Assets/Kirby/dance-sheet.png
Binary files differ
diff --git a/Assets/Kirby/dance-sheet.png.import b/Assets/Kirby/dance-sheet.png.import
new file mode 100644
index 0000000..3123ca4
--- /dev/null
+++ b/Assets/Kirby/dance-sheet.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://budrft8xewca8"
+path="res://.godot/imported/dance-sheet.png-71fc22a15cbba5547e9fc5672e07855c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Kirby/dance-sheet.png"
+dest_files=["res://.godot/imported/dance-sheet.png-71fc22a15cbba5547e9fc5672e07855c.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/Kirby/fly-01.png b/Assets/Kirby/fly-01.png
index 6f8d184..ba57b30 100644
--- a/Assets/Kirby/fly-01.png
+++ b/Assets/Kirby/fly-01.png
Binary files differ
diff --git a/Assets/Kirby/fly-01.png~ b/Assets/Kirby/fly-01.png~
new file mode 100644
index 0000000..37e7128
--- /dev/null
+++ b/Assets/Kirby/fly-01.png~
Binary files differ
diff --git a/Assets/Kirby/fly-02.png~ b/Assets/Kirby/fly-02.png~
new file mode 100644
index 0000000..3fab159
--- /dev/null
+++ b/Assets/Kirby/fly-02.png~
Binary files differ
diff --git a/Assets/Kirby/fly-exhale-01.png b/Assets/Kirby/fly-exhale-01.png
new file mode 100644
index 0000000..6b0393f
--- /dev/null
+++ b/Assets/Kirby/fly-exhale-01.png
Binary files differ
diff --git a/Assets/Kirby/fly-exhale-01.png.import b/Assets/Kirby/fly-exhale-01.png.import
new file mode 100644
index 0000000..e6b82f8
--- /dev/null
+++ b/Assets/Kirby/fly-exhale-01.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cvxxfk1qgqcti"
+path="res://.godot/imported/fly-exhale-01.png-6efd611f427624ff2b4f323987ca9907.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Kirby/fly-exhale-01.png"
+dest_files=["res://.godot/imported/fly-exhale-01.png-6efd611f427624ff2b4f323987ca9907.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/Kirby/fly-exhale-02.png b/Assets/Kirby/fly-exhale-02.png
new file mode 100644
index 0000000..13fd35c
--- /dev/null
+++ b/Assets/Kirby/fly-exhale-02.png
Binary files differ
diff --git a/Assets/Kirby/fly-exhale-02.png.import b/Assets/Kirby/fly-exhale-02.png.import
new file mode 100644
index 0000000..978d5e6
--- /dev/null
+++ b/Assets/Kirby/fly-exhale-02.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b6ilregfg6lf5"
+path="res://.godot/imported/fly-exhale-02.png-1f3323576b3799feae34e3fa90ae8e69.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Kirby/fly-exhale-02.png"
+dest_files=["res://.godot/imported/fly-exhale-02.png-1f3323576b3799feae34e3fa90ae8e69.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/Kirby/fly-transition-01.png b/Assets/Kirby/fly-transition-01.png
new file mode 100644
index 0000000..3828cf2
--- /dev/null
+++ b/Assets/Kirby/fly-transition-01.png
Binary files differ
diff --git a/Assets/Kirby/fly-transition-01.png.import b/Assets/Kirby/fly-transition-01.png.import
new file mode 100644
index 0000000..1d9652e
--- /dev/null
+++ b/Assets/Kirby/fly-transition-01.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dlmfgtkfe8s8k"
+path="res://.godot/imported/fly-transition-01.png-285498532af2f57e69c1f8b9328f02ea.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Kirby/fly-transition-01.png"
+dest_files=["res://.godot/imported/fly-transition-01.png-285498532af2f57e69c1f8b9328f02ea.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/Kirby/fly-transition-02.png b/Assets/Kirby/fly-transition-02.png
new file mode 100644
index 0000000..8063b4c
--- /dev/null
+++ b/Assets/Kirby/fly-transition-02.png
Binary files differ
diff --git a/Assets/Kirby/fly-transition-02.png.import b/Assets/Kirby/fly-transition-02.png.import
new file mode 100644
index 0000000..b6c61a9
--- /dev/null
+++ b/Assets/Kirby/fly-transition-02.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b22slkovd4hsg"
+path="res://.godot/imported/fly-transition-02.png-88339afa2f110732d7737bfdf6a5e6d4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Kirby/fly-transition-02.png"
+dest_files=["res://.godot/imported/fly-transition-02.png-88339afa2f110732d7737bfdf6a5e6d4.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/Kirby/inflated-exhale-01.png b/Assets/Kirby/inflated-exhale-01.png
new file mode 100644
index 0000000..8b5cfca
--- /dev/null
+++ b/Assets/Kirby/inflated-exhale-01.png
Binary files differ
diff --git a/Assets/Kirby/inflated-exhale-01.png.import b/Assets/Kirby/inflated-exhale-01.png.import
new file mode 100644
index 0000000..05b584c
--- /dev/null
+++ b/Assets/Kirby/inflated-exhale-01.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bdbp68mhgo5xb"
+path="res://.godot/imported/inflated-exhale-01.png-285e965c65533109badc1b0c97aeda3b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Kirby/inflated-exhale-01.png"
+dest_files=["res://.godot/imported/inflated-exhale-01.png-285e965c65533109badc1b0c97aeda3b.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/Kirby/inflated-exhale-02.png b/Assets/Kirby/inflated-exhale-02.png
new file mode 100644
index 0000000..77dc3ed
--- /dev/null
+++ b/Assets/Kirby/inflated-exhale-02.png
Binary files differ
diff --git a/Assets/Kirby/inflated-exhale-02.png.import b/Assets/Kirby/inflated-exhale-02.png.import
new file mode 100644
index 0000000..f7b5dd0
--- /dev/null
+++ b/Assets/Kirby/inflated-exhale-02.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c6yy67c1dd07v"
+path="res://.godot/imported/inflated-exhale-02.png-0bdac79f272f4cbbd14c16b04553bc41.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Kirby/inflated-exhale-02.png"
+dest_files=["res://.godot/imported/inflated-exhale-02.png-0bdac79f272f4cbbd14c16b04553bc41.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/Kirby/inflated-exhale-02.png~ b/Assets/Kirby/inflated-exhale-02.png~
new file mode 100644
index 0000000..77dc3ed
--- /dev/null
+++ b/Assets/Kirby/inflated-exhale-02.png~
Binary files differ
diff --git a/Assets/Kirby/inflated-transition-01.png b/Assets/Kirby/inflated-transition-01.png
new file mode 100644
index 0000000..8b5cfca
--- /dev/null
+++ b/Assets/Kirby/inflated-transition-01.png
Binary files differ
diff --git a/Assets/Kirby/inflated-transition-01.png.import b/Assets/Kirby/inflated-transition-01.png.import
new file mode 100644
index 0000000..7c99a18
--- /dev/null
+++ b/Assets/Kirby/inflated-transition-01.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bwqkqa0sfkq83"
+path="res://.godot/imported/inflated-transition-01.png-2be116190033a1a83f1b3502c19034de.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Kirby/inflated-transition-01.png"
+dest_files=["res://.godot/imported/inflated-transition-01.png-2be116190033a1a83f1b3502c19034de.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/Kirby/inflated-transition-02.png b/Assets/Kirby/inflated-transition-02.png
new file mode 100644
index 0000000..3c1df50
--- /dev/null
+++ b/Assets/Kirby/inflated-transition-02.png
Binary files differ
diff --git a/Assets/Kirby/inflated-transition-02.png.import b/Assets/Kirby/inflated-transition-02.png.import
new file mode 100644
index 0000000..ac9b478
--- /dev/null
+++ b/Assets/Kirby/inflated-transition-02.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://du6cfirv2pq7i"
+path="res://.godot/imported/inflated-transition-02.png-88c5c096e3fc1a90ff5fd5a465caf595.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Kirby/inflated-transition-02.png"
+dest_files=["res://.godot/imported/inflated-transition-02.png-88c5c096e3fc1a90ff5fd5a465caf595.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/Kirby/ko-1.png b/Assets/Kirby/knockout-1.png
index a0a867a..a0a867a 100644
--- a/Assets/Kirby/ko-1.png
+++ b/Assets/Kirby/knockout-1.png
Binary files differ
diff --git a/Assets/Kirby/ko-1.png.import b/Assets/Kirby/knockout-1.png.import
index 267fcb9..c718866 100644
--- a/Assets/Kirby/ko-1.png.import
+++ b/Assets/Kirby/knockout-1.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://beg36twmvwket"
-path="res://.godot/imported/ko-1.png-257bb9f5acd9c8174aa62dfe6ac581cf.ctex"
+path="res://.godot/imported/knockout-1.png-5fe96d37903772f3af7c78cdb943fcb0.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://Assets/Kirby/ko-1.png"
-dest_files=["res://.godot/imported/ko-1.png-257bb9f5acd9c8174aa62dfe6ac581cf.ctex"]
+source_file="res://Assets/Kirby/knockout-1.png"
+dest_files=["res://.godot/imported/knockout-1.png-5fe96d37903772f3af7c78cdb943fcb0.ctex"]
[params]
diff --git a/Assets/Kirby/ko-2.png b/Assets/Kirby/knockout-2.png
index 00cec39..00cec39 100644
--- a/Assets/Kirby/ko-2.png
+++ b/Assets/Kirby/knockout-2.png
Binary files differ
diff --git a/Assets/Kirby/ko-2.png.import b/Assets/Kirby/knockout-2.png.import
index b25d1f5..d1b148e 100644
--- a/Assets/Kirby/ko-2.png.import
+++ b/Assets/Kirby/knockout-2.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://c5qsow60trggu"
-path="res://.godot/imported/ko-2.png-472030235b439942fc453eaf63ed1309.ctex"
+path="res://.godot/imported/knockout-2.png-eed145f5d4a83327eee36d1973f3bf43.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://Assets/Kirby/ko-2.png"
-dest_files=["res://.godot/imported/ko-2.png-472030235b439942fc453eaf63ed1309.ctex"]
+source_file="res://Assets/Kirby/knockout-2.png"
+dest_files=["res://.godot/imported/knockout-2.png-eed145f5d4a83327eee36d1973f3bf43.ctex"]
[params]
diff --git a/Assets/Kirby/ko-3.png b/Assets/Kirby/knockout-3.png
index 6ba6878..6ba6878 100644
--- a/Assets/Kirby/ko-3.png
+++ b/Assets/Kirby/knockout-3.png
Binary files differ
diff --git a/Assets/Kirby/ko-3.png.import b/Assets/Kirby/knockout-3.png.import
index 3e52507..2b76330 100644
--- a/Assets/Kirby/ko-3.png.import
+++ b/Assets/Kirby/knockout-3.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b2smrgiobqc24"
-path="res://.godot/imported/ko-3.png-d343cbb2d16a1d4a91921d80c02317b7.ctex"
+path="res://.godot/imported/knockout-3.png-7372d5b3d1122fbec888dfc007df3c62.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://Assets/Kirby/ko-3.png"
-dest_files=["res://.godot/imported/ko-3.png-d343cbb2d16a1d4a91921d80c02317b7.ctex"]
+source_file="res://Assets/Kirby/knockout-3.png"
+dest_files=["res://.godot/imported/knockout-3.png-7372d5b3d1122fbec888dfc007df3c62.ctex"]
[params]
diff --git a/Assets/Kirby/ko-4.png b/Assets/Kirby/knockout-4.png
index fda6160..fda6160 100644
--- a/Assets/Kirby/ko-4.png
+++ b/Assets/Kirby/knockout-4.png
Binary files differ
diff --git a/Assets/Kirby/ko-4.png.import b/Assets/Kirby/knockout-4.png.import
index 7c7afc4..f9dfb2d 100644
--- a/Assets/Kirby/ko-4.png.import
+++ b/Assets/Kirby/knockout-4.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://dwnmiim6wpj3h"
-path="res://.godot/imported/ko-4.png-4e4251da2de6fbc3f0a2f8967faf40d7.ctex"
+path="res://.godot/imported/knockout-4.png-c9a732b68b5b7b781fe3a5eb9562bc9c.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://Assets/Kirby/ko-4.png"
-dest_files=["res://.godot/imported/ko-4.png-4e4251da2de6fbc3f0a2f8967faf40d7.ctex"]
+source_file="res://Assets/Kirby/knockout-4.png"
+dest_files=["res://.godot/imported/knockout-4.png-c9a732b68b5b7b781fe3a5eb9562bc9c.ctex"]
[params]
diff --git a/Assets/Kirby/wall-bounce.png b/Assets/Kirby/wall-bounce.png
new file mode 100644
index 0000000..8f0f7f6
--- /dev/null
+++ b/Assets/Kirby/wall-bounce.png
Binary files differ
diff --git a/Assets/Kirby/wall-bounce.png.import b/Assets/Kirby/wall-bounce.png.import
new file mode 100644
index 0000000..03c561e
--- /dev/null
+++ b/Assets/Kirby/wall-bounce.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://p5id24wo3axc"
+path="res://.godot/imported/wall-bounce.png-2b41461099de9979c616b098f4751367.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://Assets/Kirby/wall-bounce.png"
+dest_files=["res://.godot/imported/wall-bounce.png-2b41461099de9979c616b098f4751367.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/TileMapLayer.tscn b/Assets/Map/TileMapLayer.tscn
index 8057950..f304f16 100644
--- a/Assets/Map/TileMapLayer.tscn
+++ b/Assets/Map/TileMapLayer.tscn
@@ -1,8 +1,11 @@
-[gd_scene load_steps=5 format=3 uid="uid://b1si77qfmut5x"]
+[gd_scene load_steps=6 format=3 uid="uid://b1si77qfmut5x"]
[ext_resource type="Texture2D" uid="uid://mcgvpb1lh3ve" path="res://Assets/Map/tileset.png" id="1_odmhe"]
[ext_resource type="Script" path="res://Assets/Map/tile_map_layer.gd" id="2_qi2a0"]
+[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_3qgmv"]
+friction = 0.0
+
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_iu5yc"]
texture = ExtResource("1_odmhe")
margins = Vector2i(1, 1)
@@ -331,6 +334,7 @@ separation = Vector2i(2, 2)
13:11/0 = 0
14:11/0 = 0
15:11/0 = 0
+15:11/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
16:11/0 = 0
17:11/0 = 0
18:11/0 = 0
@@ -475,10 +479,35 @@ separation = Vector2i(2, 2)
29:15/0 = 0
30:15/0 = 0
31:15/0 = 0
+22:7/animation_frame_0/duration = 0.5
+22:7/animation_frame_1/duration = 0.5
+22:7/0 = 0
+22:7/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, 5, 8, 5, 8, 8, -8, 8)
+24:7/animation_frame_0/duration = 0.5
+24:7/animation_frame_1/duration = 0.5
+24:7/0 = 0
+24:7/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, 5, 8, 5, 8, 8, -8, 8)
+18:8/0 = 0
+18:8/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+22:6/animation_frame_0/duration = 0.5
+22:6/animation_frame_1/duration = 0.5
+22:6/0 = 0
+22:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, 8, 8, 8, 8, -8, -8, -8)
+24:6/animation_frame_0/duration = 0.5
+24:6/animation_frame_1/duration = 0.5
+24:6/0 = 0
+24:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8)
+26:6/animation_frame_0/duration = 0.5
+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)
[sub_resource type="TileSet" id="TileSet_8jo18"]
physics_layer_0/collision_layer = 16
physics_layer_0/collision_mask = 0
+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")
[node name="TileMapLayer" type="TileMapLayer"]
diff --git a/Assets/Map/tile_map_layer.gd b/Assets/Map/tile_map_layer.gd
index 47e9c33..b61d954 100644
--- a/Assets/Map/tile_map_layer.gd
+++ b/Assets/Map/tile_map_layer.gd
@@ -6,5 +6,5 @@ func get_wall_limits():
"top": (get_used_rect().position.y + 1) * tile_set.tile_size.y,
"bottom": (get_used_rect().position.y + get_used_rect().size.y + 1) * tile_set.tile_size.y,
"left": (get_used_rect().position.x + 1) * tile_set.tile_size.x,
- "right": (get_used_rect().position.x + get_used_rect().size.x + 1) * tile_set.tile_size.x,
+ "right": (get_used_rect().position.x + get_used_rect().size.x - 1) * tile_set.tile_size.x,
}
diff --git a/Assets/Map/tileset.png b/Assets/Map/tileset.png
index cd85a12..ee740c1 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 7cbee38..abbf411 100644
--- a/Assets/Map/tileset.png~
+++ b/Assets/Map/tileset.png~
Binary files differ
diff --git a/Assets/Music/Boss.wav b/Assets/Music/Boss.wav
new file mode 100644
index 0000000..308b2b4
--- /dev/null
+++ b/Assets/Music/Boss.wav
Binary files differ
diff --git a/Assets/Music/Boss.wav.import b/Assets/Music/Boss.wav.import
new file mode 100644
index 0000000..1d12ab6
--- /dev/null
+++ b/Assets/Music/Boss.wav.import
@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://cd6c7eb8otlw7"
+path="res://.godot/imported/Boss.wav-34b105f46cb25c9a883e92b457f7f57f.sample"
+
+[deps]
+
+source_file="res://Assets/Music/Boss.wav"
+dest_files=["res://.godot/imported/Boss.wav-34b105f46cb25c9a883e92b457f7f57f.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop_mode=0
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=0
diff --git a/Assets/Music/Win.wav b/Assets/Music/Win.wav
new file mode 100644
index 0000000..90e1ddc
--- /dev/null
+++ b/Assets/Music/Win.wav
Binary files differ
diff --git a/Assets/Music/Win.wav.import b/Assets/Music/Win.wav.import
new file mode 100644
index 0000000..c83d97d
--- /dev/null
+++ b/Assets/Music/Win.wav.import
@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://bdi83hcsq4yge"
+path="res://.godot/imported/Win.wav-2d6f3b060bd6a15d4ccf22a695707eb9.sample"
+
+[deps]
+
+source_file="res://Assets/Music/Win.wav"
+dest_files=["res://.godot/imported/Win.wav-2d6f3b060bd6a15d4ccf22a695707eb9.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop_mode=0
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=0
diff --git a/Assets/Music/ko.wav b/Assets/Music/knockout.wav
index 30233a7..30233a7 100644
--- a/Assets/Music/ko.wav
+++ b/Assets/Music/knockout.wav
Binary files differ
diff --git a/Assets/Music/ko.wav.import b/Assets/Music/knockout.wav.import
index 7eb8452..9d733bd 100644
--- a/Assets/Music/ko.wav.import
+++ b/Assets/Music/knockout.wav.import
@@ -3,12 +3,12 @@
importer="wav"
type="AudioStreamWAV"
uid="uid://brufyhxonh3jr"
-path="res://.godot/imported/ko.wav-b9119f8e5ccadad77df306bc79e7200f.sample"
+path="res://.godot/imported/knockout.wav-d144bd2c60eb1da4ea2eec61a299df4f.sample"
[deps]
-source_file="res://Assets/Music/ko.wav"
-dest_files=["res://.godot/imported/ko.wav-b9119f8e5ccadad77df306bc79e7200f.sample"]
+source_file="res://Assets/Music/knockout.wav"
+dest_files=["res://.godot/imported/knockout.wav-d144bd2c60eb1da4ea2eec61a299df4f.sample"]
[params]
diff --git a/Assets/Sounds/boss-hp-fill.wav b/Assets/Sounds/boss-hp-fill.wav
new file mode 100644
index 0000000..2cc14bd
--- /dev/null
+++ b/Assets/Sounds/boss-hp-fill.wav
Binary files differ
diff --git a/Assets/Sounds/boss-hp-fill.wav.import b/Assets/Sounds/boss-hp-fill.wav.import
new file mode 100644
index 0000000..c05e269
--- /dev/null
+++ b/Assets/Sounds/boss-hp-fill.wav.import
@@ -0,0 +1,24 @@
+[remap]
+
+importer="wav"
+type="AudioStreamWAV"
+uid="uid://b8q5db1h0ubyg"
+path="res://.godot/imported/boss-hp-fill.wav-8f0b1adfef95c2729e08b95bed603513.sample"
+
+[deps]
+
+source_file="res://Assets/Sounds/boss-hp-fill.wav"
+dest_files=["res://.godot/imported/boss-hp-fill.wav-8f0b1adfef95c2729e08b95bed603513.sample"]
+
+[params]
+
+force/8_bit=false
+force/mono=false
+force/max_rate=false
+force/max_rate_hz=44100
+edit/trim=false
+edit/normalize=false
+edit/loop_mode=0
+edit/loop_begin=0
+edit/loop_end=-1
+compress/mode=0
diff --git a/BossHP.tscn b/BossHP.tscn
new file mode 100644
index 0000000..7290a82
--- /dev/null
+++ b/BossHP.tscn
@@ -0,0 +1,29 @@
+[gd_scene load_steps=4 format=3 uid="uid://h8m5scfjj45p"]
+
+[ext_resource type="Script" path="res://boss_hp.gd" id="1_athp4"]
+[ext_resource type="Texture2D" uid="uid://jpk0628wuwl1" path="res://Assets/HUD/boss-hp.png" id="2_fkcmd"]
+[ext_resource type="Texture2D" uid="uid://b2xjcvm2xycud" path="res://Assets/HUD/boss-hp-empty.png" id="3_2hfbj"]
+
+[node name="BossHP" type="Control"]
+layout_mode = 3
+anchor_right = 0.05
+anchor_bottom = 0.056
+offset_bottom = -0.0640001
+script = ExtResource("1_athp4")
+
+[node name="Full" type="TextureRect" parent="."]
+texture_filter = 1
+layout_mode = 0
+offset_right = 7.0
+offset_bottom = 8.0
+texture = ExtResource("2_fkcmd")
+stretch_mode = 4
+
+[node name="Empty" type="TextureRect" parent="."]
+visible = false
+texture_filter = 1
+layout_mode = 0
+offset_right = 7.0
+offset_bottom = 8.0
+texture = ExtResource("3_2hfbj")
+stretch_mode = 4
diff --git a/BossHPBar.tscn b/BossHPBar.tscn
new file mode 100644
index 0000000..1459a9d
--- /dev/null
+++ b/BossHPBar.tscn
@@ -0,0 +1,26 @@
+[gd_scene load_steps=4 format=3 uid="uid://ci6ik574uumq5"]
+
+[ext_resource type="Script" path="res://boss_hp_bar.gd" id="1_m23bk"]
+[ext_resource type="PackedScene" uid="uid://h8m5scfjj45p" path="res://BossHP.tscn" id="2_mlild"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wy8yp"]
+bg_color = Color(1, 1, 1, 1)
+
+[node name="BossHPBar" type="PanelContainer"]
+offset_right = 16.0
+size_flags_horizontal = 3
+theme_override_styles/panel = SubResource("StyleBoxFlat_wy8yp")
+script = ExtResource("1_m23bk")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="."]
+layout_mode = 2
+theme_override_constants/separation = 8
+
+[node name="BossHP" parent="HBoxContainer" instance=ExtResource("2_mlild")]
+layout_mode = 2
+
+[node name="BossHP2" parent="HBoxContainer" instance=ExtResource("2_mlild")]
+layout_mode = 2
+
+[node name="BossHP3" parent="HBoxContainer" instance=ExtResource("2_mlild")]
+layout_mode = 2
diff --git a/Enemies/Enemy.tscn b/Enemies/Enemy.tscn
index 678b33a..2791e05 100644
--- a/Enemies/Enemy.tscn
+++ b/Enemies/Enemy.tscn
@@ -36,5 +36,13 @@ 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.gd b/Enemies/enemy.gd
index ab1ceac..428f6ca 100644
--- a/Enemies/enemy.gd
+++ b/Enemies/enemy.gd
@@ -1,8 +1,14 @@
+class_name Enemy
extends CharacterBody2D
const SPEED = 30
+var direction = -1 :
+ set(value):
+ direction = value
+ $AnimatedSprite2D.flip_h = direction > 0
+
func _ready() -> void:
process_mode = PROCESS_MODE_DISABLED
@@ -14,14 +20,54 @@ func _physics_process(delta: float) -> void:
if not is_on_floor():
velocity += get_gravity() * delta
- velocity.x = -SPEED
+ velocity.x = direction * SPEED
move_and_slide()
+ if get_last_slide_collision():
+ if $RayLeft.is_colliding():
+ direction = 1
+ elif $RayRight.is_colliding():
+ direction = -1
+
+
+func on_hit(projectile_position: Vector2):
+ var impact_direction = global_position - projectile_position
+ var impact_direction_x = sign(impact_direction.x)
+
+ var effect_star_scene := preload("res://effect_star.tscn")
+
+ var directions = []
+ if randi() % 10 > 5:
+ directions = [Vector2(1, 1) * 8, Vector2(1, -1) * 8, Vector2(-1, -1) * 8, Vector2(-1, 1) * 8]
+ else:
+ directions = [
+ Vector2(impact_direction_x, 1) * 16,
+ Vector2(impact_direction_x, -1) * 16,
+ Vector2(impact_direction_x, 0.25) * 16,
+ Vector2(impact_direction_x, -0.25) * 16,
+ ]
+
+ for effect_direction in directions:
+ var effect_star := effect_star_scene.instantiate()
+ effect_star.global_position = global_position
+ get_tree().current_scene.add_child(effect_star)
+ var tween := get_tree().create_tween().set_ease(Tween.EASE_OUT)
+ tween.tween_property(
+ effect_star,
+ "global_position",
+ global_position + effect_direction,
+ 0.1
+ )
+ tween.tween_callback(func():
+ effect_star.queue_free()
+ ).set_delay(0.2)
+
+ queue_free()
func _on_visible_on_screen_notifier_2d_screen_entered() -> void:
process_mode = PROCESS_MODE_INHERIT
-
func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
+ return
process_mode = PROCESS_MODE_DISABLED
diff --git a/FloatIslands.tscn b/FloatIslands.tscn
index 370b7ce..cb3b5ee 100644
--- a/FloatIslands.tscn
+++ b/FloatIslands.tscn
@@ -4,16 +4,37 @@
[ext_resource type="PackedScene" uid="uid://fe6exyigjb72" path="res://Player.tscn" id="2_1abrq"]
[ext_resource type="PackedScene" uid="uid://bb8nnbftq04df" path="res://HUD.tscn" id="2_ejyoq"]
[ext_resource type="PackedScene" uid="uid://b1si77qfmut5x" path="res://Assets/Map/TileMapLayer.tscn" id="2_hlwwt"]
-[ext_resource type="PackedScene" uid="uid://cjrb8n36og5f3" path="res://KOPlane.tscn" id="4_7uhfp"]
+[ext_resource type="PackedScene" uid="uid://cjrb8n36og5f3" path="res://KnockoutPlane.tscn" id="4_7uhfp"]
[ext_resource type="PackedScene" uid="uid://7ndl8hvg4e38" path="res://Door.tscn" id="4_e2mrq"]
[node name="FloatIslands" type="Node2D"]
script = ExtResource("1_1pywd")
+[node name="BackgroundClouds" type="Parallax2D" parent="."]
+scroll_scale = Vector2(0.5, 1)
+repeat_size = Vector2(360, 0)
+
+[node name="TileMapLayer" parent="BackgroundClouds" instance=ExtResource("2_hlwwt")]
+tile_map_data = PackedByteArray("AAAHAAIAAAAGAAwAAAAIAAIAAAAHAAwAAAAJAAMAAAAHAAwAAAAGAAMAAAAGAAwAAAAJAAIAAAAAAAoAAAAKAAAAAAAGAA0AAAALAAEAAAAGAA0AAAAMAAEAAAAHAA0AAAANAAAAAAAHAA0AAAAGAAAAAAAGAA0AAAAHAAAAAAAHAA0AAAAEAAMAAAAAAAoAAAACAAIAAAAHAAwAAAABAAIAAAAGAAwAAAADAAMAAAAHAAwAAAAAAAMAAAAGAAwAAAACAAEAAAAAAA8AAAADAAEAAAABAA8AAAACAAAAAAAAAA4AAAADAAAAAAABAA4AAAAOAAIAAAAFAAwAAAAVAAEAAAAEAAwAAAAVAAIAAAAEAA0AAAAQAAMAAAAHAAwAAAAPAAMAAAAGAAwAAAASAAEAAAAHAA0AAAAQAAAAAAAGAA0AAAARAAEAAAAGAA0AAAATAAAAAAAHAA0AAAA=")
+
+[node name="BackgroundHorizon" type="Parallax2D" parent="."]
+scroll_scale = Vector2(0.7, 1)
+repeat_size = Vector2(360, 0)
+
+[node name="TileMapLayer" parent="BackgroundHorizon" instance=ExtResource("2_hlwwt")]
+tile_map_data = PackedByteArray("AAAHAAQAAAAAAAsAAAAAAAQAAAAAAAsAAAABAAQAAAAAAAsAAAACAAQAAAAAAAsAAAADAAQAAAAAAAsAAAAEAAQAAAAAAAsAAAAFAAQAAAAAAAsAAAAGAAQAAAAAAAsAAAAIAAQAAAAAAAsAAAAJAAQAAAAAAAsAAAAKAAQAAAAAAAsAAAALAAQAAAAAAAsAAAAMAAQAAAAAAAsAAAANAAQAAAAAAAsAAAAOAAQAAAAAAAsAAAAPAAQAAAAAAAsAAAAQAAQAAAAAAAsAAAARAAQAAAAAAAsAAAASAAQAAAAAAAsAAAATAAQAAAAAAAsAAAAUAAQAAAAAAAsAAAAVAAQAAAAAAAsAAAAWAAQAAAAAAAsAAAA=")
+
+[node name="BackgroundPalms" type="Parallax2D" parent="."]
+scroll_scale = Vector2(0.9, 1)
+repeat_size = Vector2(360, 0)
+
+[node name="TileMapLayer" parent="BackgroundPalms" instance=ExtResource("2_hlwwt")]
+tile_map_data = PackedByteArray("AAAIAAIAAAABAAgAAAAJAAIAAAACAAgAAAAJAAMAAAACAAkAAAAPAAMAAAAAAAgAAAAQAAQAAAABAAkAAAAQAAUAAAABAAoAAAARAAQAAAACAAkAAAAVAAMAAAABAAkAAAAVAAQAAAABAAoAAAAWAAMAAAACAAkAAAACAAEAAAAAAAgAAAACAAIAAAAAAAkAAAADAAEAAAABAAgAAAADAAIAAAABAAkAAAADAAMAAAABAAoAAAADAAQAAAABAAoAAAADAAUAAAABAAoAAAAEAAEAAAACAAgAAAAEAAIAAAACAAkAAAAHAAIAAAAAAAgAAAAHAAMAAAAAAAkAAAAIAAMAAAABAAkAAAAIAAQAAAABAAoAAAAIAAUAAAABAAoAAAAKAAQAAAAAAAgAAAAKAAUAAAAAAAkAAAALAAQAAAABAAgAAAALAAUAAAABAAkAAAAMAAQAAAACAAgAAAAMAAUAAAACAAkAAAAPAAQAAAAAAAkAAAAQAAMAAAABAAgAAAARAAMAAAACAAgAAAAUAAIAAAAAAAgAAAAUAAMAAAAAAAkAAAAVAAIAAAABAAgAAAAVAAUAAAABAAoAAAAWAAIAAAACAAgAAAADAAYAAAABAAoAAAAIAAYAAAABAAoAAAALAAYAAAABAAoAAAAQAAYAAAABAAoAAAAVAAYAAAABAAoAAAA=")
+
[node name="HUD" parent="." instance=ExtResource("2_ejyoq")]
[node name="TileMapLayer" parent="." instance=ExtResource("2_hlwwt")]
-tile_map_data = PackedByteArray("AAAAAAYAAAADAAsAAAABAAUAAAANAAoAAAABAAYAAAADAAsAAAACAAUAAAAOAAoAAAACAAYAAAAOAAsAAAACAAcAAAAPAAsAAAADAAUAAAAOAAoAAAADAAYAAAAOAAsAAAADAAcAAAAPAAsAAAAEAAUAAAAOAAoAAAAEAAYAAAAOAAsAAAAEAAcAAAAPAAsAAAAFAAUAAAAOAAoAAAAFAAYAAAAOAAsAAAAFAAcAAAAPAAsAAAAGAAUAAAAOAAoAAAAGAAYAAAAOAAsAAAAGAAcAAAAPAAsAAAAHAAUAAAAOAAoAAAAHAAYAAAAOAAsAAAAHAAcAAAAPAAsAAAAIAAUAAAAOAAoAAAAIAAYAAAAOAAsAAAAIAAcAAAAPAAsAAAAJAAUAAAAOAAoAAAAJAAYAAAAOAAsAAAAKAAYAAAADAAsAAAALAAYAAAADAAsAAAAJAAcAAAAPAAsAAAAKAAUAAAAPAAoAAAAMAAYAAAADAAsAAAANAAYAAAADAAsAAAAOAAYAAAADAAsAAAAPAAYAAAADAAsAAAAQAAYAAAADAAsAAAARAAYAAAADAAsAAAASAAYAAAADAAsAAAA=")
+tile_map_data = PackedByteArray("AAAAAAYAAAAWAAcAAAALAAYAAAAWAAcAAAAMAAYAAAAWAAcAAAANAAYAAAAWAAYAAAAOAAYAAAAYAAYAAAAPAAYAAAAYAAYAAAAQAAYAAAAYAAYAAAARAAYAAAAYAAYAAAASAAYAAAAYAAYAAAACAAUAAAANAAoAAAACAAYAAAAWAAcAAAADAAUAAAAOAAoAAAADAAYAAAAYAAcAAAADAAcAAAAPAAsAAAAEAAUAAAAOAAoAAAAEAAYAAAAYAAcAAAAEAAcAAAAPAAsAAAAFAAUAAAAOAAoAAAAFAAYAAAAYAAcAAAAFAAcAAAAPAAsAAAAGAAUAAAAOAAoAAAAGAAYAAAAYAAcAAAAGAAcAAAAPAAsAAAAHAAUAAAAOAAoAAAAHAAYAAAAYAAcAAAAHAAcAAAAPAAsAAAAIAAUAAAAOAAoAAAAIAAYAAAAYAAcAAAAIAAcAAAAPAAsAAAAJAAUAAAAOAAoAAAAJAAYAAAAYAAcAAAAJAAcAAAAPAAsAAAAKAAUAAAAOAAoAAAAKAAYAAAAYAAcAAAAKAAcAAAAPAAsAAAALAAUAAAAPAAoAAAABAAYAAAAWAAcAAAATAAYAAAAYAAYAAAAUAAYAAAAYAAYAAAAVAAYAAAAYAAYAAAAWAAYAAAAYAAYAAAAXAAYAAAAYAAYAAAAYAAYAAAAYAAYAAAAZAAYAAAAYAAYAAAAaAAYAAAAYAAYAAAAbAAYAAAAYAAYAAAAcAAYAAAAYAAYAAAAdAAYAAAAYAAYAAAAeAAYAAAAYAAYAAAAfAAYAAAAYAAYAAAAgAAYAAAAYAAYAAAAhAAYAAAAYAAYAAAAiAAYAAAAYAAYAAAAjAAYAAAAYAAYAAAAkAAYAAAAYAAYAAAAlAAYAAAAYAAYAAAAmAAYAAAAYAAYAAAAOAAcAAAAPAAsAAAAPAAcAAAAPAAsAAAAQAAcAAAAPAAsAAAARAAcAAAAPAAsAAAASAAcAAAAPAAsAAAATAAcAAAAPAAsAAAAUAAcAAAAPAAsAAAAVAAcAAAAPAAsAAAAWAAcAAAAPAAsAAAAXAAcAAAAPAAsAAAAYAAcAAAAPAAsAAAAZAAcAAAAPAAsAAAAaAAcAAAAPAAsAAAAbAAcAAAAPAAsAAAAcAAcAAAAPAAsAAAAdAAcAAAAPAAsAAAAeAAcAAAAPAAsAAAAfAAcAAAAPAAsAAAAgAAcAAAAPAAsAAAAhAAcAAAAPAAsAAAAiAAcAAAAPAAsAAAAjAAcAAAAPAAsAAAAkAAcAAAAPAAsAAAAlAAcAAAAPAAsAAAAmAAcAAAAPAAsAAAAnAAYAAAAaAAYAAAAoAAYAAAAWAAcAAAApAAYAAAAWAAcAAAAqAAYAAAAWAAcAAAArAAYAAAAWAAcAAAA=")
[node name="Door" parent="TileMapLayer" instance=ExtResource("4_e2mrq")]
position = Vector2(152, 64)
@@ -22,10 +43,10 @@ target_position = Vector2(0, 112)
[node name="Wall" parent="." instance=ExtResource("2_hlwwt")]
modulate = Color(1, 1, 1, 0.392157)
-tile_map_data = PackedByteArray("AAD//wUAAAARAAEAAAD//wQAAAARAAEAAAD//wMAAAARAAEAAAD//wIAAAARAAEAAAD//wEAAAARAAEAAAD//wAAAAARAAEAAAD/////AAARAAEAAAAAAP//AAARAAEAAAABAP//AAARAAEAAAACAP//AAARAAEAAAADAP//AAARAAEAAAAEAP//AAARAAEAAAAFAP//AAARAAEAAAAGAP//AAARAAEAAAAHAP//AAARAAEAAAAIAP//AAARAAEAAAAJAP//AAARAAEAAAAKAP//AAARAAEAAAD//wYAAAARAAEAAAD//wcAAAARAAEAAAA=")
+tile_map_data = PackedByteArray("AAD//wUAAAARAAEAAAD//wQAAAARAAEAAAD//wMAAAARAAEAAAD//wIAAAARAAEAAAD//wEAAAARAAEAAAD//wAAAAARAAEAAAD/////AAARAAEAAAAAAP//AAARAAEAAAABAP//AAARAAEAAAACAP//AAARAAEAAAADAP//AAARAAEAAAAEAP//AAARAAEAAAAFAP//AAARAAEAAAAGAP//AAARAAEAAAAHAP//AAARAAEAAAAIAP//AAARAAEAAAAJAP//AAARAAEAAAAKAP//AAARAAEAAAD//wYAAAARAAEAAAD//wcAAAARAAEAAAALAP//AAARAAEAAAAMAP//AAARAAEAAAANAP//AAARAAEAAAAOAP//AAARAAEAAAAPAP//AAARAAEAAAAQAP//AAARAAEAAAARAP//AAARAAEAAAASAP//AAARAAEAAAATAP//AAARAAEAAAAAAAcAAAASAAgAAAABAAcAAAASAAgAAAACAAcAAAASAAgAAAALAAcAAAASAAgAAAAMAAcAAAASAAgAAAANAAcAAAASAAgAAAAUAP//AAARAAEAAAAVAP//AAARAAEAAAAWAP//AAARAAEAAAAXAP//AAARAAEAAAAYAP//AAARAAEAAAAZAP//AAARAAEAAAAaAP//AAARAAEAAAAbAP//AAARAAEAAAAcAP//AAARAAEAAAAdAP//AAARAAEAAAAeAP//AAARAAEAAAAfAP//AAARAAEAAAAgAP//AAARAAEAAAAhAP//AAARAAEAAAAiAP//AAARAAEAAAAjAP//AAARAAEAAAAkAP//AAARAAEAAAAlAP//AAARAAEAAAAmAP//AAARAAEAAAAnAP//AAARAAEAAAAoAP//AAARAAEAAAApAP//AAARAAEAAAAqAP//AAARAAEAAAAnAAcAAAASAAgAAAAoAAcAAAASAAgAAAApAAcAAAASAAgAAAAqAAcAAAASAAgAAAArAAcAAAASAAgAAAA=")
-[node name="KOPlane" parent="." instance=ExtResource("4_7uhfp")]
-tile_map_data = PackedByteArray("AAAAAAgAAQAAAAAAAAABAAgAAQAAAAAAAAACAAgAAQAAAAAAAAADAAgAAQAAAAAAAAAEAAgAAQAAAAAAAAAFAAgAAQAAAAAAAAAGAAgAAQAAAAAAAAAHAAgAAQAAAAAAAAAIAAgAAQAAAAAAAAAJAAgAAQAAAAAAAAAKAAgAAQAAAAAAAAALAAgAAQAAAAAAAAAMAAgAAQAAAAAAAAANAAgAAQAAAAAAAAAOAAgAAQAAAAAAAAAPAAgAAQAAAAAAAAAQAAgAAQAAAAAAAAARAAgAAQAAAAAAAAASAAgAAQAAAAAAAAA=")
+[node name="KnockoutPlane" parent="." instance=ExtResource("4_7uhfp")]
+tile_map_data = PackedByteArray("AAAAAAgAAQAAAAAAAAABAAgAAQAAAAAAAAACAAgAAQAAAAAAAAADAAgAAQAAAAAAAAAEAAgAAQAAAAAAAAAFAAgAAQAAAAAAAAAGAAgAAQAAAAAAAAAHAAgAAQAAAAAAAAAIAAgAAQAAAAAAAAAJAAgAAQAAAAAAAAAKAAgAAQAAAAAAAAALAAgAAQAAAAAAAAAMAAgAAQAAAAAAAAANAAgAAQAAAAAAAAAOAAgAAQAAAAAAAAAPAAgAAQAAAAAAAAAQAAgAAQAAAAAAAAARAAgAAQAAAAAAAAASAAgAAQAAAAAAAAATAAgAAQAAAAAAAAAUAAgAAQAAAAAAAAAVAAgAAQAAAAAAAAAWAAgAAQAAAAAAAAAXAAgAAQAAAAAAAAAYAAgAAQAAAAAAAAAZAAgAAQAAAAAAAAAaAAgAAQAAAAAAAAAbAAgAAQAAAAAAAAAcAAgAAQAAAAAAAAAdAAgAAQAAAAAAAAAeAAgAAQAAAAAAAAAfAAgAAQAAAAAAAAAgAAgAAQAAAAAAAAAhAAgAAQAAAAAAAAAiAAgAAQAAAAAAAAAjAAgAAQAAAAAAAAAkAAgAAQAAAAAAAAAlAAgAAQAAAAAAAAAmAAgAAQAAAAAAAAArAAgAAQAAAAAAAAAqAAgAAQAAAAAAAAApAAgAAQAAAAAAAAAoAAgAAQAAAAAAAAAnAAgAAQAAAAAAAAA=")
[node name="Player" parent="." instance=ExtResource("2_1abrq")]
-position = Vector2(32, 40)
+position = Vector2(48, 40)
diff --git a/FloatIslandsIntro.tscn b/FloatIslandsIntro.tscn
index 6677def..ded1472 100644
--- a/FloatIslandsIntro.tscn
+++ b/FloatIslandsIntro.tscn
@@ -1,7 +1,9 @@
-[gd_scene load_steps=3 format=3 uid="uid://bbhruy6emo48l"]
+[gd_scene load_steps=5 format=3 uid="uid://bbhruy6emo48l"]
[ext_resource type="Script" path="res://float_islands_intro.gd" id="1_nl4ls"]
[ext_resource type="Texture2D" uid="uid://dkequklv0hq3u" path="res://Assets/Map/intro.png" id="2_q4wx6"]
+[ext_resource type="FontFile" uid="uid://bhrdnknbdr40o" path="res://Assets/HUD/Minimal5x7.ttf" id="3_c130n"]
+[ext_resource type="Texture2D" uid="uid://dw38mfygfkecc" path="res://icon_monochrome_light.svg" id="4_enqlp"]
[node name="FloatIslandsIntro" type="Node2D"]
script = ExtResource("1_nl4ls")
@@ -12,3 +14,20 @@ position = Vector2(80, 72)
texture = ExtResource("2_q4wx6")
region_enabled = true
region_rect = Rect2(344, 8, 160, 144)
+
+[node name="Label" type="Label" parent="."]
+texture_filter = 1
+offset_left = 104.0
+offset_top = 16.0
+offset_right = 112.0
+offset_bottom = 26.0
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_fonts/font = ExtResource("3_c130n")
+theme_override_font_sizes/font_size = 16
+text = " ?"
+
+[node name="IconMonochromeLight" type="Sprite2D" parent="."]
+texture_filter = 1
+position = Vector2(152, 136)
+scale = Vector2(0.0156982, 0.0156982)
+texture = ExtResource("4_enqlp")
diff --git a/Game.gd b/Game.gd
index 1a9fe39..37391b2 100644
--- a/Game.gd
+++ b/Game.gd
@@ -1,6 +1,13 @@
extends Node
+@warning_ignore("unused_signal")
+signal boss_initialized(hp: int)
+@warning_ignore("unused_signal")
+signal boss_hp_changed
+@warning_ignore("unused_signal")
+signal boss_defeated
+
signal score_changed
var score = 0 :
@@ -85,3 +92,7 @@ func transition_scene_with_door(door: Door):
Game.fade_in_screen()
).call_deferred()
+
+
+func hit_enemy(enemy: Enemy, projectile_position: Vector2):
+ enemy.on_hit(projectile_position)
diff --git a/GreenGreens.tscn b/GreenGreens.tscn
index 8c42a9a..a4bb2d5 100644
--- a/GreenGreens.tscn
+++ b/GreenGreens.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=14 format=4 uid="uid://b7lbvuc5roqaq"]
+[gd_scene load_steps=15 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"]
@@ -23,6 +23,8 @@ sources/0 = SubResource("TileSetAtlasSource_hnnog")
[sub_resource type="RectangleShape2D" id="RectangleShape2D_gog7l"]
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_208d0"]
+
[node name="GreenGreens" type="Node2D"]
script = ExtResource("1_8lfgl")
@@ -47,7 +49,7 @@ position = Vector2(175, 74)
texture = ExtResource("3_cwh0s")
[node name="TileMapLayer" parent="." instance=ExtResource("13_cw8ip")]
-tile_map_data = PackedByteArray("AAAAAAgAAAARAAAAAAABAAgAAAARAAAAAAACAAgAAAARAAAAAAADAAgAAAARAAAAAAAEAAgAAAARAAAAAAAFAAgAAAARAAAAAAAGAAgAAAARAAAAAAAHAAgAAAARAAAAAAAIAAgAAAARAAAAAAAJAAgAAAARAAAAAAAKAAgAAAARAAAAAAALAAgAAAARAAAAAAAMAAgAAAARAAAAAAANAAgAAAARAAAAAAAOAAgAAAARAAAAAAAPAAgAAAARAAAAAAAQAAgAAAARAAAAAAARAAgAAAARAAAAAAASAAgAAAARAAAAAAATAAgAAAARAAAAAAAUAAgAAAARAAAAAAAVAAgAAAARAAAAAAAWAAgAAAARAAAAAAAXAAgAAAARAAAAAAAYAAgAAAARAAAAAAAaAAcAAAARAAAAAAAbAAcAAAARAAAAAAAcAAcAAAARAAAAAAAdAAcAAAARAAAAAAAeAAcAAAARAAAAAAAfAAcAAAARAAAAAAAgAAcAAAARAAAAAAAhAAcAAAARAAAAAAAjAAgAAAARAAAAAAAkAAgAAAARAAAAAAAlAAgAAAARAAAAAAAmAAgAAAARAAAAAAAnAAgAAAARAAAAAAAoAAgAAAARAAAAAAApAAgAAAARAAAAAAAqAAgAAAARAAAAAAArAAgAAAARAAAAAAAsAAgAAAARAAAAAAAtAAgAAAARAAAAAAAuAAgAAAARAAAAAAAvAAgAAAARAAAAAAAwAAgAAAARAAAAAAAxAAgAAAARAAAAAAAyAAgAAAARAAAAAAAzAAgAAAARAAAAAAA2AAgAAAARAAAAAAA3AAgAAAARAAAAAAA4AAgAAAARAAAAAAA5AAgAAAARAAAAAAA6AAgAAAARAAAAAAA7AAgAAAARAAAAAAA8AAgAAAARAAAAAAA9AAgAAAARAAAAAAA+AAgAAAARAAAAAAA/AAgAAAARAAAAAABAAAgAAAARAAAAAABBAAgAAAARAAAAAABCAAgAAAARAAAAAABDAAgAAAARAAAAAABEAAgAAAARAAAAAABFAAgAAAARAAAAAABGAAgAAAARAAAAAABHAAgAAAARAAAAAABIAAgAAAARAAAAAABJAAgAAAARAAAAAABKAAgAAAARAAAAAABLAAgAAAARAAAAAABMAAgAAAARAAAAAABNAAgAAAARAAAAAABOAAgAAAARAAAAAABPAAgAAAARAAAAAABQAAgAAAARAAAAAABRAAgAAAARAAAAAABSAAgAAAARAAAAAABTAAgAAAARAAAAAABUAAgAAAARAAAAAABVAAgAAAARAAAAAABWAAgAAAARAAAAAABXAAgAAAARAAAAAABYAAgAAAARAAAAAABZAAgAAAARAAAAAABaAAgAAAARAAAAAABbAAgAAAARAAAAAABcAAgAAAARAAAAAABdAAgAAAARAAAAAABeAAgAAAARAAAAAABfAAgAAAARAAAAAABgAAgAAAARAAAAAABhAAgAAAARAAAAAABiAAgAAAARAAAAAABjAAgAAAARAAAAAABkAAgAAAARAAAAAABlAAgAAAARAAAAAABmAAgAAAARAAAAAABnAAgAAAARAAAAAABoAAgAAAARAAAAAABpAAgAAAARAAAAAABqAAgAAAARAAAAAABrAAgAAAARAAAAAABsAAgAAAARAAAAAABtAAgAAAARAAAAAABuAAgAAAARAAAAAABvAAgAAAARAAAAAABwAAgAAAARAAAAAABxAAgAAAARAAAAAAByAAgAAAASAAAAAAA1AAQAAAASAAAAAAAiAAcAAAASAAAAAAAAAAkAAAARAAEAAAABAAkAAAARAAEAAAACAAkAAAARAAEAAAADAAkAAAARAAEAAAAEAAkAAAARAAEAAAAFAAkAAAARAAEAAAAGAAkAAAARAAEAAAAHAAkAAAARAAEAAAAIAAkAAAARAAEAAAAJAAkAAAARAAEAAAAKAAkAAAARAAEAAAALAAkAAAARAAEAAAAMAAkAAAARAAEAAAANAAkAAAARAAEAAAAOAAkAAAARAAEAAAAPAAkAAAARAAEAAAAQAAkAAAARAAEAAAARAAkAAAARAAEAAAASAAkAAAARAAEAAAATAAkAAAARAAEAAAAUAAkAAAARAAEAAAAVAAkAAAARAAEAAAAWAAkAAAARAAEAAAAXAAkAAAARAAEAAAAYAAkAAAARAAEAAAAZAAkAAAARAAEAAAAaAAkAAAARAAEAAAAbAAkAAAARAAEAAAAcAAkAAAARAAEAAAAdAAkAAAARAAEAAAAeAAkAAAARAAEAAAAfAAkAAAARAAEAAAAgAAkAAAARAAEAAAAhAAkAAAARAAEAAAAiAAkAAAARAAEAAAAaAAgAAAARAAEAAAAbAAgAAAARAAEAAAAcAAgAAAARAAEAAAAdAAgAAAARAAEAAAAeAAgAAAARAAEAAAAfAAgAAAARAAEAAAAgAAgAAAARAAEAAAAhAAgAAAARAAEAAAAiAAgAAAARAAEAAAAZAAgAAAARAAEAAAAZAAcAAAAQAAAAAAA0AAQAAAAQAAAAAAA0AAUAAAAQAAEAAAA0AAYAAAAQAAEAAAA0AAcAAAAQAAEAAAA1AAUAAAASAAEAAAA1AAYAAAASAAEAAAA1AAcAAAASAAEAAAA0AAgAAAARAAEAAAA1AAgAAAARAAEAAAAjAAkAAAARAAEAAAAkAAkAAAARAAEAAAAlAAkAAAARAAEAAAAmAAkAAAARAAEAAAAnAAkAAAARAAEAAAAoAAkAAAARAAEAAAApAAkAAAARAAEAAAAqAAkAAAARAAEAAAArAAkAAAARAAEAAAAsAAkAAAARAAEAAAAtAAkAAAARAAEAAAAuAAkAAAARAAEAAAAvAAkAAAARAAEAAAAwAAkAAAARAAEAAAAxAAkAAAARAAEAAAAyAAkAAAARAAEAAAAzAAkAAAARAAEAAAA0AAkAAAARAAEAAAA1AAkAAAARAAEAAAA2AAkAAAARAAEAAAA3AAkAAAARAAEAAAA4AAkAAAARAAEAAAA5AAkAAAARAAEAAAA6AAkAAAARAAEAAAA7AAkAAAARAAEAAAA8AAkAAAARAAEAAAA9AAkAAAARAAEAAAA+AAkAAAARAAEAAAA/AAkAAAARAAEAAABAAAkAAAARAAEAAABBAAkAAAARAAEAAABCAAkAAAARAAEAAABDAAkAAAARAAEAAABEAAkAAAARAAEAAABFAAkAAAARAAEAAABGAAkAAAARAAEAAABHAAkAAAARAAEAAABIAAkAAAARAAEAAABJAAkAAAARAAEAAABKAAkAAAARAAEAAABLAAkAAAARAAEAAABMAAkAAAARAAEAAABNAAkAAAARAAEAAABOAAkAAAARAAEAAABPAAkAAAARAAEAAABQAAkAAAARAAEAAABRAAkAAAARAAEAAABSAAkAAAARAAEAAABTAAkAAAARAAEAAABUAAkAAAARAAEAAABVAAkAAAARAAEAAABWAAkAAAARAAEAAABXAAkAAAARAAEAAABYAAkAAAARAAEAAABZAAkAAAARAAEAAABaAAkAAAARAAEAAABbAAkAAAARAAEAAABcAAkAAAARAAEAAABdAAkAAAARAAEAAABeAAkAAAARAAEAAABfAAkAAAARAAEAAABgAAkAAAARAAEAAABhAAkAAAARAAEAAABiAAkAAAARAAEAAABjAAkAAAARAAEAAABkAAkAAAARAAEAAABlAAkAAAARAAEAAABmAAkAAAARAAEAAABnAAkAAAARAAEAAABoAAkAAAARAAEAAABpAAkAAAARAAEAAABqAAkAAAARAAEAAABrAAkAAAARAAEAAABsAAkAAAARAAEAAABtAAkAAAARAAEAAABuAAkAAAARAAEAAABvAAkAAAARAAEAAABwAAkAAAARAAEAAABxAAkAAAARAAEAAAByAAkAAAASAAEAAAByAAoAAAASAAEAAABxAAoAAAARAAEAAABwAAoAAAARAAEAAABvAAoAAAARAAEAAABuAAoAAAARAAEAAABtAAoAAAARAAEAAABsAAoAAAARAAEAAABrAAoAAAARAAEAAABqAAoAAAARAAEAAABpAAoAAAARAAEAAABoAAoAAAARAAEAAABnAAoAAAARAAEAAABmAAoAAAARAAEAAABlAAoAAAARAAEAAABkAAoAAAARAAEAAABjAAoAAAARAAEAAABiAAoAAAARAAEAAABhAAoAAAARAAEAAABgAAoAAAARAAEAAABfAAoAAAARAAEAAABeAAoAAAARAAEAAABdAAoAAAARAAEAAABcAAoAAAARAAEAAABbAAoAAAARAAEAAABaAAoAAAARAAEAAABZAAoAAAARAAEAAABYAAoAAAARAAEAAABXAAoAAAARAAEAAABWAAoAAAARAAEAAABVAAoAAAARAAEAAABUAAoAAAARAAEAAABTAAoAAAARAAEAAABSAAoAAAARAAEAAABRAAoAAAARAAEAAABQAAoAAAARAAEAAABPAAoAAAARAAEAAABOAAoAAAARAAEAAABNAAoAAAARAAEAAABMAAoAAAARAAEAAABLAAoAAAARAAEAAABKAAoAAAARAAEAAABJAAoAAAARAAEAAABIAAoAAAARAAEAAABHAAoAAAARAAEAAABGAAoAAAARAAEAAABFAAoAAAARAAEAAABEAAoAAAARAAEAAABDAAoAAAARAAEAAABCAAoAAAARAAEAAABBAAoAAAARAAEAAABAAAoAAAARAAEAAAA/AAoAAAARAAEAAAA+AAoAAAARAAEAAAA9AAoAAAARAAEAAAA8AAoAAAARAAEAAAA7AAoAAAARAAEAAAA6AAoAAAARAAEAAAA5AAoAAAARAAEAAAA4AAoAAAARAAEAAAA3AAoAAAARAAEAAAA2AAoAAAARAAEAAAA1AAoAAAARAAEAAAA0AAoAAAARAAEAAAAzAAoAAAARAAEAAAAyAAoAAAARAAEAAAAxAAoAAAARAAEAAAAwAAoAAAARAAEAAAAvAAoAAAARAAEAAAAuAAoAAAARAAEAAAAtAAoAAAARAAEAAAAsAAoAAAARAAEAAAArAAoAAAARAAEAAAAqAAoAAAARAAEAAAApAAoAAAARAAEAAAAoAAoAAAARAAEAAAAnAAoAAAARAAEAAAAmAAoAAAARAAEAAAAlAAoAAAARAAEAAAAkAAoAAAARAAEAAAAjAAoAAAARAAEAAAAiAAoAAAARAAEAAAAhAAoAAAARAAEAAAAgAAoAAAARAAEAAAAfAAoAAAARAAEAAAAeAAoAAAARAAEAAAAdAAoAAAARAAEAAAAcAAoAAAARAAEAAAAbAAoAAAARAAEAAAAaAAoAAAARAAEAAAAZAAoAAAARAAEAAAAYAAoAAAARAAEAAAAXAAoAAAARAAEAAAAWAAoAAAARAAEAAAAVAAoAAAARAAEAAAAUAAoAAAARAAEAAAATAAoAAAARAAEAAAASAAoAAAARAAEAAAARAAoAAAARAAEAAAAQAAoAAAARAAEAAAAPAAoAAAARAAEAAAAOAAoAAAARAAEAAAANAAoAAAARAAEAAAAMAAoAAAARAAEAAAALAAoAAAARAAEAAAAKAAoAAAARAAEAAAAJAAoAAAARAAEAAAAIAAoAAAARAAEAAAAHAAoAAAARAAEAAAAGAAoAAAARAAEAAAAFAAoAAAARAAEAAAAEAAoAAAARAAEAAAADAAoAAAARAAEAAAACAAoAAAARAAEAAAABAAoAAAARAAEAAAAAAAoAAAARAAEAAAB7AAMAAAAQAAAAAAB8AAMAAAASAAAAAAB7AAQAAAAQAAEAAAB7AAUAAAAQAAEAAAB7AAYAAAAQAAEAAAB7AAcAAAAQAAEAAAB7AAgAAAAQAAEAAAB7AAkAAAAQAAEAAAB7AAoAAAAQAAEAAAB7AAsAAAAQAAEAAAB7AAwAAAASAAAAADB8AAwAAAARAAAAADB9AAwAAAARAAAAADB+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/AAAQAAEAAACRAAcAAAASAAEAAACRAAgAAAASAAEAAACqAAMAAAASAAEAAACqAAQAAAASAAEAAACqAAUAAAASAAEAAACqAAYAAAASAAEAAACqAAcAAAASAAEAAACqAAgAAAASAAEAAACpAAMAAAAQAAEAAACpAAQAAAAQAAEAAACpAAUAAAAQAAEAAACpAAYAAAAQAAEAAACpAAcAAAAQAAEAAACpAAgAAAARAAEAAAAAAAAAAAAcAA8AAAA=")
+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=")
[node name="Door" parent="TileMapLayer" instance=ExtResource("11_jpc1n")]
position = Vector2(0, 112)
@@ -59,6 +61,11 @@ position = Vector2(2064, 112)
target_scene = "res://GreenGreens.tscn"
target_position = Vector2(0, 112)
+[node name="DoorBoss" parent="TileMapLayer" instance=ExtResource("11_jpc1n")]
+position = Vector2(104, 112)
+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=")
@@ -85,9 +92,24 @@ position = Vector2(816, 120)
[node name="Enemy5" parent="Enemies" instance=ExtResource("13_bft13")]
position = Vector2(229, 104)
+[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="Area2D" type="Area2D" parent="."]
+collision_layer = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
shape = SubResource("RectangleShape2D_gog7l")
+[node name="Area2D2" type="Area2D" parent="."]
+position = Vector2(2112, 120)
+collision_layer = 0
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D2"]
+shape = SubResource("RectangleShape2D_208d0")
+
[connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"]
+[connection signal="body_entered" from="Area2D2" to="." method="_on_area_2d_2_body_entered"]
diff --git a/GreenGreensBoss.tscn b/GreenGreensBoss.tscn
new file mode 100644
index 0000000..432542b
--- /dev/null
+++ b/GreenGreensBoss.tscn
@@ -0,0 +1,88 @@
+[gd_scene load_steps=15 format=4 uid="uid://dcmds316bydvu"]
+
+[ext_resource type="Script" path="res://green_greens_boss.gd" id="1_4ry16"]
+[ext_resource type="PackedScene" uid="uid://bb8nnbftq04df" path="res://HUD.tscn" id="2_ne1kh"]
+[ext_resource type="Texture2D" uid="uid://xdehc2ineqjf" path="res://Assets/Enemies/green-greens-boss.png" id="3_rtuo7"]
+[ext_resource type="PackedScene" uid="uid://b1si77qfmut5x" path="res://Assets/Map/TileMapLayer.tscn" id="5_hkgd5"]
+[ext_resource type="PackedScene" uid="uid://7ndl8hvg4e38" path="res://Door.tscn" id="6_ga2l4"]
+[ext_resource type="Script" path="res://whispy_woods.gd" id="7_ho0w7"]
+[ext_resource type="Texture2D" uid="uid://blq6u731g8p1d" path="res://Assets/Map/green_greens/inner-01.png" id="7_yif17"]
+[ext_resource type="Script" path="res://Assets/Map/tile_map_layer.gd" id="8_au054"]
+[ext_resource type="SpriteFrames" uid="uid://bi6050716beom" path="res://whispy_woods_sprite_frames.tres" id="8_rne3o"]
+[ext_resource type="PackedScene" uid="uid://fe6exyigjb72" path="res://Player.tscn" id="9_b0r1m"]
+[ext_resource type="Texture2D" uid="uid://cr8mi3iehl3q2" path="res://Assets/Enemies/whispy-woods-tear.png" id="9_iwq4r"]
+
+[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_hnnog"]
+texture = ExtResource("7_yif17")
+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")
+
+[sub_resource type="RectangleShape2D" id="RectangleShape2D_na0iy"]
+size = Vector2(40, 96)
+
+[node name="GreenGreensBoss" type="Node2D"]
+script = ExtResource("1_4ry16")
+
+[node name="HUD" parent="." instance=ExtResource("2_ne1kh")]
+
+[node name="TileMapLayer" parent="." instance=ExtResource("5_hkgd5")]
+tile_map_data = PackedByteArray("AAAAAAgAAAARAAAAAAABAAgAAAARAAAAAAACAAgAAAARAAAAAAADAAgAAAARAAAAAAAEAAgAAAARAAAAAAAFAAgAAAARAAAAAAAGAAgAAAARAAAAAAAHAAgAAAARAAAAAAAIAAgAAAARAAAAAAAJAAgAAAARAAAAAAA=")
+
+[node name="Wall" type="TileMapLayer" parent="."]
+modulate = Color(1, 1, 1, 0.392157)
+position = Vector2(0, -16)
+tile_map_data = PackedByteArray("AAD//wIAAAAAAAAAAAD//wMAAAAAAAAAAAD//wQAAAAAAAAAAAD//wUAAAAAAAAAAAD//wYAAAAAAAAAAAD//wcAAAAAAAAAAAAKAAIAAAAAAAAAAAAKAAMAAAAAAAAAAAAKAAQAAAAAAAAAAAAKAAUAAAAAAAAAAAAKAAYAAAAAAAAAAAAKAAcAAAAAAAAAAAD//wgAAAAAAAAAAAAKAAgAAAAAAAAAAAD//wEAAAAAAAAAAAAKAAEAAAAAAAAAAAAAAAEAAAAAAAAAAAABAAEAAAAAAAAAAAACAAEAAAAAAAAAAAADAAEAAAAAAAAAAAAEAAEAAAAAAAAAAAAFAAEAAAAAAAAAAAAGAAEAAAAAAAAAAAAHAAEAAAAAAAAAAAAIAAEAAAAAAAAAAAAJAAEAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAA=")
+tile_set = SubResource("TileSet_dimm0")
+script = ExtResource("8_au054")
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture_filter = 1
+position = Vector2(80, 80)
+scale = Vector2(1, 1.00787)
+texture = ExtResource("3_rtuo7")
+
+[node name="WhispyWoods" type="Area2D" parent="."]
+collision_layer = 512
+collision_mask = 8
+script = ExtResource("7_ho0w7")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="WhispyWoods"]
+position = Vector2(132, 80)
+shape = SubResource("RectangleShape2D_na0iy")
+
+[node name="EyeLeft" type="AnimatedSprite2D" parent="WhispyWoods"]
+texture_filter = 1
+position = Vector2(122, 72)
+sprite_frames = ExtResource("8_rne3o")
+animation = &"eye_open"
+
+[node name="Tear" type="Sprite2D" parent="WhispyWoods"]
+visible = false
+texture_filter = 1
+position = Vector2(132, 81)
+texture = ExtResource("9_iwq4r")
+
+[node name="EyeRight" type="AnimatedSprite2D" parent="WhispyWoods"]
+texture_filter = 1
+position = Vector2(130, 72)
+sprite_frames = ExtResource("8_rne3o")
+animation = &"eye_open"
+
+[node name="Mouth" type="AnimatedSprite2D" parent="WhispyWoods"]
+texture_filter = 1
+position = Vector2(124, 98)
+sprite_frames = ExtResource("8_rne3o")
+animation = &"mouth_idle"
+
+[node name="Door" parent="." instance=ExtResource("6_ga2l4")]
+position = Vector2(0, 112)
+target_scene = "res://GreenGreens.tscn"
+target_position = Vector2(104, 112)
+
+[node name="Player" parent="." instance=ExtResource("9_b0r1m")]
+position = Vector2(32, 72)
diff --git a/GreenGreensIntro.tscn b/GreenGreensIntro.tscn
index 360cbbc..65e787d 100644
--- a/GreenGreensIntro.tscn
+++ b/GreenGreensIntro.tscn
@@ -1,7 +1,9 @@
-[gd_scene load_steps=3 format=3 uid="uid://b5hgmpqqdrrmd"]
+[gd_scene load_steps=5 format=3 uid="uid://b5hgmpqqdrrmd"]
[ext_resource type="Script" path="res://green_greens_intro.gd" id="1_ivro2"]
[ext_resource type="Texture2D" uid="uid://dkequklv0hq3u" path="res://Assets/Map/intro.png" id="2_ckkki"]
+[ext_resource type="FontFile" uid="uid://bhrdnknbdr40o" path="res://Assets/HUD/Minimal5x7.ttf" id="3_8d7gj"]
+[ext_resource type="Texture2D" uid="uid://dw38mfygfkecc" path="res://icon_monochrome_light.svg" id="4_r67wl"]
[node name="GreenGreensIntro" type="Node2D"]
script = ExtResource("1_ivro2")
@@ -12,3 +14,21 @@ position = Vector2(80, 72)
texture = ExtResource("2_ckkki")
region_enabled = true
region_rect = Rect2(8, 8, 160, 144)
+
+[node name="Label" type="Label" parent="."]
+texture_filter = 1
+offset_left = 71.0
+offset_top = 65.0
+offset_right = 81.0
+offset_bottom = 88.0
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_fonts/font = ExtResource("3_8d7gj")
+theme_override_font_sizes/font_size = 16
+text = ". .
+U"
+
+[node name="IconMonochromeLight" type="Sprite2D" parent="."]
+texture_filter = 1
+position = Vector2(152, 136)
+scale = Vector2(0.015625, 0.015625)
+texture = ExtResource("4_r67wl")
diff --git a/HP.tscn b/HP.tscn
index 6f76361..b4eceba 100644
--- a/HP.tscn
+++ b/HP.tscn
@@ -1,11 +1,8 @@
-[gd_scene load_steps=5 format=3 uid="uid://c5d10tebryjlc"]
+[gd_scene load_steps=4 format=3 uid="uid://c5d10tebryjlc"]
[ext_resource type="Script" path="res://hp.gd" id="1_gx3f3"]
[ext_resource type="Texture2D" uid="uid://blq0txbn7sqdk" path="res://Assets/HUD/hp.png" id="1_y6ic7"]
-[ext_resource type="FontFile" uid="uid://ceinhnmc5wuas" path="res://Assets/HUD/Minimal3x5.ttf" id="2_gtstn"]
-
-[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8fkvy"]
-content_margin_top = 1.0
+[ext_resource type="Texture2D" uid="uid://dqy7sy62yms28" path="res://Assets/HUD/hp-empty.png" id="3_wjwha"]
[node name="HP" type="Control"]
layout_mode = 3
@@ -22,16 +19,11 @@ offset_bottom = 8.0
texture = ExtResource("1_y6ic7")
stretch_mode = 4
-[node name="Empty" type="Label" parent="."]
+[node name="Empty" type="TextureRect" parent="."]
visible = false
+texture_filter = 1
layout_mode = 0
offset_right = 7.0
offset_bottom = 8.0
-theme_override_colors/font_color = Color(0, 0, 0, 1)
-theme_override_constants/line_spacing = 0
-theme_override_fonts/font = ExtResource("2_gtstn")
-theme_override_font_sizes/font_size = 8
-theme_override_styles/normal = SubResource("StyleBoxEmpty_8fkvy")
-text = "-"
-horizontal_alignment = 1
-vertical_alignment = 1
+texture = ExtResource("3_wjwha")
+stretch_mode = 4
diff --git a/HUD.tscn b/HUD.tscn
index 6e4665d..f462167 100644
--- a/HUD.tscn
+++ b/HUD.tscn
@@ -1,12 +1,14 @@
-[gd_scene load_steps=11 format=3 uid="uid://bb8nnbftq04df"]
+[gd_scene load_steps=13 format=3 uid="uid://bb8nnbftq04df"]
[ext_resource type="Texture2D" uid="uid://03ywpiydxqtr" path="res://Assets/HUD/score.png" id="1_1dnfp"]
[ext_resource type="Script" path="res://hud.gd" id="1_yklat"]
[ext_resource type="Texture2D" uid="uid://co0ut2jg74b7d" path="res://Assets/HUD/kirby.png" id="2_1sor8"]
+[ext_resource type="Theme" uid="uid://c1jnbt5h4hwmi" path="res://Assets/HUD/theme.tres" id="2_q561o"]
[ext_resource type="Texture2D" uid="uid://csacog6lnjxb8" path="res://Assets/HUD/life.png" id="3_hj6sq"]
-[ext_resource type="FontFile" uid="uid://cskj32qqejbjx" path="res://Assets/HUD/Minimal5x5Monospaced.ttf" id="3_w433g"]
[ext_resource type="Texture2D" uid="uid://tbmqbp685k2e" path="res://Assets/HUD/times.png" id="4_2nmud"]
+[ext_resource type="PackedScene" uid="uid://ci6ik574uumq5" path="res://BossHPBar.tscn" id="4_81bor"]
[ext_resource type="PackedScene" uid="uid://gu20rupju5t7" path="res://HPBar.tscn" id="4_aw45f"]
+[ext_resource type="Texture2D" uid="uid://bmvik2d2p8vqp" path="res://Assets/HUD/boss.png" id="4_pbira"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3iriw"]
bg_color = Color(1, 1, 1, 1)
@@ -26,9 +28,10 @@ anchors_preset = 12
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
-offset_top = -16.0
+offset_top = -18.0
grow_horizontal = 2
grow_vertical = 0
+theme = ExtResource("2_q561o")
theme_override_styles/panel = SubResource("StyleBoxFlat_3iriw")
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"]
@@ -36,27 +39,55 @@ layout_mode = 2
theme_override_constants/separation = 0
[node name="Top" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
+custom_minimum_size = Vector2(0, 9)
layout_mode = 2
-[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer/Top"]
+[node name="Left" type="CenterContainer" parent="PanelContainer/VBoxContainer/Top"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="Score" type="TextureRect" parent="PanelContainer/VBoxContainer/Top/Left"]
texture_filter = 1
layout_mode = 2
size_flags_horizontal = 3
texture = ExtResource("1_1dnfp")
-stretch_mode = 3
+stretch_mode = 2
-[node name="Score" type="Label" parent="PanelContainer/VBoxContainer/Top"]
-unique_name_in_owner = true
+[node name="Boss" type="TextureRect" parent="PanelContainer/VBoxContainer/Top/Left"]
+visible = false
+texture_filter = 1
layout_mode = 2
size_flags_horizontal = 3
+texture = ExtResource("4_pbira")
+stretch_mode = 2
+
+[node name="Container" type="Control" parent="PanelContainer/VBoxContainer/Top"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="Score" type="Label" parent="PanelContainer/VBoxContainer/Top/Container"]
+unique_name_in_owner = true
+texture_filter = 1
+layout_mode = 1
+offset_right = 51.0
+offset_bottom = 8.0
+size_flags_horizontal = 3
size_flags_vertical = 0
-theme_override_colors/font_color = Color(0, 0, 0, 1)
-theme_override_fonts/font = ExtResource("3_w433g")
-theme_override_font_sizes/font_size = 8
theme_override_styles/normal = SubResource("StyleBoxEmpty_8r301")
text = "1337"
horizontal_alignment = 2
+[node name="BossHPBar" parent="PanelContainer/VBoxContainer/Top/Container" instance=ExtResource("4_81bor")]
+unique_name_in_owner = true
+visible = false
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_right = 0.0
+grow_horizontal = 2
+grow_vertical = 2
+
[node name="empty" type="Control" parent="PanelContainer/VBoxContainer/Top"]
layout_mode = 2
size_flags_horizontal = 3
@@ -94,9 +125,7 @@ stretch_mode = 4
[node name="Life" type="Label" parent="PanelContainer/VBoxContainer/Bottom/Life"]
unique_name_in_owner = true
+texture_filter = 1
layout_mode = 2
-theme_override_colors/font_color = Color(0, 0, 0, 1)
-theme_override_fonts/font = ExtResource("3_w433g")
-theme_override_font_sizes/font_size = 8
theme_override_styles/normal = SubResource("StyleBoxEmpty_8k6bx")
text = "99"
diff --git a/KOPlane.tscn b/KnockoutPlane.tscn
index dd48356..7e719f8 100644
--- a/KOPlane.tscn
+++ b/KnockoutPlane.tscn
@@ -1,7 +1,7 @@
[gd_scene load_steps=5 format=3 uid="uid://cjrb8n36og5f3"]
[ext_resource type="Texture2D" uid="uid://dmpy27vxinj8f" path="res://Assets/Map/times.png" id="1_vrxw0"]
-[ext_resource type="Script" path="res://ko_plane.gd" id="2_vjc1u"]
+[ext_resource type="Script" path="res://knockout_plane.gd" id="2_vjc1u"]
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_kns0k"]
texture = ExtResource("1_vrxw0")
@@ -13,7 +13,7 @@ physics_layer_0/collision_layer = 32
physics_layer_0/collision_mask = 0
sources/1 = SubResource("TileSetAtlasSource_kns0k")
-[node name="DeathPlane" type="TileMapLayer"]
+[node name="KnockoutPlane" type="TileMapLayer"]
texture_filter = 1
tile_set = SubResource("TileSet_hjkjq")
script = ExtResource("2_vjc1u")
diff --git a/Player.tscn b/Player.tscn
index ec10378..19d5567 100644
--- a/Player.tscn
+++ b/Player.tscn
@@ -1,9 +1,10 @@
-[gd_scene load_steps=53 format=3 uid="uid://fe6exyigjb72"]
+[gd_scene load_steps=73 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"]
[ext_resource type="Texture2D" uid="uid://gq77eigxyvci" path="res://Assets/Kirby/fall.png" id="2_udm1i"]
[ext_resource type="Texture2D" uid="uid://c4gyxj3yaqiel" path="res://Assets/Kirby/idle.png" id="3_cldu0"]
+[ext_resource type="Texture2D" uid="uid://du6cfirv2pq7i" path="res://Assets/Kirby/inflated-transition-02.png" id="3_xbxev"]
[ext_resource type="Texture2D" uid="uid://kjgx1vhvtkuf" path="res://Assets/Kirby/jump.png" id="4_c4qo5"]
[ext_resource type="Texture2D" uid="uid://ba2ivfvgaoak" path="res://Assets/Kirby/fly-01.png" id="4_ueynj"]
[ext_resource type="Texture2D" uid="uid://bubv8f16w2cva" path="res://Assets/Kirby/enter-door.png" id="4_xbfs5"]
@@ -16,32 +17,38 @@
[ext_resource type="Texture2D" uid="uid://b7rnngemyujar" path="res://Assets/Kirby/inflated-idle.png" id="8_vsb1l"]
[ext_resource type="Texture2D" uid="uid://bplxl8ggrpoea" path="res://Assets/Kirby/inhale-01.png" id="8_xxs7c"]
[ext_resource type="Texture2D" uid="uid://dm3xyxhejdyl8" path="res://Assets/Kirby/inflated-walk-01.png" id="9_4qud5"]
+[ext_resource type="Texture2D" uid="uid://cvxxfk1qgqcti" path="res://Assets/Kirby/fly-exhale-01.png" id="9_6xjk3"]
[ext_resource type="Texture2D" uid="uid://c60ctgi67fblt" path="res://Assets/Kirby/inflated-jump.png" id="9_rgn34"]
[ext_resource type="AudioStream" uid="uid://cib0bm11wfubt" path="res://Assets/Sounds/fall.wav" id="9_t30y2"]
[ext_resource type="Texture2D" uid="uid://drjw1f0xi078w" path="res://Assets/Kirby/inflated-walk-02.png" id="10_46wv3"]
+[ext_resource type="Texture2D" uid="uid://b6ilregfg6lf5" path="res://Assets/Kirby/fly-exhale-02.png" id="10_fgigi"]
[ext_resource type="AudioStream" uid="uid://2y0km5fcbw1t" path="res://Assets/Sounds/jump.wav" id="10_gmv3e"]
+[ext_resource type="Texture2D" uid="uid://bdbp68mhgo5xb" path="res://Assets/Kirby/inflated-exhale-01.png" id="12_qswnu"]
+[ext_resource type="Texture2D" uid="uid://dlmfgtkfe8s8k" path="res://Assets/Kirby/fly-transition-01.png" id="13_2mmwp"]
+[ext_resource type="Texture2D" uid="uid://c6yy67c1dd07v" path="res://Assets/Kirby/inflated-exhale-02.png" id="13_28jiy"]
[ext_resource type="AudioStream" uid="uid://cg118tdsr3oww" path="res://Assets/Sounds/fall-2.wav" id="14_o43qk"]
[ext_resource type="AudioStream" uid="uid://do315gfb7gp6e" path="res://Assets/Sounds/fly.wav" id="15_wt8kq"]
-[ext_resource type="Texture2D" uid="uid://beg36twmvwket" path="res://Assets/Kirby/ko-1.png" id="17_mk1fn"]
+[ext_resource type="Texture2D" uid="uid://beg36twmvwket" path="res://Assets/Kirby/knockout-1.png" id="17_mk1fn"]
[ext_resource type="AudioStream" uid="uid://du08pwh5pbxlk" path="res://Assets/Sounds/inhale.wav" id="17_tcnsa"]
[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/ko-2.png" id="18_enx47"]
-[ext_resource type="Texture2D" uid="uid://bqj81fpych85a" path="res://Assets/Kirby/star-small.png" id="18_jg7ph"]
-[ext_resource type="Texture2D" uid="uid://d0u6jw880abmk" path="res://Assets/Kirby/air-shoot.png" id="19_8bfby"]
-[ext_resource type="Texture2D" uid="uid://b2smrgiobqc24" path="res://Assets/Kirby/ko-3.png" id="19_b07rj"]
-[ext_resource type="Texture2D" uid="uid://dwnmiim6wpj3h" path="res://Assets/Kirby/ko-4.png" id="20_dcmki"]
+[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"]
[ext_resource type="AudioStream" uid="uid://5jbqiiboovpy" path="res://Assets/Sounds/hurt.wav" id="20_sg1wm"]
[ext_resource type="Texture2D" uid="uid://dtmf5p0rijuvw" path="res://Assets/Kirby/star-shot-02.png" id="21_v2p03"]
[ext_resource type="AudioStream" uid="uid://d2ag7ckd0pdc5" path="res://Assets/Sounds/no-hp.wav" id="21_y2drg"]
[ext_resource type="Texture2D" uid="uid://cmmuuidovdcar" path="res://Assets/Kirby/star-shot-03.png" id="22_rqvv1"]
[ext_resource type="Texture2D" uid="uid://cmf1wypv1ss5v" path="res://Assets/Kirby/star-shot-04.png" id="23_ro3gu"]
+[ext_resource type="Shape2D" uid="uid://dh71ux7ec8ydk" path="res://navigation_shape.tres" id="26_pm11k"]
[ext_resource type="AudioStream" uid="uid://bj2jgv8dxshqs" path="res://Assets/Sounds/digest.wav" id="27_7h7h2"]
[ext_resource type="Texture2D" uid="uid://cdhe6x01onj2o" path="res://Assets/Kirby/inhale-particles.png" id="28_6706u"]
[ext_resource type="AudioStream" uid="uid://ddiik30kw4ua" path="res://Assets/Sounds/shot-obstacle-hit.wav" id="28_nwt8e"]
[ext_resource type="AudioStream" uid="uid://denc1y7sjgm3o" path="res://Assets/Sounds/enter-door.wav" id="30_bqihm"]
-[ext_resource type="AudioStream" uid="uid://brufyhxonh3jr" path="res://Assets/Music/ko.wav" id="32_cphxk"]
+[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"]
[sub_resource type="Gradient" id="Gradient_1p6gt"]
offsets = PackedFloat32Array(0, 0.188525)
@@ -52,7 +59,7 @@ gradient = SubResource("Gradient_1p6gt")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_aoct8"]
particle_flag_disable_z = true
emission_shape = 3
-emission_box_extents = Vector3(8, 8, 1)
+emission_box_extents = Vector3(16, 5, 1)
angle_min = -243.4
angle_max = 1.07288e-05
direction = Vector3(-1, 0, 0)
@@ -68,6 +75,20 @@ resource_local_to_scene = true
animations = [{
"frames": [{
"duration": 1.0,
+"texture": ExtResource("3_xbxev")
+}, {
+"duration": 1.0,
+"texture": ExtResource("13_28jiy")
+}, {
+"duration": 1.0,
+"texture": ExtResource("1_wgfub")
+}],
+"loop": true,
+"name": &"digest",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
"texture": ExtResource("1_wgfub")
}],
"loop": true,
@@ -111,6 +132,17 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
+"texture": ExtResource("9_6xjk3")
+}, {
+"duration": 1.0,
+"texture": ExtResource("10_fgigi")
+}],
+"loop": true,
+"name": &"fly_exhale",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
"texture": ExtResource("3_cldu0")
}],
"loop": true,
@@ -119,6 +151,17 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
+"texture": ExtResource("12_qswnu")
+}, {
+"duration": 1.0,
+"texture": ExtResource("13_2mmwp")
+}],
+"loop": true,
+"name": &"inflated_exhale",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
"texture": ExtResource("8_vsb1l")
}],
"loop": true,
@@ -157,7 +200,7 @@ animations = [{
"texture": ExtResource("8_xxs7c")
}],
"loop": true,
-"name": &"inhale_exhale_transition",
+"name": &"inhale_transition",
"speed": 5.0
}, {
"frames": [{
@@ -182,7 +225,7 @@ animations = [{
"texture": ExtResource("20_dcmki")
}],
"loop": true,
-"name": &"ko",
+"name": &"knockout",
"speed": 8.0
}, {
"frames": [{
@@ -201,10 +244,18 @@ animations = [{
"loop": true,
"name": &"walk",
"speed": 6.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("30_jvald")
+}],
+"loop": false,
+"name": &"wall_bounce",
+"speed": 1.0
}]
-[sub_resource type="CircleShape2D" id="CircleShape2D_csxti"]
-radius = 7.0
+[sub_resource type="CircleShape2D" id="CircleShape2D_ncpg1"]
+radius = 8.0
[sub_resource type="CircleShape2D" id="CircleShape2D_vtlrr"]
radius = 8.0
@@ -232,12 +283,906 @@ animations = [{
"speed": 1.0
}]
-[sub_resource type="CircleShape2D" id="CircleShape2D_ncpg1"]
-radius = 8.0
-
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_wya0c"]
height = 24.0
+[sub_resource type="Animation" id="Animation_hqb8a"]
+length = 0.001
+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": [&"idle"]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("AnimatedSprite2D:position")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector2(0, 0)]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("AnimatedSprite2D:frame")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [0]
+}
+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": [7.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, 0)]
+}
+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, 0)]
+}
+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": [8.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, 0)]
+}
+
+[sub_resource type="Animation" id="Animation_hekxe"]
+resource_name = "digest"
+length = 0.15
+step = 0.05
+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": [&"digest"]
+}
+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.05, 0.1),
+"transitions": PackedFloat32Array(1, 1, 1),
+"update": 1,
+"values": [0, 1, 2]
+}
+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, 0.05, 0.1),
+"transitions": PackedFloat32Array(1, 1, 1),
+"update": 1,
+"values": [Vector2(-4, -9), Vector2(-4, -9), Vector2(0, 0)]
+}
+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, 0.05),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [12.0, 7.0]
+}
+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, 0.0492397),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(0, -4), Vector2(0, 0)]
+}
+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, 0.0492397),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(0, -4), Vector2(0, 0)]
+}
+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, 0.0484795),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [13.0, 8.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, 0.0484795),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(0, -4), Vector2(0, 0)]
+}
+
+[sub_resource type="Animation" id="Animation_qpvoi"]
+resource_name = "fly"
+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": [&"fly"]
+}
+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.5),
+"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, 0.5),
+"transitions": PackedFloat32Array(1, 1),
+"update": 1,
+"values": [Vector2(-4, -9), 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, -3)]
+}
+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_soeb7"]
+resource_name = "fly_exhale"
+length = 0.2
+step = 0.05
+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": [&"fly_exhale"]
+}
+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.1),
+"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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 1,
+"values": [Vector2(-4, -9), 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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [11.5, 7.0]
+}
+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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(0, -3), Vector2(0, 0)]
+}
+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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(0, -4), Vector2(0, 0)]
+}
+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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [12.0, 8.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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(0, -4), Vector2(0, 0)]
+}
+
+[sub_resource type="Animation" id="Animation_6ns5d"]
+resource_name = "idle"
+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": [&"idle"]
+}
+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_0m5e1"]
+resource_name = "inflated_exhale"
+length = 0.2
+step = 0.05
+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_exhale"]
+}
+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.1),
+"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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 1,
+"values": [Vector2(-4, -9), Vector2(0, -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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [11.5, 7.0]
+}
+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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(0, -4), Vector2(0, 0)]
+}
+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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(0, -4), Vector2(0, 0)]
+}
+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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [12.0, 8.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, 0.1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector2(0, -4), Vector2(0, 0)]
+}
+
+[sub_resource type="Animation" id="Animation_yio3y"]
+resource_name = "inflated_idle"
+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": [&"inflated_idle"]
+}
+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]
+}
+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
+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": [&"inhale"]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("AnimatedSprite2D:position")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector2(0, -8)]
+}
+
+[sub_resource type="Animation" id="Animation_hh52h"]
+resource_name = "inhale_transition"
+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": [&"inhale_transition"]
+}
+
+[sub_resource type="Animation" id="Animation_12scu"]
+resource_name = "jump"
+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": [&"jump"]
+}
+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]
+}
+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": 0,
+"values": [Vector2(0, 0)]
+}
+
+[sub_resource type="Animation" id="Animation_tb4uf"]
+resource_name = "walk"
+length = 0.8
+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": [&"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, 0.4, 0.6),
+"transitions": PackedFloat32Array(1, 1, 1, 1),
+"update": 1,
+"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
+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": [&"wall_bounce"]
+}
+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="AnimationLibrary" id="AnimationLibrary_gaqtm"]
+_data = {
+"RESET": SubResource("Animation_hqb8a"),
+"digest": SubResource("Animation_hekxe"),
+"fly": SubResource("Animation_qpvoi"),
+"fly_exhale": SubResource("Animation_soeb7"),
+"idle": SubResource("Animation_6ns5d"),
+"inflated_exhale": SubResource("Animation_0m5e1"),
+"inflated_idle": SubResource("Animation_yio3y"),
+"inflated_walk": SubResource("Animation_c5bfn"),
+"inhale": SubResource("Animation_73rqc"),
+"inhale_transition": SubResource("Animation_hh52h"),
+"jump": SubResource("Animation_12scu"),
+"walk": SubResource("Animation_tb4uf"),
+"wall_bounce": SubResource("Animation_kgxu5")
+}
+
[node name="Player" type="CharacterBody2D" groups=["player"]]
collision_mask = 18
script = ExtResource("1_d2vao")
@@ -245,7 +1190,7 @@ script = ExtResource("1_d2vao")
[node name="InhaleParticles" type="GPUParticles2D" parent="."]
unique_name_in_owner = true
texture_filter = 1
-position = Vector2(16, 0)
+position = Vector2(18, -2)
emitting = false
amount = 4
process_material = SubResource("ParticleProcessMaterial_aoct8")
@@ -256,62 +1201,77 @@ lifetime = 0.1
texture_filter = 1
sprite_frames = SubResource("SpriteFrames_nb512")
animation = &"idle"
+centered = false
+offset = Vector2(-8, -8)
+
+[node name="NavigationShape" type="CollisionShape2D" parent="."]
+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
-[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
-shape = SubResource("CircleShape2D_csxti")
+[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="."]
-collision_mask = 70
+collision_mask = 198
+
+[node name="CollisionShape" type="CollisionShape2D" parent="CollisionArea"]
+shape = ExtResource("26_pm11k")
[node name="Camera2D" type="Camera2D" parent="."]
limit_left = 0
drag_horizontal_enabled = true
drag_vertical_enabled = true
+drag_top_margin = 0.3
+drag_bottom_margin = 0.3
-[node name="Sounds" type="Node2D" parent="."]
+[node name="Sounds" type="Node" parent="."]
-[node name="SoundFall" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="SoundFall" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("9_t30y2")
volume_db = -2.0
-[node name="SoundFall2" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="SoundFall2" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("14_o43qk")
-[node name="SoundJump" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="SoundJump" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("10_gmv3e")
-[node name="SoundFly" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="SoundFly" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("15_wt8kq")
-[node name="SoundInhale" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="SoundInhale" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("17_tcnsa")
-[node name="SoundAirShot" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="SoundAirShot" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("18_b0jy8")
-[node name="SoundStarShot" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="SoundStarShot" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("18_8tquw")
-[node name="SoundHurt" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="SoundHurt" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("20_sg1wm")
-[node name="SoundNoHp" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="SoundNoHp" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("21_y2drg")
-[node name="SoundDigest" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="SoundDigest" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("27_7h7h2")
-[node name="ShotObstacleHit" type="AudioStreamPlayer2D" parent="Sounds"]
+[node name="ShotObstacleHit" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("28_nwt8e")
@@ -319,18 +1279,14 @@ stream = ExtResource("28_nwt8e")
unique_name_in_owner = true
stream = ExtResource("30_bqihm")
-[node name="SoundKO" type="AudioStreamPlayer" parent="Sounds"]
+[node name="SoundKnockout" type="AudioStreamPlayer" parent="Sounds"]
unique_name_in_owner = true
stream = ExtResource("32_cphxk")
-[node name="SpriteSmallStar" type="Sprite2D" parent="."]
-texture_filter = 1
-position = Vector2(0, 14)
-texture = ExtResource("18_jg7ph")
-
[node name="AirShot" type="Area2D" parent="."]
-position = Vector2(25, 0)
-collision_mask = 6
+position = Vector2(40, 0)
+collision_layer = 8
+collision_mask = 518
metadata/_edit_group_ = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="AirShot"]
@@ -341,8 +1297,9 @@ texture_filter = 1
texture = ExtResource("19_8bfby")
[node name="StarShot" type="Area2D" parent="."]
-position = Vector2(44, 0)
-collision_mask = 6
+position = Vector2(64, 0)
+collision_layer = 8
+collision_mask = 518
metadata/_edit_group_ = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="StarShot"]
@@ -356,23 +1313,32 @@ sprite_frames = SubResource("SpriteFrames_wtu0n")
position = Vector2(-1.19209e-07, 5.96046e-07)
scale = Vector2(0.7, 0.7)
-[node name="HurtArea" type="Area2D" parent="."]
-collision_mask = 34
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="HurtArea"]
-shape = SubResource("CircleShape2D_ncpg1")
-debug_color = Color(0.558997, 0.400513, 0.991197, 0.42)
-
[node name="InhaleArea" type="Area2D" parent="."]
unique_name_in_owner = true
-position = Vector2(16, 0)
+position = Vector2(18, 0)
collision_layer = 0
collision_mask = 6
metadata/_edit_group_ = true
-[node name="CollisionShape2D" type="CollisionShape2D" parent="InhaleArea"]
+[node name="InhaleShape" type="CollisionShape2D" parent="InhaleArea"]
shape = SubResource("CapsuleShape2D_wya0c")
+[node name="WallDetection" type="Node2D" parent="."]
+
+[node name="Left" type="RayCast2D" parent="WallDetection"]
+target_position = Vector2(-9, 0)
+collision_mask = 16
+
+[node name="Right" type="RayCast2D" parent="WallDetection"]
+target_position = Vector2(9, 0)
+collision_mask = 16
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+deterministic = true
+libraries = {
+"": SubResource("AnimationLibrary_gaqtm")
+}
+
[node name="CoyoteTimer" type="Timer" parent="."]
wait_time = 0.1
one_shot = true
@@ -380,4 +1346,10 @@ one_shot = true
[node name="InhaleMinDurationTimer" type="Timer" parent="."]
one_shot = true
+[node name="InvincibilityTimer" type="Timer" parent="."]
+one_shot = true
+
[connection signal="body_entered" from="HurtArea" to="." method="_on_hurt_area_body_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.gd b/SoundManager.gd
index b86c28d..7cb4abd 100644
--- a/SoundManager.gd
+++ b/SoundManager.gd
@@ -22,6 +22,8 @@ func play_background(sound_name: String):
# sound == current_background
elif not current_background.playing:
current_background.play()
+
+ #current_background.stop()
func fade_out(sound: AudioStreamPlayer):
diff --git a/SoundManager.tscn b/SoundManager.tscn
index 68257b4..810d8c9 100644
--- a/SoundManager.tscn
+++ b/SoundManager.tscn
@@ -1,11 +1,15 @@
-[gd_scene load_steps=9 format=3 uid="uid://ce0b23isfjn70"]
+[gd_scene load_steps=13 format=3 uid="uid://ce0b23isfjn70"]
[ext_resource type="Script" path="res://SoundManager.gd" id="1_640nc"]
[ext_resource type="AudioStream" uid="uid://denc1y7sjgm3o" path="res://Assets/Sounds/enter-door.wav" id="2_ca2ya"]
[ext_resource type="AudioStream" uid="uid://clqm7xm8mbhbs" path="res://Assets/Music/Green Greens-intro.wav" id="3_ahlnh"]
+[ext_resource type="AudioStream" uid="uid://b8q5db1h0ubyg" path="res://Assets/Sounds/boss-hp-fill.wav" id="3_at307"]
+[ext_resource type="AudioStream" uid="uid://5jbqiiboovpy" path="res://Assets/Sounds/hurt.wav" id="4_4b0ai"]
[ext_resource type="AudioStream" uid="uid://dpho4fr6kejhe" path="res://Assets/Music/Green Greens-loop.wav" id="4_snfo8"]
[ext_resource type="AudioStream" uid="uid://bit1m7y8bjcfg" path="res://Assets/Music/Float Islands-intro.wav" id="5_sogsx"]
[ext_resource type="AudioStream" uid="uid://c057hisnc5uru" path="res://Assets/Music/Float Islands-loop.wav" id="6_w1jca"]
+[ext_resource type="AudioStream" uid="uid://cd6c7eb8otlw7" path="res://Assets/Music/Boss.wav" id="9_q0rxb"]
+[ext_resource type="AudioStream" uid="uid://bdi83hcsq4yge" path="res://Assets/Music/Win.wav" id="10_8ig5v"]
[sub_resource type="AudioStreamInteractive" id="AudioStreamInteractive_2fhny"]
clip_count = 2
@@ -63,6 +67,12 @@ script = ExtResource("1_640nc")
[node name="EnterDoor" type="AudioStreamPlayer" parent="."]
stream = ExtResource("2_ca2ya")
+[node name="BossHpFill" type="AudioStreamPlayer" parent="."]
+stream = ExtResource("3_at307")
+
+[node name="Hurt" type="AudioStreamPlayer" parent="."]
+stream = ExtResource("4_4b0ai")
+
[node name="GreenGreens" type="AudioStreamPlayer" parent="."]
stream = SubResource("AudioStreamInteractive_2fhny")
volume_db = -5.0
@@ -70,3 +80,11 @@ volume_db = -5.0
[node name="FloatIslands" type="AudioStreamPlayer" parent="."]
stream = SubResource("AudioStreamInteractive_xhism")
volume_db = -5.0
+
+[node name="Boss" type="AudioStreamPlayer" parent="."]
+stream = ExtResource("9_q0rxb")
+volume_db = -5.0
+
+[node name="Win" type="AudioStreamPlayer" parent="."]
+stream = ExtResource("10_8ig5v")
+volume_db = -3.0
diff --git a/boss_hp.gd b/boss_hp.gd
new file mode 100644
index 0000000..12f094f
--- /dev/null
+++ b/boss_hp.gd
@@ -0,0 +1,10 @@
+extends Control
+
+
+func set_full():
+ $Full.visible = true
+ $Empty.visible = false
+
+func set_empty():
+ $Full.visible = false
+ $Empty.visible = true
diff --git a/boss_hp_bar.gd b/boss_hp_bar.gd
new file mode 100644
index 0000000..4cc4ec5
--- /dev/null
+++ b/boss_hp_bar.gd
@@ -0,0 +1,26 @@
+extends Control
+
+
+var max_hp: int
+
+@onready var hp_scene = preload("res://BossHP.tscn")
+
+
+func initialize(hp: int):
+ max_hp = hp
+
+ for child in $HBoxContainer.get_children():
+ $HBoxContainer.remove_child(child)
+
+ for n in range(hp):
+ SoundManager.play_sound("BossHpFill")
+ $HBoxContainer.add_child(hp_scene.instantiate())
+ await get_tree().create_timer(0.1).timeout
+
+ Game.boss_hp_changed.connect(func(new_hp):
+ for n in range(max_hp):
+ if n < new_hp:
+ $HBoxContainer.get_child(n).set_full()
+ else:
+ $HBoxContainer.get_child(n).set_empty()
+ )
diff --git a/effect_star.tscn b/effect_star.tscn
new file mode 100644
index 0000000..dc79e5c
--- /dev/null
+++ b/effect_star.tscn
@@ -0,0 +1,8 @@
+[gd_scene load_steps=2 format=3 uid="uid://csfnd62smasht"]
+
+[ext_resource type="Texture2D" uid="uid://bqj81fpych85a" path="res://Assets/Kirby/star-small.png" id="1_sstme"]
+
+[node name="SpriteSmallStar" type="Sprite2D"]
+texture_filter = 1
+position = Vector2(0, 24)
+texture = ExtResource("1_sstme")
diff --git a/float_islands.gd b/float_islands.gd
index d038570..532ab8d 100644
--- a/float_islands.gd
+++ b/float_islands.gd
@@ -12,8 +12,9 @@ func _ready() -> void:
SoundManager.play_background("FloatIslands")
if starting_position:
- player.position = starting_position
-
+ player.visual_position = starting_position
+
+ $Wall.visible = false
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
diff --git a/green_greens.gd b/green_greens.gd
index af9ea37..2f35176 100644
--- a/green_greens.gd
+++ b/green_greens.gd
@@ -11,7 +11,7 @@ func _ready() -> void:
SoundManager.play_background("GreenGreens")
if starting_position:
- player.position = starting_position
+ player.visual_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
@@ -35,3 +35,7 @@ func _on_area_2d_body_entered(body: Node2D) -> void:
if body is Player:
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()
diff --git a/green_greens_boss.gd b/green_greens_boss.gd
new file mode 100644
index 0000000..533c28f
--- /dev/null
+++ b/green_greens_boss.gd
@@ -0,0 +1,37 @@
+extends Node2D
+
+
+@export var starting_position: Vector2
+@export var fade_in_from_door: bool = false
+
+@onready var player = get_tree().get_first_node_in_group("player")
+
+
+func _ready() -> void:
+ SoundManager.play_background("Boss")
+
+ if starting_position:
+ player.visual_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
+ )
+
+ Game.boss_defeated.connect(func():
+ SoundManager.play_background("Win")
+ await SoundManager.current_background.finished
+ Game.transition_to_scene("res://FloatIslandsIntro.tscn")
+ )
diff --git a/hud.gd b/hud.gd
index d5f7cc3..72d5b96 100644
--- a/hud.gd
+++ b/hud.gd
@@ -2,6 +2,16 @@ extends CanvasLayer
func _ready() -> void:
+ %Score.text = str(Game.score)
+
Game.score_changed.connect(func():
%Score.text = str(Game.score)
)
+
+ Game.boss_initialized.connect(func(hp):
+ %BossHPBar.visible = true
+ %BossHPBar.initialize(hp)
+
+ $PanelContainer/VBoxContainer/Top/Left/Score.visible = false
+ $PanelContainer/VBoxContainer/Top/Left/Boss.visible = true
+ )
diff --git a/icon_monochrome_light.svg b/icon_monochrome_light.svg
new file mode 100644
index 0000000..4089fe4
--- /dev/null
+++ b/icon_monochrome_light.svg
@@ -0,0 +1 @@
+<svg height="1024" width="1024" xmlns="http://www.w3.org/2000/svg"><path d="m417.61523 76.875c-42.39203 9.424151-84.32671 22.54494-123.64257 42.33398.89912 34.71618 3.14362 67.97967 7.69336 101.76758-15.26846 9.78214-31.31507 18.17757-45.57618 29.62891-14.49005 11.14747-29.2896 21.81231-42.41015 34.84961-26.21196-17.33728-53.95467-33.6299-82.53516-48.01172C100.33705 270.59856 71.53124 306.38342 48 346.42773c18.493057 29.02877 38.32949 58.20569 56.69922 80.95899v197.7832 25.1211 22.86132c.44956.00417.89835.02088 1.34375.0625l150.66992 14.52735c7.89231.76176 14.07749 7.11448 14.62695 15.02343l4.64649 66.50977 131.42969 9.37891 9.05468-61.38672c1.17386-7.95891 8.00029-13.85742 16.05078-13.85742h158.96094c8.04633.0 14.87302 5.89851 16.04688 13.85742l9.05468 61.38672 131.4336-9.37891 4.64258-66.50977c.55362-7.90895 6.73464-14.25751 14.62695-15.02343l150.61133-14.52735c.4454-.04162.89028-.05833 1.33984-.0625v-19.61132l.0625-.01954V427.38672c21.2165-26.70928 41.30684-56.1715 56.69922-80.95899-23.52291-40.04431-52.34486-75.82917-83.15234-108.98437-28.57217 14.38182-56.32515 30.67444-82.53711 48.01172-13.11639-13.0373-27.88953-23.70214-42.40039-34.84961-14.25695-11.45134-30.32318-19.84677-45.5625-29.62891 4.53724-33.78791 6.7803-67.0514 7.68359-101.76758-39.32002-19.78904-81.24927-32.909829-123.66211-42.33398-16.9335 28.45977-32.41939 59.27922-45.90625 89.4082-15.99275-2.67239-32.05995-3.66203-48.14844-3.85351v-.02539c-.11239.0-.21676.02539-.3125.02539-.0999.0-.20478-.02539-.30468-.02539v.02539c-16.11763.19148-32.17106 1.18112-48.16797 3.85351-13.47854-30.12898-28.95559-60.94843-45.91407-89.4082zM298.41602 436.39844c50.15113.0 90.79882 40.61746 90.79882 90.75195.0 50.16779-40.64769 90.80859-90.79882 90.80859-50.12617.0-90.78711-40.6408-90.78711-90.80859.0-50.13449 40.66094-90.75195 90.78711-90.75195zm427.17773.0c50.122.0 90.7793 40.61746 90.7793 90.75195.0 50.16779-40.6573 90.80859-90.7793 90.80859-50.15946.0-90.80664-40.6408-90.80664-90.80859.0-50.13449 40.64718-90.75195 90.80664-90.75195zm-213.59961 53.10937c16.14261.0 29.25391 11.90816 29.25391 26.56055v83.58984c0 14.66488-13.1113 26.5625-29.25391 26.5625-16.1426.0-29.22656-11.89762-29.22656-26.5625v-83.58984c0-14.65239 13.08396-26.56055 29.22656-26.56055z" stroke-width="4.16261"/><path d="m0 0-1.121-16.063c-.135-1.936-1.675-3.477-3.611-3.616l-38.555-2.751c-.094-.007-.188-.01-.281-.01-1.916.0-3.569 1.406-3.852 3.33l-2.211 14.994H-81.09l-2.211-14.994c-.297-2.018-2.101-3.469-4.133-3.32l-38.555 2.751c-1.936.139-3.476 1.68-3.611 3.616L-130.721.0l-32.547 3.138c.015-3.498.06-7.33.06-8.093.0-34.374 43.605-50.896 97.781-51.086h.066.067c54.176.19 97.766 16.712 97.766 51.086.0.777.047 4.593.063 8.093z" fill="#010102" transform="matrix(4.162611 0 0 -4.162611 784.07144 718.723121)"/><path d="m0 0c0-7.994-6.479-14.473-14.479-14.473-7.996.0-14.479 6.479-14.479 14.473s6.483 14.479 14.479 14.479C-6.479 14.479.0 7.994.0.0" transform="matrix(4.162611 0 0 -4.162611 367.36686 532.537071)"/><path d="m0 0c0-7.994 6.477-14.473 14.471-14.473C22.473-14.473 28.95-7.994 28.95.0s-6.477 14.479-14.479 14.479C6.477 14.479.0 7.994.0.0" transform="matrix(4.162611 0 0 -4.162611 656.64056 532.537071)"/></svg> \ No newline at end of file
diff --git a/icon_monochrome_light.svg.import b/icon_monochrome_light.svg.import
new file mode 100644
index 0000000..6a52f26
--- /dev/null
+++ b/icon_monochrome_light.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dw38mfygfkecc"
+path="res://.godot/imported/icon_monochrome_light.svg-1bc1186db6bdec4d416aaeba554b075f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon_monochrome_light.svg"
+dest_files=["res://.godot/imported/icon_monochrome_light.svg-1bc1186db6bdec4d416aaeba554b075f.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
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/ko_plane.gd b/knockout_plane.gd
index 30ec748..30ec748 100644
--- a/ko_plane.gd
+++ b/knockout_plane.gd
diff --git a/navigation_shape.tres b/navigation_shape.tres
new file mode 100644
index 0000000..860042b
--- /dev/null
+++ b/navigation_shape.tres
@@ -0,0 +1,4 @@
+[gd_resource type="CircleShape2D" format=3 uid="uid://dh71ux7ec8ydk"]
+
+[resource]
+radius = 7.5
diff --git a/player.gd b/player.gd
index 9ca3553..9a06615 100644
--- a/player.gd
+++ b/player.gd
@@ -3,51 +3,81 @@ extends CharacterBody2D
signal hp_changed
+signal inhale_finished
-const MAX_SPEED = 80.0
+const MAX_SPEED = 70.0
const ACCELERATION = MAX_SPEED * 0.1
const DECELERATION = ACCELERATION
const JUMP_VELOCITY = -200.0
const MAX_AIR_SPEED = MAX_SPEED * 0.75
const FLY_VELOCITY = -80
const HURT_VELOCITY = MAX_SPEED * 5
+const MAX_WATER_SPEED = MAX_SPEED * 0.5
const MAX_GRAVITY = 300.0
const MAX_GRAVITY_AIR = 100.0
+const MAX_GRAVITY_WATER = 50.0
var previous_velocity: Vector2 = Vector2.ZERO
var jump_height_modifier: float
var last_direction: float = 1.0
var max_gravity: float = MAX_GRAVITY
+var max_up_velocity: float = MAX_GRAVITY * 2
+var previous_state: Dictionary = state_idle()
var current_state: Dictionary = state_idle():
set(new_state):
- if current_state.id != new_state.id:
- current_state.exit.call()
- new_state.enter.call()
- current_state = new_state
+ if current_state.id != "knockout": # final state
+ if current_state.id != new_state.id:
+ previous_state = current_state
+ current_state.exit.call()
+ new_state.enter.call()
+ current_state = new_state
var max_hp = 6
var hp = max_hp :
set(value):
hp = clamp(value, 0, max_hp)
hp_changed.emit()
-var sprite_small_star_base: Sprite2D
+var sprite_small_star_base: PackedScene
var air_shot_base: Area2D
var star_shot_base: Area2D
+var is_inhaling = false
+var is_flying = false :
+ set(value):
+ is_flying = value
+ set_collision_mask_value(8, value)
var is_inflated = false
var inhale_min_duration = 0.5
var does_inhale_transition = false
+var invincibility_duration = 0.6
+var is_invincible = false
+var did_wall_bounce = false
var entered_door: Node2D
+var blink_tween: Tween
+
+var visual_position: Vector2 :
+ get():
+ return Vector2(0, 0)
+ set(value):
+ position = value + Vector2(0, 0)
+
+var visual_global_position: Vector2 :
+ get():
+ return global_position + Vector2(0, 0)
+ set(value):
+ global_position = value - Vector2(0, 0)
+
+@onready var navigation_shape: CollisionShape2D = $NavigationShape
+
func _ready():
current_state = state_idle()
- sprite_small_star_base = $SpriteSmallStar.duplicate()
- $SpriteSmallStar.queue_free()
+ sprite_small_star_base = preload("res://effect_star.tscn")
air_shot_base = $AirShot.duplicate()
$AirShot.queue_free()
@@ -55,16 +85,16 @@ func _ready():
star_shot_base = $StarShot.duplicate()
$StarShot.queue_free()
- hp = max_hp # to set UI labels
-
- $CollisionArea.add_child($CollisionShape2D.duplicate())
+ $InvincibilityTimer.wait_time = invincibility_duration
func _physics_process(delta: float) -> void:
# Add the gravity.
if not is_on_floor():
velocity += get_gravity() * delta
- velocity.y = min(velocity.y, max_gravity)
+ if is_flying:
+ velocity -= (get_gravity() * delta) / 1.5
+ velocity.y = clamp(velocity.y, -max_up_velocity, max_gravity)
previous_velocity = velocity
current_state.process.call(delta)
@@ -78,7 +108,7 @@ func apply_directional_movement(max_speed = MAX_SPEED):
else:
$AnimatedSprite2D.flip_h = false
- if sign(direction) != sign(last_direction):
+ if sign(direction) != sign(last_direction): # no slidey-ness
velocity.x = 0
velocity.x = move_toward(velocity.x, direction * max_speed, ACCELERATION)
@@ -98,8 +128,8 @@ func apply_jump_height_modification():
func spawn_small_star():
- var star := sprite_small_star_base.duplicate()
- star.global_position = global_position
+ var star := sprite_small_star_base.instantiate()
+ star.global_position = visual_global_position
get_tree().current_scene.add_child(star)
var tween = get_tree().create_tween()
var target_x = randi_range(-1, 1) * 16
@@ -117,13 +147,28 @@ func spawn_small_star():
func air_shot(direction: float):
var shot = air_shot_base.duplicate() as Area2D
- shot.global_position = global_position
+ shot.global_position = visual_global_position
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):
+ Game.score += 400
+ %ShotObstacleHit.play()
+ tween.stop()
+
+ if node.has_method("hit_by_projectile"):
+ node.hit_by_projectile(shot.global_position)
+ else:
+ 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",
@@ -132,12 +177,13 @@ func air_shot(direction: float):
).set_ease(Tween.EASE_OUT)
tween.tween_callback(func():
await get_tree().create_timer(0.2).timeout
- shot.queue_free()
+ if is_instance_valid(shot):
+ shot.queue_free()
)
func star_shot(direction: float):
var shot = star_shot_base.duplicate() as Area2D
- shot.global_position = global_position
+ shot.global_position = visual_global_position
get_tree().current_scene.add_child(shot)
%SoundStarShot.play()
@@ -145,13 +191,19 @@ func star_shot(direction: float):
var tween = get_tree().create_tween()
- shot.body_entered.connect(func(body):
- Game.score += randi_range(100, 1000)
+ var shot_hit = func(node):
+ Game.score += 400
%ShotObstacleHit.play()
tween.stop()
+
+ if node.has_method("hit_by_projectile"):
+ node.hit_by_projectile(shot.global_position)
+ else:
+ Game.hit_enemy(node, shot.global_position)
+
shot.queue_free()
- body.queue_free()
- )
+ shot.body_entered.connect(shot_hit)
+ shot.area_entered.connect(shot_hit)
shot.get_node("StarShotVisibleNotifier").screen_exited.connect(func():
if is_instance_valid(shot):
@@ -182,12 +234,73 @@ func check_door_enter():
return null
+func start_blink():
+ blink_tween = get_tree().create_tween()
+ blink_tween.tween_property($AnimatedSprite2D, "self_modulate", Color(1, 1, 1, 0.2), 0.1)
+ blink_tween.tween_property($AnimatedSprite2D, "self_modulate", Color(1, 1, 1, 0.8), 0.1)
+
+ await blink_tween.finished
+ start_blink()
+
+func stop_blink():
+ blink_tween.stop()
+ $AnimatedSprite2D.self_modulate = Color(1, 1, 1, 1)
+
+
+func inhale(node: CollisionObject2D):
+ node.collision_layer = 0
+
+ var position_difference = node.global_position - global_position
+ if position_difference.length() > 25:
+ var tween = get_tree().create_tween()
+ tween.tween_property(
+ node,
+ "global_position",
+ global_position + (Vector2(1, 0) * 16 * sign(last_direction)),
+ (node.global_position - global_position).normalized().length() * 0.25
+ )
+ await tween.finished
+ else:
+ await get_tree().create_timer(0.1).timeout
+
+ node.queue_free()
+
+ Game.score += 200
+
+ inhale_finished.emit()
+
+
+func wall_bounce_check():
+ return abs(previous_velocity.x) > 0 and is_on_wall()
+ #if not did_wall_bounce and abs(previous_velocity.x) > 0 and is_on_wall():
+ #%SoundFall.play()
+ #spawn_small_star()
+ #$AnimationPlayer.play("wall_bounce")
+ #did_wall_bounce = true
+ #get_tree().create_timer(0.1).timeout.connect(func():
+ #did_wall_bounce = false
+ #)
+ #
+ #return true
+ #
+ #return false
+
+
func _on_hurt_area_body_entered(body: Node2D) -> void:
if body.is_in_group("enemy"):
- current_state.id = "" # to force trigger state change into hurt
- current_state = state_hurt({"collider": body})
+ if is_invincible:
+ %ShotObstacleHit.play()
+ body.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 = state_ko()
+ current_state = state_knockout()
+
+
+func _on_invincibility_timer_timeout() -> void:
+ stop_blink()
+ is_invincible = false
func state_idle():
@@ -195,14 +308,16 @@ func state_idle():
"id": "idle",
"enter": func():
is_inflated = false
- $AnimatedSprite2D.play("idle")
+ $AnimationPlayer.play("idle")
,
"process": func(_delta):
velocity.x = move_toward(velocity.x, 0, DECELERATION)
move_and_slide()
var direction = Input.get_axis("ui_left", "ui_right")
- if direction:
+ if (direction and
+ ((direction == -1 and not $WallDetection/Left.is_colliding()) or
+ (direction == 1 and not $WallDetection/Right.is_colliding()))):
current_state = state_walk()
if check_door_enter():
@@ -229,7 +344,7 @@ func state_walk():
return {
"id": "walk",
"enter": func():
- $AnimatedSprite2D.play("walk")
+ $AnimationPlayer.play("walk")
,
"process": func(_delta):
var direction = apply_directional_movement()
@@ -241,6 +356,9 @@ func state_walk():
if velocity.x == 0:
current_state = state_idle()
+ if wall_bounce_check():
+ current_state = state_wall_bounce(state_idle())
+
if check_door_enter():
current_state = state_enter_door()
elif Input.is_action_just_pressed("jump"):
@@ -267,7 +385,7 @@ func state_jump():
"id": "jump",
"enter": func():
%SoundJump.play()
- $AnimatedSprite2D.play("jump")
+ $AnimationPlayer.play("jump")
velocity.y = JUMP_VELOCITY
jump_height_modifier = JUMP_VELOCITY
,
@@ -276,6 +394,9 @@ func state_jump():
apply_directional_movement()
move_and_slide()
+ if wall_bounce_check():
+ current_state = state_wall_bounce(state_fall())
+
if Input.is_action_just_pressed("jump"):
velocity.y = FLY_VELOCITY
%SoundFly.play()
@@ -297,7 +418,7 @@ func state_fall():
return {
"id": "fall",
"enter": func():
- $AnimatedSprite2D.play("jump")
+ $AnimationPlayer.play("jump")
,
"process": func(_delta):
if not $CoyoteTimer.is_stopped() and Input.is_action_just_pressed("jump"):
@@ -311,22 +432,50 @@ func state_fall():
if Input.is_action_just_pressed("inhale_exhale"):
current_state = state_inhale()
- if velocity.y >= MAX_GRAVITY:
+ if velocity.y >= MAX_GRAVITY * 0.9:
$AnimatedSprite2D.play("fall")
+ is_invincible = true
apply_directional_movement(MAX_AIR_SPEED)
move_and_slide()
+ if wall_bounce_check():
+ current_state = state_wall_bounce(state_fall())
+
if is_on_floor():
+ spawn_small_star()
if $AnimatedSprite2D.animation == "fall":
%SoundFall2.play()
+ current_state = state_bump()
else:
%SoundFall.play()
+ current_state = state_idle()
+ ,
+ "exit": func():
+ pass
+ ,
+ }
+
+
+func state_bump():
+ return {
+ "id": "bump",
+ "enter": func():
+ $AnimatedSprite2D.play("fall")
+ velocity = Vector2(sign(last_direction), -1) * clamp(velocity.x * 1.5, MAX_SPEED * 0.75, MAX_SPEED)
+ ,
+ "process": func(_delta):
+ move_and_slide()
+
+ if is_on_floor():
+ #velocity.x = 0
+ %SoundFall.play()
spawn_small_star()
current_state = state_idle()
,
"exit": func():
- pass
+ if $InvincibilityTimer.is_stopped():
+ is_invincible = false
,
}
@@ -338,7 +487,7 @@ func state_duck():
$AnimatedSprite2D.play("duck")
,
"process": func(_delta):
- if Input.is_action_just_released("duck"):
+ if not Input.is_action_pressed("duck"):
current_state = state_idle()
,
"exit": func():
@@ -351,17 +500,16 @@ func state_fly_idle():
return {
"id": "fly_idle",
"enter": func():
+ is_flying = true
max_gravity = MAX_GRAVITY_AIR
- $AnimatedSprite2D.play("fly")
+ $AnimationPlayer.play("fly")
,
- "process": func(delta):
- velocity -= (get_gravity() * delta) / 1.5
-
+ "process": func(_delta):
if check_door_enter():
current_state = state_enter_door()
elif Input.is_action_just_pressed("jump"):
velocity.y = FLY_VELOCITY
- $AnimatedSprite2D.play("fly")
+ $AnimationPlayer.play("fly")
%SoundFly.play()
velocity.x = move_toward(velocity.x, 0, DECELERATION)
@@ -373,9 +521,11 @@ func state_fly_idle():
if Input.is_action_just_pressed("inhale_exhale"):
air_shot(last_direction)
- current_state = state_idle()
+ current_state = state_fly_exhale()
,
"exit": func():
+ $AnimationPlayer.play("RESET")
+ is_flying = false
max_gravity = MAX_GRAVITY
,
}
@@ -385,11 +535,12 @@ func state_fly_walk():
return {
"id": "fly_walk",
"enter": func():
+ is_flying = true
max_gravity = MAX_GRAVITY_AIR
- $AnimatedSprite2D.play("fly")
+ $AnimationPlayer.play("fly")
,
- "process": func(delta):
- velocity -= (get_gravity() * delta) / 1.5
+ "process": func(_delta):
+ #velocity -= (get_gravity() * delta) / 1.5
velocity.y = min(velocity.y, 100)
if check_door_enter():
@@ -400,48 +551,60 @@ func state_fly_walk():
var direction = apply_directional_movement(MAX_AIR_SPEED)
if direction:
- $AnimatedSprite2D.play("fly")
+ $AnimationPlayer.play("fly")
move_and_slide()
else:
current_state = state_fly_idle()
if Input.is_action_just_pressed("inhale_exhale"):
air_shot(last_direction)
- current_state = state_walk()
+ current_state = state_fly_exhale()
,
"exit": func():
+ is_flying = false
max_gravity = MAX_GRAVITY
,
}
func state_fly_exhale():
- # todo: play animation, can't move during that, fly gravity applies?
- # goto idle state? fall state?
- return {}
+ return {
+ "id": "fly_exhale",
+ "enter": func():
+ $AnimationPlayer.play("fly_exhale")
+ await $AnimationPlayer.animation_finished
+ current_state = state_idle()
+ ,
+ "process": func(_delta):
+ move_and_slide()
+ ,
+ "exit": func():
+ pass
+ ,
+ }
func state_inhale():
return {
"id": "inhale",
"enter": func():
+ is_inhaling = true
+
$InhaleMinDurationTimer.wait_time = inhale_min_duration
$InhaleMinDurationTimer.start()
- #$AnimationPlayer.play("inhale")
- $AnimatedSprite2D.play("inhale")
+ $AnimationPlayer.play("inhale")
%SoundInhale.play()
%SoundInhale.finished.connect(func():
- #$SoundInhaleContinue.play()
%SoundInhale.play()
)
- %InhaleArea.position.x = abs(%InhaleArea.position.x) * sign(last_direction)
+ %InhaleArea.position.x = visual_position.x + (abs(visual_position.x - %InhaleArea.position.x) * sign(last_direction))
%InhaleParticles.process_material.gravity.x = - (
abs(%InhaleParticles.process_material.gravity.x) * sign(last_direction)
)
- %InhaleParticles.position.x = abs(%InhaleParticles.position.x) * sign(last_direction)
+ %InhaleParticles.position.x = visual_position.x + (abs(visual_position.x - %InhaleParticles.position.x) * sign(last_direction))
%InhaleParticles.restart()
%InhaleParticles.emitting = true
,
@@ -453,10 +616,9 @@ func state_inhale():
if bodies.size() > 0:
does_inhale_transition = true
for body in bodies:
- body.queue_free()
- Game.score += randi_range(10, 100)
- # todo: stop process? -> remove collision -> inhale aka move towards center player -> queue_free
- await get_tree().create_timer(inhale_min_duration).timeout
+ inhale(body)
+ await inhale_finished
+ await get_tree().create_timer(inhale_min_duration / 2).timeout
current_state = state_inflated_idle()
return
@@ -467,6 +629,9 @@ func state_inhale():
current_state = state_idle()
,
"exit": func():
+ #$AnimationTree.get("parameters/playback").travel("idle")
+ $AnimationPlayer.play("RESET")
+ is_inhaling = false
%SoundInhale.stop()
%InhaleParticles.emitting = false
does_inhale_transition = false
@@ -479,7 +644,7 @@ func state_inflated_idle():
"id": "inflated_idle",
"enter": func():
is_inflated = true
- $AnimatedSprite2D.play("inflated_idle")
+ $AnimationPlayer.play("inflated_idle")
,
"process": func(_delta):
velocity.x = move_toward(velocity.x, 0, DECELERATION)
@@ -495,15 +660,14 @@ func state_inflated_idle():
current_state = state_inflated_jump()
if not is_on_floor():
- #current_state = state_inflated_fall()
- current_state = state_inflated_jump()
+ current_state = state_inflated_fall()
if Input.is_action_pressed("duck"):
current_state = state_digest()
if Input.is_action_just_pressed("inhale_exhale"):
star_shot(last_direction)
- current_state = state_idle()
+ current_state = state_inflated_exhale()
,
"exit": func():
is_inflated = false
@@ -516,7 +680,7 @@ func state_inflated_walk():
"id": "inflated_walk",
"enter": func():
is_inflated = true
- $AnimatedSprite2D.play("inflated_walk")
+ $AnimationPlayer.play("inflated_walk")
,
"process": func(_delta):
var direction = apply_directional_movement()
@@ -539,7 +703,7 @@ func state_inflated_walk():
if Input.is_action_just_pressed("inhale_exhale"):
star_shot(last_direction)
- current_state = state_idle()
+ current_state = state_inflated_exhale()
,
"exit": func():
is_inflated = false
@@ -564,7 +728,7 @@ func state_inflated_jump():
if Input.is_action_just_pressed("inhale_exhale"):
star_shot(last_direction)
- current_state = state_fall()
+ current_state = state_inflated_exhale()
elif velocity.y >= 0:
current_state = state_inflated_fall()
@@ -588,7 +752,7 @@ func state_inflated_fall():
if Input.is_action_just_pressed("inhale_exhale"):
star_shot(last_direction)
- current_state = state_fall()
+ current_state = state_inflated_exhale()
apply_directional_movement(MAX_AIR_SPEED)
move_and_slide()
@@ -604,6 +768,23 @@ func state_inflated_fall():
}
+func state_inflated_exhale():
+ return {
+ "id": "inflated_exhale",
+ "enter": func():
+ $AnimationPlayer.play("inflated_exhale")
+ await $AnimationPlayer.animation_finished
+ current_state = state_idle()
+ ,
+ "process": func(_delta):
+ move_and_slide()
+ ,
+ "exit": func():
+ pass
+ ,
+ }
+
+
func state_digest():
return {
"id": "digest",
@@ -611,10 +792,13 @@ func state_digest():
%SoundDigest.play()
is_inflated = false
hp += 1
- Game.score += randi_range(10, 100)
+ Game.score += 100
+ $AnimationPlayer.play("digest")
+ await $AnimationPlayer.animation_finished
+ current_state = state_duck()
,
"process": func(_delta):
- current_state = state_duck()
+ move_and_slide() # animation position adjustment
,
"exit": func():
pass
@@ -626,12 +810,15 @@ func state_hurt(data):
return {
"id": "hurt",
"enter": func():
+ is_invincible = true
+ $InvincibilityTimer.start()
+
if data.collider.is_in_group("enemy"):
data.collider.queue_free()
hp -= 1
if hp == 0:
- current_state = state_ko()
+ current_state = state_knockout()
return
else:
%SoundHurt.play()
@@ -641,25 +828,39 @@ func state_hurt(data):
else:
$AnimatedSprite2D.play("jump")
- var impulse = sign(global_position - data.collider.global_position) * HURT_VELOCITY
+ var impulse = sign(visual_global_position - data.collider.global_position) * HURT_VELOCITY
velocity.x = impulse.x
velocity.y = -100
move_and_slide()
velocity.x = 0
- var tween = get_tree().create_tween()
- tween.tween_property($AnimatedSprite2D, "self_modulate", Color(1, 1, 1, 0.2), 0.1)
- tween.tween_property($AnimatedSprite2D, "self_modulate", Color(1, 1, 1, 0.8), 0.1)
- tween.tween_property($AnimatedSprite2D, "self_modulate", Color(1, 1, 1, 0.2), 0.1)
- tween.tween_property($AnimatedSprite2D, "self_modulate", Color(1, 1, 1, 0.8), 0.1)
- tween.tween_callback(func():
- $AnimatedSprite2D.self_modulate = Color(1, 1, 1, 1)
- if is_inflated:
- current_state = state_inflated_idle()
- else:
- current_state = state_idle()
- )
+ start_blink()
+ await get_tree().create_timer(0.4).timeout
+ if is_inflated:
+ current_state = state_inflated_idle()
+ else:
+ current_state = state_idle()
+ ,
+ "process": func(_delta):
+ move_and_slide()
+ ,
+ "exit": func():
+ pass
+ ,
+ }
+
+
+func state_wall_bounce(return_state):
+ return {
+ "id": "wall_bounce",
+ "enter": func():
+ %SoundFall.play()
+ spawn_small_star()
+ $AnimationPlayer.play("wall_bounce")
+ await $AnimationPlayer.animation_finished
+
+ current_state = return_state
,
"process": func(_delta):
move_and_slide()
@@ -669,6 +870,68 @@ func state_hurt(data):
,
}
+
+func state_water_idle():
+ return {
+ "id": "water_idle",
+ "enter": func():
+ max_gravity = MAX_GRAVITY_WATER
+ $AnimationPlayer.play("walk")
+ ,
+ "process": func(_delta):
+ if check_door_enter():
+ current_state = state_enter_door()
+ elif Input.is_action_just_pressed("jump"):
+ %SoundJump.play()
+ velocity.y -= MAX_GRAVITY_WATER * 2
+
+ velocity.x = move_toward(velocity.x, 0, DECELERATION)
+ move_and_slide()
+
+ if velocity.length() > 0:
+ $AnimationPlayer.play("walk")
+ else:
+ $AnimationPlayer.play("idle")
+
+ var direction = Input.get_axis("ui_left", "ui_right")
+ if direction:
+ current_state = state_water_swim()
+ ,
+ "exit": func():
+ max_gravity = MAX_GRAVITY
+ ,
+ }
+
+
+func state_water_swim():
+ return {
+ "id": "water_swim",
+ "enter": func():
+ max_gravity = MAX_GRAVITY_WATER
+ $AnimationPlayer.play("walk")
+ ,
+ "process": func(_delta):
+ if check_door_enter():
+ current_state = state_enter_door()
+ elif Input.is_action_just_pressed("jump"):
+ %SoundJump.play()
+ velocity.y -= MAX_GRAVITY_WATER * 2
+
+ var direction = apply_directional_movement()
+ if direction:
+ move_and_slide()
+ else:
+ velocity.x = move_toward(velocity.x, 0, DECELERATION)
+ move_and_slide()
+ if velocity.x == 0:
+ current_state = state_water_idle()
+ ,
+ "exit": func():
+ max_gravity = MAX_GRAVITY
+ ,
+ }
+
+
func state_enter_door():
return {
"id": "enter_door",
@@ -705,45 +968,46 @@ func state_exit_door():
,
}
-func state_ko():
+
+func state_knockout():
return {
- "id": "ko",
+ "id": "knockout",
"enter": func():
SoundManager.current_background.stop()
- $AnimatedSprite2D.play("ko")
+ $AnimatedSprite2D.play("knockout")
$AnimatedSprite2D.stop()
$AnimatedSprite2D.set_frame_and_progress(0, 0)
%SoundNoHp.play()
await %SoundNoHp.finished
- $AnimatedSprite2D.play("ko")
+ $AnimatedSprite2D.play("knockout")
$Camera2D.drag_top_margin = 1.0
var tween = get_tree().create_tween()
- var to_up_difference = global_position.y - 16
- var to_down_difference = global_position.y + get_viewport_rect().size.y
+ 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,
- "global_position",
+ "visual_global_position",
Vector2(
- global_position.x,
+ visual_global_position.x,
to_up_difference
),
(to_up_difference / to_down_difference) * 1.0
)
tween.tween_property(
self,
- "global_position",
+ "visual_global_position",
Vector2(
- global_position.x,
+ visual_global_position.x,
to_down_difference
),
1.0
)
- %SoundKO.play()
- await %SoundKO.finished
+ %SoundKnockout.play()
+ await %SoundKnockout.finished
Game.transition_to_scene(
get_tree().current_scene.scene_file_path.replace(".tscn", "Intro.tscn")
@@ -756,3 +1020,19 @@ func state_ko():
pass
,
}
+
+
+func _on_collision_area_body_entered(body: Node2D) -> void:
+ if body is TileMapLayer:
+ current_state = state_water_idle()
+
+func _on_collision_area_body_exited(body: Node2D) -> void:
+ if body is TileMapLayer:
+ (func():
+ var bodies: Array = $CollisionArea.get_overlapping_bodies()
+ bodies = bodies.filter(func(value):
+ return value is TileMapLayer
+ )
+ if bodies.is_empty():
+ current_state = state_jump()
+ ).call_deferred()
diff --git a/project.godot b/project.godot
index 4597f73..11d8326 100644
--- a/project.godot
+++ b/project.godot
@@ -8,6 +8,10 @@
config_version=5
+[animation]
+
+warnings/check_invalid_track_paths=false
+
[application]
config/name="Kirby"
@@ -64,9 +68,12 @@ up={
2d_physics/layer_1="Player"
2d_physics/layer_2="Enemy"
2d_physics/layer_3="Object"
+2d_physics/layer_4="PlayerProjectile"
2d_physics/layer_5="Ground"
2d_physics/layer_6="KOPlane"
2d_physics/layer_7="Door"
+2d_physics/layer_8="Water"
+2d_physics/layer_10="Boss"
[physics]
diff --git a/whispy_woods.gd b/whispy_woods.gd
new file mode 100644
index 0000000..b5f4058
--- /dev/null
+++ b/whispy_woods.gd
@@ -0,0 +1,58 @@
+extends Area2D
+
+
+var hp: int = 6 :
+ set(value):
+ hp = value
+ Game.boss_hp_changed.emit(hp)
+
+
+func _ready() -> void:
+ Game.boss_initialized.emit(hp)
+
+
+func _process(_delta: float) -> void:
+ # TODO: spawn apples
+ # TODO: blow wind
+ pass
+
+
+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(
+ effect_star,
+ "global_position",
+ effect_star.global_position + direction * 16,
+ 0.1
+ )
+ tween.tween_callback(func():
+ effect_star.queue_free()
+ )
+
+ SoundManager.play_sound("Hurt")
+
+ hp -= 1
+
+ $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)
+ tween.tween_property(self, "modulate", Color(1, 1, 1, 0.8), 0.1)
+ tween.tween_property(self, "modulate", Color(1, 1, 1, 0.2), 0.1)
+ tween.tween_property(self, "modulate", Color(1, 1, 1, 0.8), 0.1)
+
+ if hp > 0:
+ tween.tween_callback(func():
+ modulate = Color(1, 1, 1, 1.0)
+ $EyeRight.play("eye_open")
+ $Mouth.play("mouth_idle")
+ $Tear.visible = false
+ )
+ elif hp <= 0:
+ Game.boss_defeated.emit()
diff --git a/whispy_woods_sprite_frames.tres b/whispy_woods_sprite_frames.tres
new file mode 100644
index 0000000..4886a71
--- /dev/null
+++ b/whispy_woods_sprite_frames.tres
@@ -0,0 +1,41 @@
+[gd_resource type="SpriteFrames" load_steps=5 format=3 uid="uid://bi6050716beom"]
+
+[ext_resource type="Texture2D" uid="uid://duscdq6p858dt" path="res://Assets/Enemies/whispy-woods-eye-02.png" id="1_yjx1b"]
+[ext_resource type="Texture2D" uid="uid://bpr1plfnw77fh" path="res://Assets/Enemies/whispy-woods-eye-01.png" id="2_g2etd"]
+[ext_resource type="Texture2D" uid="uid://c547eyj1dga2p" path="res://Assets/Enemies/whispy-woods-mouth-01.png" id="3_xrihg"]
+[ext_resource type="Texture2D" uid="uid://qxh5qqh8oso" path="res://Assets/Enemies/whispy-woods-mouth-02.png" id="4_53nbh"]
+
+[resource]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("1_yjx1b")
+}],
+"loop": false,
+"name": &"eye_closed",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("2_g2etd")
+}],
+"loop": false,
+"name": &"eye_open",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("3_xrihg")
+}],
+"loop": false,
+"name": &"mouth_idle",
+"speed": 5.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("4_53nbh")
+}],
+"loop": true,
+"name": &"mouth_shoot",
+"speed": 5.0
+}]