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