diff --git a/assets/gardens/animals/ant_body.png b/assets/gardens/animals/ant_body.png new file mode 100644 index 00000000..e5f31785 Binary files /dev/null and b/assets/gardens/animals/ant_body.png differ diff --git a/assets/lesson_screen/top_right.png.import b/assets/gardens/animals/ant_body.png.import similarity index 73% rename from assets/lesson_screen/top_right.png.import rename to assets/gardens/animals/ant_body.png.import index 03abd99d..fa14d2ba 100644 --- a/assets/lesson_screen/top_right.png.import +++ b/assets/gardens/animals/ant_body.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://rux5delnabp5" -path="res://.godot/imported/top_right.png-a3fce06eb378a6a99fc8fd188e21fb8c.ctex" +uid="uid://d1j23o6nq476v" +path="res://.godot/imported/ant_body.png-dad00fa87392efb7e152045fa1f6b084.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/lesson_screen/top_right.png" -dest_files=["res://.godot/imported/top_right.png-a3fce06eb378a6a99fc8fd188e21fb8c.ctex"] +source_file="res://assets/gardens/animals/ant_body.png" +dest_files=["res://.godot/imported/ant_body.png-dad00fa87392efb7e152045fa1f6b084.ctex"] [params] diff --git a/assets/gardens/animals/ant_face.png b/assets/gardens/animals/ant_face.png new file mode 100644 index 00000000..db52694d Binary files /dev/null and b/assets/gardens/animals/ant_face.png differ diff --git a/assets/lesson_screen/top_left.png.import b/assets/gardens/animals/ant_face.png.import similarity index 73% rename from assets/lesson_screen/top_left.png.import rename to assets/gardens/animals/ant_face.png.import index 7f8ebbf4..1cf6d29f 100644 --- a/assets/lesson_screen/top_left.png.import +++ b/assets/gardens/animals/ant_face.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dkomjpclxvmqf" -path="res://.godot/imported/top_left.png-2ca3f2b1716a8a640fa40c3a481bc4d9.ctex" +uid="uid://by3xfdin7jrsn" +path="res://.godot/imported/ant_face.png-b00fa29a7fcfe1e19ec19735f3395466.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/lesson_screen/top_left.png" -dest_files=["res://.godot/imported/top_left.png-2ca3f2b1716a8a640fa40c3a481bc4d9.ctex"] +source_file="res://assets/gardens/animals/ant_face.png" +dest_files=["res://.godot/imported/ant_face.png-b00fa29a7fcfe1e19ec19735f3395466.ctex"] [params] diff --git a/assets/gardens/animals/caterpillar_body.png b/assets/gardens/animals/caterpillar_body.png new file mode 100644 index 00000000..4e5e4897 Binary files /dev/null and b/assets/gardens/animals/caterpillar_body.png differ diff --git a/assets/gardens/animals/caterpillar_body.png.import b/assets/gardens/animals/caterpillar_body.png.import new file mode 100644 index 00000000..2c501777 --- /dev/null +++ b/assets/gardens/animals/caterpillar_body.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6nrx0dn0h3f2" +path="res://.godot/imported/caterpillar_body.png-c691b990e51d372f5dfdafa881ea6750.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/caterpillar_body.png" +dest_files=["res://.godot/imported/caterpillar_body.png-c691b990e51d372f5dfdafa881ea6750.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/caterpillar_face.png b/assets/gardens/animals/caterpillar_face.png new file mode 100644 index 00000000..4f070616 Binary files /dev/null and b/assets/gardens/animals/caterpillar_face.png differ diff --git a/assets/gardens/animals/caterpillar_face.png.import b/assets/gardens/animals/caterpillar_face.png.import new file mode 100644 index 00000000..f83f9ca2 --- /dev/null +++ b/assets/gardens/animals/caterpillar_face.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnihbmks0piwi" +path="res://.godot/imported/caterpillar_face.png-d383b965d4555da185ab647f352d95f3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/caterpillar_face.png" +dest_files=["res://.godot/imported/caterpillar_face.png-d383b965d4555da185ab647f352d95f3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/crab_body.png b/assets/gardens/animals/crab_body.png new file mode 100644 index 00000000..656f8af6 Binary files /dev/null and b/assets/gardens/animals/crab_body.png differ diff --git a/assets/gardens/animals/crab_body.png.import b/assets/gardens/animals/crab_body.png.import new file mode 100644 index 00000000..90ea3770 --- /dev/null +++ b/assets/gardens/animals/crab_body.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2e61oot7ht35" +path="res://.godot/imported/crab_body.png-d5ff5fcdad64e46336ef16b4a3fb00c7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/crab_body.png" +dest_files=["res://.godot/imported/crab_body.png-d5ff5fcdad64e46336ef16b4a3fb00c7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/crab_face.png b/assets/gardens/animals/crab_face.png new file mode 100644 index 00000000..cdc629c5 Binary files /dev/null and b/assets/gardens/animals/crab_face.png differ diff --git a/assets/lesson_screen/bottom.png.import b/assets/gardens/animals/crab_face.png.import similarity index 73% rename from assets/lesson_screen/bottom.png.import rename to assets/gardens/animals/crab_face.png.import index ff9b18a5..67464eed 100644 --- a/assets/lesson_screen/bottom.png.import +++ b/assets/gardens/animals/crab_face.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://cqhbpt3lk6f15" -path="res://.godot/imported/bottom.png-3c7c71fa24e23ae34adb1d444da0b3db.ctex" +uid="uid://ruclqu4dc13u" +path="res://.godot/imported/crab_face.png-405026ec02e80559c79371d1bab55844.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/lesson_screen/bottom.png" -dest_files=["res://.godot/imported/bottom.png-3c7c71fa24e23ae34adb1d444da0b3db.ctex"] +source_file="res://assets/gardens/animals/crab_face.png" +dest_files=["res://.godot/imported/crab_face.png-405026ec02e80559c79371d1bab55844.ctex"] [params] diff --git a/assets/gardens/animals/frog_body.png b/assets/gardens/animals/frog_body.png new file mode 100644 index 00000000..4738bc83 Binary files /dev/null and b/assets/gardens/animals/frog_body.png differ diff --git a/assets/lesson_screen/branches.png.import b/assets/gardens/animals/frog_body.png.import similarity index 73% rename from assets/lesson_screen/branches.png.import rename to assets/gardens/animals/frog_body.png.import index 6f76bd84..fb0dab24 100644 --- a/assets/lesson_screen/branches.png.import +++ b/assets/gardens/animals/frog_body.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://cffuqacgb1jra" -path="res://.godot/imported/branches.png-59c95c0c624c68eb2181d2b0fe6a5080.ctex" +uid="uid://oagcnmxs0xx1" +path="res://.godot/imported/frog_body.png-ac6c4a085cb17c6bc169773a464b64b6.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/lesson_screen/branches.png" -dest_files=["res://.godot/imported/branches.png-59c95c0c624c68eb2181d2b0fe6a5080.ctex"] +source_file="res://assets/gardens/animals/frog_body.png" +dest_files=["res://.godot/imported/frog_body.png-ac6c4a085cb17c6bc169773a464b64b6.ctex"] [params] diff --git a/assets/gardens/animals/frog_face.png b/assets/gardens/animals/frog_face.png new file mode 100644 index 00000000..4c249c47 Binary files /dev/null and b/assets/gardens/animals/frog_face.png differ diff --git a/assets/gardens/animals/frog_face.png.import b/assets/gardens/animals/frog_face.png.import new file mode 100644 index 00000000..0471967a --- /dev/null +++ b/assets/gardens/animals/frog_face.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b4243242f34g0" +path="res://.godot/imported/frog_face.png-edba38b44d42deef80a709ade2e5e8f6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/frog_face.png" +dest_files=["res://.godot/imported/frog_face.png-edba38b44d42deef80a709ade2e5e8f6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/jellyfish_body.png b/assets/gardens/animals/jellyfish_body.png new file mode 100644 index 00000000..62529ad8 Binary files /dev/null and b/assets/gardens/animals/jellyfish_body.png differ diff --git a/assets/gardens/animals/jellyfish_body.png.import b/assets/gardens/animals/jellyfish_body.png.import new file mode 100644 index 00000000..c2103f75 --- /dev/null +++ b/assets/gardens/animals/jellyfish_body.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bb3we2it550v6" +path="res://.godot/imported/jellyfish_body.png-a32700abbb41c080cba5614127a3edc3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/jellyfish_body.png" +dest_files=["res://.godot/imported/jellyfish_body.png-a32700abbb41c080cba5614127a3edc3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/jellyfish_face.png b/assets/gardens/animals/jellyfish_face.png new file mode 100644 index 00000000..46d1299e Binary files /dev/null and b/assets/gardens/animals/jellyfish_face.png differ diff --git a/assets/gardens/animals/jellyfish_face.png.import b/assets/gardens/animals/jellyfish_face.png.import new file mode 100644 index 00000000..9f3ecb32 --- /dev/null +++ b/assets/gardens/animals/jellyfish_face.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dppmdv8u3cwl1" +path="res://.godot/imported/jellyfish_face.png-5c0a129760def337aa729a02e1028153.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/jellyfish_face.png" +dest_files=["res://.godot/imported/jellyfish_face.png-5c0a129760def337aa729a02e1028153.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/monkey_body.png b/assets/gardens/animals/monkey_body.png new file mode 100644 index 00000000..bc059f35 Binary files /dev/null and b/assets/gardens/animals/monkey_body.png differ diff --git a/assets/gardens/animals/monkey_body.png.import b/assets/gardens/animals/monkey_body.png.import new file mode 100644 index 00000000..62f624ab --- /dev/null +++ b/assets/gardens/animals/monkey_body.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dr12efhuotfgt" +path="res://.godot/imported/monkey_body.png-b049cc78b0f6869945a1c7d6a1301ad4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/monkey_body.png" +dest_files=["res://.godot/imported/monkey_body.png-b049cc78b0f6869945a1c7d6a1301ad4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/monkey_face.png b/assets/gardens/animals/monkey_face.png new file mode 100644 index 00000000..769b9908 Binary files /dev/null and b/assets/gardens/animals/monkey_face.png differ diff --git a/assets/gardens/animals/monkey_face.png.import b/assets/gardens/animals/monkey_face.png.import new file mode 100644 index 00000000..e231d87e --- /dev/null +++ b/assets/gardens/animals/monkey_face.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dc52xvm4y6rir" +path="res://.godot/imported/monkey_face.png-985109f289329f15999880cce0b5a16e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/monkey_face.png" +dest_files=["res://.godot/imported/monkey_face.png-985109f289329f15999880cce0b5a16e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/parakeet_body.png b/assets/gardens/animals/parakeet_body.png new file mode 100644 index 00000000..655feea4 Binary files /dev/null and b/assets/gardens/animals/parakeet_body.png differ diff --git a/assets/gardens/animals/parakeet_body.png.import b/assets/gardens/animals/parakeet_body.png.import new file mode 100644 index 00000000..e2eb3b91 --- /dev/null +++ b/assets/gardens/animals/parakeet_body.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2yalimkyunxi" +path="res://.godot/imported/parakeet_body.png-9465060ca470033db7910f6ce2322a6d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/parakeet_body.png" +dest_files=["res://.godot/imported/parakeet_body.png-9465060ca470033db7910f6ce2322a6d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/parakeet_face.png b/assets/gardens/animals/parakeet_face.png new file mode 100644 index 00000000..996edd06 Binary files /dev/null and b/assets/gardens/animals/parakeet_face.png differ diff --git a/assets/gardens/animals/parakeet_face.png.import b/assets/gardens/animals/parakeet_face.png.import new file mode 100644 index 00000000..048af348 --- /dev/null +++ b/assets/gardens/animals/parakeet_face.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://l52tfb7fdrpt" +path="res://.godot/imported/parakeet_face.png-94d7bc7370d8ae647ca7d22a41893e3f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/parakeet_face.png" +dest_files=["res://.godot/imported/parakeet_face.png-94d7bc7370d8ae647ca7d22a41893e3f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/penguin_body.png b/assets/gardens/animals/penguin_body.png new file mode 100644 index 00000000..1d7fda19 Binary files /dev/null and b/assets/gardens/animals/penguin_body.png differ diff --git a/assets/gardens/animals/penguin_body.png.import b/assets/gardens/animals/penguin_body.png.import new file mode 100644 index 00000000..76a24047 --- /dev/null +++ b/assets/gardens/animals/penguin_body.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://noekve4gjudr" +path="res://.godot/imported/penguin_body.png-72481c56dc380b551e94e0f413ef0cf8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/penguin_body.png" +dest_files=["res://.godot/imported/penguin_body.png-72481c56dc380b551e94e0f413ef0cf8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/penguin_face.png b/assets/gardens/animals/penguin_face.png new file mode 100644 index 00000000..ad9453a2 Binary files /dev/null and b/assets/gardens/animals/penguin_face.png differ diff --git a/assets/gardens/animals/penguin_face.png.import b/assets/gardens/animals/penguin_face.png.import new file mode 100644 index 00000000..0985f226 --- /dev/null +++ b/assets/gardens/animals/penguin_face.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbg7mxg3x7vd4" +path="res://.godot/imported/penguin_face.png-ea217ef7de954aee6edea62f83594216.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/penguin_face.png" +dest_files=["res://.godot/imported/penguin_face.png-ea217ef7de954aee6edea62f83594216.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/turtle_body.png b/assets/gardens/animals/turtle_body.png new file mode 100644 index 00000000..5aec49b4 Binary files /dev/null and b/assets/gardens/animals/turtle_body.png differ diff --git a/assets/gardens/animals/turtle_body.png.import b/assets/gardens/animals/turtle_body.png.import new file mode 100644 index 00000000..03587e45 --- /dev/null +++ b/assets/gardens/animals/turtle_body.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7rqldqdft30a" +path="res://.godot/imported/turtle_body.png-0f50da4036c6750167a288e6f006a813.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/turtle_body.png" +dest_files=["res://.godot/imported/turtle_body.png-0f50da4036c6750167a288e6f006a813.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/turtle_face.png b/assets/gardens/animals/turtle_face.png new file mode 100644 index 00000000..95f4e789 Binary files /dev/null and b/assets/gardens/animals/turtle_face.png differ diff --git a/assets/gardens/animals/turtle_face.png.import b/assets/gardens/animals/turtle_face.png.import new file mode 100644 index 00000000..7fcd487d --- /dev/null +++ b/assets/gardens/animals/turtle_face.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://nu4kpbywwpgn" +path="res://.godot/imported/turtle_face.png-e570d8d931a8a1c99178dba731ef0fdb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/animals/turtle_face.png" +dest_files=["res://.godot/imported/turtle_face.png-e570d8d931a8a1c99178dba731ef0fdb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/buttons/movie_icon.png b/assets/gardens/buttons/movie_icon.png new file mode 100644 index 00000000..52bfb441 Binary files /dev/null and b/assets/gardens/buttons/movie_icon.png differ diff --git a/assets/gardens/buttons/movie_icon.png.import b/assets/gardens/buttons/movie_icon.png.import new file mode 100644 index 00000000..fb379f4b --- /dev/null +++ b/assets/gardens/buttons/movie_icon.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1ml42sp1vqga" +path="res://.godot/imported/movie_icon.png-3b93e2f2cfeeb8eec0332bbcd7cda143.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/buttons/movie_icon.png" +dest_files=["res://.godot/imported/movie_icon.png-3b93e2f2cfeeb8eec0332bbcd7cda143.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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/gardens/animals/ant.png b/assets/gardens/victory_assets/animals/ant.png similarity index 100% rename from assets/gardens/animals/ant.png rename to assets/gardens/victory_assets/animals/ant.png diff --git a/assets/gardens/animals/ant.png.import b/assets/gardens/victory_assets/animals/ant.png.import similarity index 76% rename from assets/gardens/animals/ant.png.import rename to assets/gardens/victory_assets/animals/ant.png.import index 7e989d6f..b6c20ad1 100644 --- a/assets/gardens/animals/ant.png.import +++ b/assets/gardens/victory_assets/animals/ant.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cn0brlkbklxuu" -path="res://.godot/imported/ant.png-a1470874074de10588ffd54aa0bc8a95.ctex" +path="res://.godot/imported/ant.png-d3fdfb32e41ad1bbed889f9d21d54167.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/ant.png" -dest_files=["res://.godot/imported/ant.png-a1470874074de10588ffd54aa0bc8a95.ctex"] +source_file="res://assets/gardens/victory_assets/animals/ant.png" +dest_files=["res://.godot/imported/ant.png-d3fdfb32e41ad1bbed889f9d21d54167.ctex"] [params] diff --git a/assets/gardens/animals/caterpillar.png b/assets/gardens/victory_assets/animals/caterpillar.png similarity index 100% rename from assets/gardens/animals/caterpillar.png rename to assets/gardens/victory_assets/animals/caterpillar.png diff --git a/assets/gardens/animals/caterpillar.png.import b/assets/gardens/victory_assets/animals/caterpillar.png.import similarity index 74% rename from assets/gardens/animals/caterpillar.png.import rename to assets/gardens/victory_assets/animals/caterpillar.png.import index 03a5ca20..60f51eb1 100644 --- a/assets/gardens/animals/caterpillar.png.import +++ b/assets/gardens/victory_assets/animals/caterpillar.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://ixkyfsxu07qx" -path="res://.godot/imported/caterpillar.png-03f6801670b49c8e0cea7190046ee5e8.ctex" +path="res://.godot/imported/caterpillar.png-606aeb5ed693d22c4a80f41968e1d449.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/caterpillar.png" -dest_files=["res://.godot/imported/caterpillar.png-03f6801670b49c8e0cea7190046ee5e8.ctex"] +source_file="res://assets/gardens/victory_assets/animals/caterpillar.png" +dest_files=["res://.godot/imported/caterpillar.png-606aeb5ed693d22c4a80f41968e1d449.ctex"] [params] diff --git a/assets/gardens/animals/crab.png b/assets/gardens/victory_assets/animals/crab.png similarity index 100% rename from assets/gardens/animals/crab.png rename to assets/gardens/victory_assets/animals/crab.png diff --git a/assets/gardens/animals/crab.png.import b/assets/gardens/victory_assets/animals/crab.png.import similarity index 76% rename from assets/gardens/animals/crab.png.import rename to assets/gardens/victory_assets/animals/crab.png.import index 0594a3a5..05289d22 100644 --- a/assets/gardens/animals/crab.png.import +++ b/assets/gardens/victory_assets/animals/crab.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://d3vt2qpngkkjs" -path="res://.godot/imported/crab.png-0a38ba7f13130791be164b6db99b3bb7.ctex" +path="res://.godot/imported/crab.png-6b9401bccc35a6e58de3bee1aa707608.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/crab.png" -dest_files=["res://.godot/imported/crab.png-0a38ba7f13130791be164b6db99b3bb7.ctex"] +source_file="res://assets/gardens/victory_assets/animals/crab.png" +dest_files=["res://.godot/imported/crab.png-6b9401bccc35a6e58de3bee1aa707608.ctex"] [params] diff --git a/assets/gardens/animals/frog.png b/assets/gardens/victory_assets/animals/frog.png similarity index 100% rename from assets/gardens/animals/frog.png rename to assets/gardens/victory_assets/animals/frog.png diff --git a/assets/gardens/animals/frog.png.import b/assets/gardens/victory_assets/animals/frog.png.import similarity index 76% rename from assets/gardens/animals/frog.png.import rename to assets/gardens/victory_assets/animals/frog.png.import index 3515a96d..f5ebc738 100644 --- a/assets/gardens/animals/frog.png.import +++ b/assets/gardens/victory_assets/animals/frog.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://yo3o4m6o7a0" -path="res://.godot/imported/frog.png-dbd41735c012909d9c488ecbaa029907.ctex" +path="res://.godot/imported/frog.png-50e8b0bcbd5c11e9fc83314d35821855.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/frog.png" -dest_files=["res://.godot/imported/frog.png-dbd41735c012909d9c488ecbaa029907.ctex"] +source_file="res://assets/gardens/victory_assets/animals/frog.png" +dest_files=["res://.godot/imported/frog.png-50e8b0bcbd5c11e9fc83314d35821855.ctex"] [params] diff --git a/assets/gardens/animals/jellyfish.png b/assets/gardens/victory_assets/animals/jellyfish.png similarity index 100% rename from assets/gardens/animals/jellyfish.png rename to assets/gardens/victory_assets/animals/jellyfish.png diff --git a/assets/gardens/animals/jellyfish.png.import b/assets/gardens/victory_assets/animals/jellyfish.png.import similarity index 75% rename from assets/gardens/animals/jellyfish.png.import rename to assets/gardens/victory_assets/animals/jellyfish.png.import index ec121f88..1a2acb72 100644 --- a/assets/gardens/animals/jellyfish.png.import +++ b/assets/gardens/victory_assets/animals/jellyfish.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bfqwlmmliem8f" -path="res://.godot/imported/jellyfish.png-354519775b79ac38eb7fb5b2e6d6f3a9.ctex" +path="res://.godot/imported/jellyfish.png-fef4023badc953c6e37065baefef9dda.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/jellyfish.png" -dest_files=["res://.godot/imported/jellyfish.png-354519775b79ac38eb7fb5b2e6d6f3a9.ctex"] +source_file="res://assets/gardens/victory_assets/animals/jellyfish.png" +dest_files=["res://.godot/imported/jellyfish.png-fef4023badc953c6e37065baefef9dda.ctex"] [params] diff --git a/assets/gardens/animals/khaki_turtle.png b/assets/gardens/victory_assets/animals/khaki_turtle.png similarity index 100% rename from assets/gardens/animals/khaki_turtle.png rename to assets/gardens/victory_assets/animals/khaki_turtle.png diff --git a/assets/gardens/animals/khaki_turtle.png.import b/assets/gardens/victory_assets/animals/khaki_turtle.png.import similarity index 74% rename from assets/gardens/animals/khaki_turtle.png.import rename to assets/gardens/victory_assets/animals/khaki_turtle.png.import index 73273f66..681d5646 100644 --- a/assets/gardens/animals/khaki_turtle.png.import +++ b/assets/gardens/victory_assets/animals/khaki_turtle.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://6bosyi1wv8vu" -path="res://.godot/imported/khaki_turtle.png-365be2d89ffda872bfafc7a90e7d6e36.ctex" +path="res://.godot/imported/khaki_turtle.png-c9b0e5c5db5d16603c89e5aede131fd5.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/khaki_turtle.png" -dest_files=["res://.godot/imported/khaki_turtle.png-365be2d89ffda872bfafc7a90e7d6e36.ctex"] +source_file="res://assets/gardens/victory_assets/animals/khaki_turtle.png" +dest_files=["res://.godot/imported/khaki_turtle.png-c9b0e5c5db5d16603c89e5aede131fd5.ctex"] [params] diff --git a/assets/gardens/animals/monkey.png b/assets/gardens/victory_assets/animals/monkey.png similarity index 100% rename from assets/gardens/animals/monkey.png rename to assets/gardens/victory_assets/animals/monkey.png diff --git a/assets/gardens/animals/monkey.png.import b/assets/gardens/victory_assets/animals/monkey.png.import similarity index 75% rename from assets/gardens/animals/monkey.png.import rename to assets/gardens/victory_assets/animals/monkey.png.import index 703e3d6b..bfddf5ff 100644 --- a/assets/gardens/animals/monkey.png.import +++ b/assets/gardens/victory_assets/animals/monkey.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://kygm5ieixgne" -path="res://.godot/imported/monkey.png-723d94951cc580ff3e0ae5233294daa2.ctex" +path="res://.godot/imported/monkey.png-984367ba67c6aee1976b0b6e125be90d.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/monkey.png" -dest_files=["res://.godot/imported/monkey.png-723d94951cc580ff3e0ae5233294daa2.ctex"] +source_file="res://assets/gardens/victory_assets/animals/monkey.png" +dest_files=["res://.godot/imported/monkey.png-984367ba67c6aee1976b0b6e125be90d.ctex"] [params] diff --git a/assets/gardens/animals/penguin.png b/assets/gardens/victory_assets/animals/penguin.png similarity index 100% rename from assets/gardens/animals/penguin.png rename to assets/gardens/victory_assets/animals/penguin.png diff --git a/assets/gardens/animals/penguin.png.import b/assets/gardens/victory_assets/animals/penguin.png.import similarity index 75% rename from assets/gardens/animals/penguin.png.import rename to assets/gardens/victory_assets/animals/penguin.png.import index 2947a8da..c64d62f4 100644 --- a/assets/gardens/animals/penguin.png.import +++ b/assets/gardens/victory_assets/animals/penguin.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cy1nrnl520goj" -path="res://.godot/imported/penguin.png-7b214b7f40894092c07f326efebcbe8d.ctex" +path="res://.godot/imported/penguin.png-a3d9b15f5a490402f4093a86cd9fc481.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/penguin.png" -dest_files=["res://.godot/imported/penguin.png-7b214b7f40894092c07f326efebcbe8d.ctex"] +source_file="res://assets/gardens/victory_assets/animals/penguin.png" +dest_files=["res://.godot/imported/penguin.png-a3d9b15f5a490402f4093a86cd9fc481.ctex"] [params] diff --git a/assets/gardens/animals/pink_jellyfish.png b/assets/gardens/victory_assets/animals/pink_jellyfish.png similarity index 100% rename from assets/gardens/animals/pink_jellyfish.png rename to assets/gardens/victory_assets/animals/pink_jellyfish.png diff --git a/assets/gardens/animals/pink_jellyfish.png.import b/assets/gardens/victory_assets/animals/pink_jellyfish.png.import similarity index 73% rename from assets/gardens/animals/pink_jellyfish.png.import rename to assets/gardens/victory_assets/animals/pink_jellyfish.png.import index 1e8c7730..a61f69ae 100644 --- a/assets/gardens/animals/pink_jellyfish.png.import +++ b/assets/gardens/victory_assets/animals/pink_jellyfish.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://dcuobvoav863b" -path="res://.godot/imported/pink_jellyfish.png-47ea6885f7ba9be8ff5f438c055bc4a1.ctex" +path="res://.godot/imported/pink_jellyfish.png-99508b215ac7a943286e22be8a93bcd0.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/pink_jellyfish.png" -dest_files=["res://.godot/imported/pink_jellyfish.png-47ea6885f7ba9be8ff5f438c055bc4a1.ctex"] +source_file="res://assets/gardens/victory_assets/animals/pink_jellyfish.png" +dest_files=["res://.godot/imported/pink_jellyfish.png-99508b215ac7a943286e22be8a93bcd0.ctex"] [params] diff --git a/assets/gardens/animals/red_parakeet.png b/assets/gardens/victory_assets/animals/red_parakeet.png similarity index 100% rename from assets/gardens/animals/red_parakeet.png rename to assets/gardens/victory_assets/animals/red_parakeet.png diff --git a/assets/gardens/animals/red_parakeet.png.import b/assets/gardens/victory_assets/animals/red_parakeet.png.import similarity index 74% rename from assets/gardens/animals/red_parakeet.png.import rename to assets/gardens/victory_assets/animals/red_parakeet.png.import index c364e158..8d6ccabe 100644 --- a/assets/gardens/animals/red_parakeet.png.import +++ b/assets/gardens/victory_assets/animals/red_parakeet.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://da7ppeamjqjpw" -path="res://.godot/imported/red_parakeet.png-546f9c816968cb8f1bb25596ab769016.ctex" +path="res://.godot/imported/red_parakeet.png-da45ba4c38e1e0997bf4da3dc9da41b8.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/red_parakeet.png" -dest_files=["res://.godot/imported/red_parakeet.png-546f9c816968cb8f1bb25596ab769016.ctex"] +source_file="res://assets/gardens/victory_assets/animals/red_parakeet.png" +dest_files=["res://.godot/imported/red_parakeet.png-da45ba4c38e1e0997bf4da3dc9da41b8.ctex"] [params] diff --git a/assets/gardens/animals/turtle.png b/assets/gardens/victory_assets/animals/turtle.png similarity index 100% rename from assets/gardens/animals/turtle.png rename to assets/gardens/victory_assets/animals/turtle.png diff --git a/assets/gardens/animals/turtle.png.import b/assets/gardens/victory_assets/animals/turtle.png.import similarity index 75% rename from assets/gardens/animals/turtle.png.import rename to assets/gardens/victory_assets/animals/turtle.png.import index 3336bf5b..a4fabc72 100644 --- a/assets/gardens/animals/turtle.png.import +++ b/assets/gardens/victory_assets/animals/turtle.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bsw6v8ix7bb2s" -path="res://.godot/imported/turtle.png-b25459e1a6a7c121b59fc65afcb3f82e.ctex" +path="res://.godot/imported/turtle.png-c250d2a66dd72bd5fa41354b999b1000.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/turtle.png" -dest_files=["res://.godot/imported/turtle.png-b25459e1a6a7c121b59fc65afcb3f82e.ctex"] +source_file="res://assets/gardens/victory_assets/animals/turtle.png" +dest_files=["res://.godot/imported/turtle.png-c250d2a66dd72bd5fa41354b999b1000.ctex"] [params] diff --git a/assets/gardens/animals/yellow_parakeet.png b/assets/gardens/victory_assets/animals/yellow_parakeet.png similarity index 100% rename from assets/gardens/animals/yellow_parakeet.png rename to assets/gardens/victory_assets/animals/yellow_parakeet.png diff --git a/assets/gardens/animals/yellow_parakeet.png.import b/assets/gardens/victory_assets/animals/yellow_parakeet.png.import similarity index 73% rename from assets/gardens/animals/yellow_parakeet.png.import rename to assets/gardens/victory_assets/animals/yellow_parakeet.png.import index bc179af0..834d3466 100644 --- a/assets/gardens/animals/yellow_parakeet.png.import +++ b/assets/gardens/victory_assets/animals/yellow_parakeet.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bd5pxoufamqy" -path="res://.godot/imported/yellow_parakeet.png-ce114f4bc0be41f81a9d2e24bceb2fcf.ctex" +path="res://.godot/imported/yellow_parakeet.png-3b1b7946f714148f55147e3efdf195ad.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/animals/yellow_parakeet.png" -dest_files=["res://.godot/imported/yellow_parakeet.png-ce114f4bc0be41f81a9d2e24bceb2fcf.ctex"] +source_file="res://assets/gardens/victory_assets/animals/yellow_parakeet.png" +dest_files=["res://.godot/imported/yellow_parakeet.png-3b1b7946f714148f55147e3efdf195ad.ctex"] [params] diff --git a/assets/lesson_screen/bottom.png b/assets/lesson_screen/bottom.png deleted file mode 100644 index 5ff5cd66..00000000 Binary files a/assets/lesson_screen/bottom.png and /dev/null differ diff --git a/assets/lesson_screen/branches.png b/assets/lesson_screen/branches.png deleted file mode 100644 index 7b4d37b7..00000000 Binary files a/assets/lesson_screen/branches.png and /dev/null differ diff --git a/assets/lesson_screen/top_left.png b/assets/lesson_screen/top_left.png deleted file mode 100644 index 1f5b7ce9..00000000 Binary files a/assets/lesson_screen/top_left.png and /dev/null differ diff --git a/assets/lesson_screen/top_right.png b/assets/lesson_screen/top_right.png deleted file mode 100644 index 48c8f44c..00000000 Binary files a/assets/lesson_screen/top_right.png and /dev/null differ diff --git a/resources/gardens/garden.gd b/resources/gardens/garden.gd index fb0581c4..e5d7ace8 100644 --- a/resources/gardens/garden.gd +++ b/resources/gardens/garden.gd @@ -12,6 +12,9 @@ const SLOT_SELECTION: Dictionary = { 4: [0, 1, 3, 4], 5: [0, 1, 2, 3, 4], } +const WHEEL_WEDGE_LOCKED: Color = Color("e6e6e6") +const ANIMAL_LOCKED_COLOR: Color = Color("c9c9c9") +const WHEEL_HIGHLIGHT: Color = Color("fbb03b") @export var garden_layout: GardenLayout: set = set_garden_layout @@ -21,6 +24,11 @@ const SLOT_SELECTION: Dictionary = { @export var unlocked_lesson_text: Color = Color("9be3ea") @export var completed_lesson: Color = Color("9be3ea") @export var completed_lesson_text: Color = Color("0a555b") +@export_group("Wheel Colors") +@export var wheel_wedge_unlocked: Color = Color("9be3ea") +@export var wheel_background: Color = Color("0a555b") +## Outline color flagging the next step to play. +@export var animal_unlocked_color: Color = Color.WHITE var color: Color var current_progression: float = 0.0 diff --git a/resources/gardens/garden_01.tscn b/resources/gardens/garden_01.tscn index 64e7c862..ab98261e 100644 --- a/resources/gardens/garden_01.tscn +++ b/resources/gardens/garden_01.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] [ext_resource type="Texture2D" uid="uid://d26hapg1hf8a6" path="res://assets/gardens/gardens/garden_01.png" id="3_p7iv3"] [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] -[ext_resource type="Texture2D" uid="uid://bfqwlmmliem8f" path="res://assets/gardens/animals/jellyfish.png" id="jellyfish_tex"] +[ext_resource type="Texture2D" uid="uid://bfqwlmmliem8f" path="res://assets/gardens/victory_assets/animals/jellyfish.png" id="jellyfish_tex"] [ext_resource type="Texture2D" uid="uid://dcekseb1b3ruw" path="res://assets/gardens/victory_assets/victory_asset_plant_01.png" id="plant_01"] [ext_resource type="Texture2D" uid="uid://clkr31osbqs7u" path="res://assets/gardens/victory_assets/victory_asset_plant_02.png" id="plant_02"] [ext_resource type="Texture2D" uid="uid://dgssb0oonuqku" path="res://assets/gardens/victory_assets/victory_asset_fish_01.png" id="plant_03"] @@ -13,7 +13,7 @@ [ext_resource type="Texture2D" uid="uid://dufnm3bkfe5yv" path="res://assets/gardens/victory_assets/victory_asset_plant_05.png" id="plant_07"] [ext_resource type="Texture2D" uid="uid://dt2a0dea0hv0c" path="res://assets/gardens/victory_assets/victory_asset_fish_02.png" id="plant_08"] -[node name="Garden" type="Control" unique_id=229113687] +[node name="GardenRoot" type="Control" unique_id=229113687] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0.0392157, 0.333333, 0.356863, 1) unlocked_lesson_text = Color(0.607843, 0.890196, 0.917647, 1) completed_lesson = Color(0.607843, 0.890196, 0.917647, 1) completed_lesson_text = Color(0.0392157, 0.333333, 0.356863, 1) +wheel_wedge_unlocked = Color(0.607843, 0.890196, 0.917647, 1) +wheel_background = Color(0.09019608, 0.42745098, 0.47058824, 1) +animal_unlocked_color = Color(0.26666668, 0.7607843, 0.8235294, 1) [node name="Background" type="TextureRect" parent="." unique_id=1905044868] unique_name_in_owner = true diff --git a/resources/gardens/garden_02.tscn b/resources/gardens/garden_02.tscn index 250ae504..0ee7e7f1 100644 --- a/resources/gardens/garden_02.tscn +++ b/resources/gardens/garden_02.tscn @@ -10,10 +10,10 @@ [ext_resource type="Texture2D" uid="uid://bv510d5r4dn82" path="res://assets/gardens/victory_assets/victory_asset_dragon_flies_01.png" id="8_556ma"] [ext_resource type="Texture2D" uid="uid://dckd1xhcdf2ie" path="res://assets/gardens/victory_assets/victory_asset_plant_06.png" id="9_vwhyb"] [ext_resource type="Texture2D" uid="uid://bpxc4vhri16pd" path="res://assets/gardens/victory_assets/victory_asset_pearl.png" id="10_v4g1g"] -[ext_resource type="Texture2D" uid="uid://bsw6v8ix7bb2s" path="res://assets/gardens/animals/turtle.png" id="12_v4g1g"] +[ext_resource type="Texture2D" uid="uid://bsw6v8ix7bb2s" path="res://assets/gardens/victory_assets/animals/turtle.png" id="12_v4g1g"] [ext_resource type="Texture2D" uid="uid://dvxnktx1wiyxp" path="res://assets/gardens/victory_assets/victory_asset_bubbles.png" id="plant_05"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0.345098, 0.266667, 0.490196, 1) unlocked_lesson_text = Color(0.894118, 0.827451, 0.937255, 1) completed_lesson = Color(0.894118, 0.827451, 0.937255, 1) completed_lesson_text = Color(0.345098, 0.266667, 0.490196, 1) +wheel_wedge_unlocked = Color(0.894118, 0.827451, 0.937255, 1) +wheel_background = Color(0.45490196, 0.3529412, 0.64705884, 1) +animal_unlocked_color = Color(0.68235296, 0.54509807, 0.8392157, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/gardens/garden_03.tscn b/resources/gardens/garden_03.tscn index 19635580..3159761b 100644 --- a/resources/gardens/garden_03.tscn +++ b/resources/gardens/garden_03.tscn @@ -11,9 +11,9 @@ [ext_resource type="Texture2D" uid="uid://dw3qhu03gxfi7" path="res://assets/gardens/victory_assets/victory_asset_bees.png" id="9_ec7px"] [ext_resource type="Texture2D" uid="uid://its5dfr0ipak" path="res://assets/gardens/victory_assets/victory_asset_butterfly_01.png" id="10_j3ks8"] [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="11_odjw4"] -[ext_resource type="Texture2D" uid="uid://cn0brlkbklxuu" path="res://assets/gardens/animals/ant.png" id="12_j3ks8"] +[ext_resource type="Texture2D" uid="uid://cn0brlkbklxuu" path="res://assets/gardens/victory_assets/animals/ant.png" id="12_j3ks8"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0.52156866, 0.03137255, 0.40392157, 1) unlocked_lesson_text = Color(0.92156863, 0.7529412, 0.87058824, 1) completed_lesson = Color(0.92156863, 0.7529412, 0.87058824, 1) completed_lesson_text = Color(0.52156866, 0.03137255, 0.40392157, 1) +wheel_wedge_unlocked = Color(0.92156863, 0.7529412, 0.87058824, 1) +wheel_background = Color(0.83137256, 0.2901961, 0.7019608, 1) +animal_unlocked_color = Color(0.9490196, 0.36078432, 0.6784314, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/gardens/garden_04.tscn b/resources/gardens/garden_04.tscn index 05f6b1a7..fd4e6df9 100644 --- a/resources/gardens/garden_04.tscn +++ b/resources/gardens/garden_04.tscn @@ -11,9 +11,9 @@ [ext_resource type="Texture2D" uid="uid://b2xj4qqvalwar" path="res://assets/gardens/victory_assets/victory_asset_sun.png" id="8_tf7gm"] [ext_resource type="Texture2D" uid="uid://qhs2fydvrnhk" path="res://assets/gardens/victory_assets/victory_asset_sea_stars.png" id="9_nt0kr"] [ext_resource type="Texture2D" uid="uid://ddneerabvuyoe" path="res://assets/gardens/victory_assets/victory_asset_birds.png" id="10_0vwua"] -[ext_resource type="Texture2D" uid="uid://d3vt2qpngkkjs" path="res://assets/gardens/animals/crab.png" id="12_2bwv2"] +[ext_resource type="Texture2D" uid="uid://d3vt2qpngkkjs" path="res://assets/gardens/victory_assets/animals/crab.png" id="12_2bwv2"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0.7490196, 0.2784314, 0, 1) unlocked_lesson_text = Color(1, 0.7921569, 0.6901961, 1) completed_lesson = Color(1, 0.7921569, 0.6901961, 1) completed_lesson_text = Color(0.7490196, 0.2784314, 0, 1) +wheel_wedge_unlocked = Color(1, 0.7921569, 0.6901961, 1) +wheel_background = Color(1, 0.49803922, 0.2, 1) +animal_unlocked_color = Color(1, 0.41960785, 0.2509804, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/gardens/garden_05.tscn b/resources/gardens/garden_05.tscn index 04c3ec58..c7c42032 100644 --- a/resources/gardens/garden_05.tscn +++ b/resources/gardens/garden_05.tscn @@ -6,14 +6,14 @@ [ext_resource type="Texture2D" uid="uid://x0skor7vxadl" path="res://assets/gardens/victory_assets/victory_asset_plant_16.png" id="4_0y47p"] [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] [ext_resource type="Texture2D" uid="uid://bqafuj82xbdqm" path="res://assets/gardens/victory_assets/victory_asset_bird_treehouse.png" id="5_fja20"] -[ext_resource type="Texture2D" uid="uid://bd5pxoufamqy" path="res://assets/gardens/animals/yellow_parakeet.png" id="5_l6rp4"] +[ext_resource type="Texture2D" uid="uid://bd5pxoufamqy" path="res://assets/gardens/victory_assets/animals/yellow_parakeet.png" id="5_l6rp4"] [ext_resource type="Texture2D" uid="uid://bg02dhcrwf5nx" path="res://assets/gardens/victory_assets/victory_asset_plant_17.png" id="6_oapcv"] [ext_resource type="Texture2D" uid="uid://chtr4d0a80s61" path="res://assets/gardens/victory_assets/victory_asset_plant_18.png" id="7_sjfs7"] [ext_resource type="Texture2D" uid="uid://c784fmd7v5wkt" path="res://assets/gardens/victory_assets/victory_asset_tumbleweeds.png" id="8_se3av"] [ext_resource type="Texture2D" uid="uid://bpqo8maufc3gr" path="res://assets/gardens/victory_assets/victory_asset_ladybugs.png" id="9_r7c56"] [ext_resource type="Texture2D" uid="uid://its5dfr0ipak" path="res://assets/gardens/victory_assets/victory_asset_butterfly_01.png" id="10_s6qsy"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0.7019608, 0.44313726, 0, 1) unlocked_lesson_text = Color(1, 0.9411765, 0.78039217, 1) completed_lesson = Color(1, 0.9411765, 0.78039217, 1) completed_lesson_text = Color(0.7019608, 0.44313726, 0, 1) +wheel_wedge_unlocked = Color(1, 0.9411765, 0.78039217, 1) +wheel_background = Color(0.92156863, 0.6431373, 0, 1) +animal_unlocked_color = Color(1, 0.7607843, 0.10980392, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/gardens/garden_06.tscn b/resources/gardens/garden_06.tscn index 2a21d436..6bc12144 100644 --- a/resources/gardens/garden_06.tscn +++ b/resources/gardens/garden_06.tscn @@ -5,7 +5,7 @@ [ext_resource type="Texture2D" uid="uid://c0lcx7x0naofl" path="res://assets/gardens/victory_assets/victory_asset_clouds.png" id="3_c82qa"] [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] [ext_resource type="Texture2D" uid="uid://ctc6i4o6rtj2m" path="res://assets/gardens/victory_assets/victory_asset_plant_19.png" id="4_o7idj"] -[ext_resource type="Texture2D" uid="uid://ixkyfsxu07qx" path="res://assets/gardens/animals/caterpillar.png" id="5_c82qa"] +[ext_resource type="Texture2D" uid="uid://ixkyfsxu07qx" path="res://assets/gardens/victory_assets/animals/caterpillar.png" id="5_c82qa"] [ext_resource type="Texture2D" uid="uid://d1jhhus8v37ik" path="res://assets/gardens/victory_assets/victory_asset_plant_20.png" id="5_rqhnb"] [ext_resource type="Texture2D" uid="uid://dbxswqqflg4n0" path="res://assets/gardens/victory_assets/victory_asset_snail.png" id="6_o1130"] [ext_resource type="Texture2D" uid="uid://dw3qhu03gxfi7" path="res://assets/gardens/victory_assets/victory_asset_bees.png" id="7_diva3"] @@ -13,7 +13,7 @@ [ext_resource type="Texture2D" uid="uid://coxmj8uwyu6vd" path="res://assets/gardens/victory_assets/victory_asset_mushroom.png" id="9_1053v"] [ext_resource type="Texture2D" uid="uid://db6cwc8crw6wo" path="res://assets/gardens/victory_assets/victory_asset_butterfly_02.png" id="10_rqhnb"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0.30588236, 0.38039216, 0.03529412, 1) unlocked_lesson_text = Color(0.96862745, 1, 0.7529412, 1) completed_lesson = Color(0.96862745, 1, 0.7529412, 1) completed_lesson_text = Color(0.30588236, 0.38039216, 0.03529412, 1) +wheel_wedge_unlocked = Color(0.96862745, 1, 0.7529412, 1) +wheel_background = Color(0.43529412, 0.50980395, 0.16078432, 1) +animal_unlocked_color = Color(0.7882353, 0.85882354, 0.26666668, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/gardens/garden_07.tscn b/resources/gardens/garden_07.tscn index 9c5583bc..10d18029 100644 --- a/resources/gardens/garden_07.tscn +++ b/resources/gardens/garden_07.tscn @@ -6,14 +6,14 @@ [ext_resource type="Texture2D" uid="uid://n4pv6f7bbtiy" path="res://assets/gardens/victory_assets/victory_asset_plant_21.png" id="3_qm42s"] [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] [ext_resource type="Texture2D" uid="uid://vjani6ctt7hc" path="res://assets/gardens/victory_assets/victory_asset_plant_22.png" id="5_4e8bi"] -[ext_resource type="Texture2D" uid="uid://yo3o4m6o7a0" path="res://assets/gardens/animals/frog.png" id="5_qm42s"] +[ext_resource type="Texture2D" uid="uid://yo3o4m6o7a0" path="res://assets/gardens/victory_assets/animals/frog.png" id="5_qm42s"] [ext_resource type="Texture2D" uid="uid://dgssb0oonuqku" path="res://assets/gardens/victory_assets/victory_asset_fish_01.png" id="6_qltia"] [ext_resource type="Texture2D" uid="uid://bf77plws02i6k" path="res://assets/gardens/victory_assets/victory_asset_flies.png" id="7_vspma"] [ext_resource type="Texture2D" uid="uid://crkysknynt38e" path="res://assets/gardens/victory_assets/victory_asset_frog.png" id="8_68wn2"] [ext_resource type="Texture2D" uid="uid://o1af03kn2mcg" path="res://assets/gardens/victory_assets/victory_asset_dragon_flies_02.png" id="9_3oqd6"] [ext_resource type="Texture2D" uid="uid://ckmw2sfht4bq5" path="res://assets/gardens/victory_assets/victory_asset_hearts.png" id="10_pobi3"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0, 0.45882353, 0.25882354, 1) unlocked_lesson_text = Color(0.7019608, 1, 0.87058824, 1) completed_lesson = Color(0.7019608, 1, 0.87058824, 1) completed_lesson_text = Color(0, 0.45882353, 0.25882354, 1) +wheel_wedge_unlocked = Color(0.7019608, 1, 0.87058824, 1) +wheel_background = Color(0.078431375, 0.7607843, 0.4627451, 1) +animal_unlocked_color = Color(0.078431375, 0.7607843, 0.4627451, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/gardens/garden_08.tscn b/resources/gardens/garden_08.tscn index 3c1e3c8c..ef1ab2a4 100644 --- a/resources/gardens/garden_08.tscn +++ b/resources/gardens/garden_08.tscn @@ -5,7 +5,7 @@ [ext_resource type="Texture2D" uid="uid://br5gguush2y12" path="res://assets/gardens/victory_assets/victory_asset_plant_14.png" id="3_6wkbm"] [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] [ext_resource type="Texture2D" uid="uid://yag8afxcasm1" path="res://assets/gardens/victory_assets/victory_asset_torch.png" id="4_xgdw6"] -[ext_resource type="Texture2D" uid="uid://kygm5ieixgne" path="res://assets/gardens/animals/monkey.png" id="5_fd7lh"] +[ext_resource type="Texture2D" uid="uid://kygm5ieixgne" path="res://assets/gardens/victory_assets/animals/monkey.png" id="5_fd7lh"] [ext_resource type="Texture2D" uid="uid://8kmojsnwp657" path="res://assets/gardens/victory_assets/victory_asset_plant_23.png" id="5_sqwgp"] [ext_resource type="Texture2D" uid="uid://dlxljmb4wnx2o" path="res://assets/gardens/victory_assets/victory_asset_monkey.png" id="6_04ydh"] [ext_resource type="Texture2D" uid="uid://dyau6e65xdsb8" path="res://assets/gardens/victory_assets/victory_asset_plant_24.png" id="7_xgdw6"] @@ -13,7 +13,7 @@ [ext_resource type="Texture2D" uid="uid://c7lgiyapshr23" path="res://assets/gardens/victory_assets/victory_asset_plant_25.png" id="9_08dq4"] [ext_resource type="Texture2D" uid="uid://uepox6kvky5" path="res://assets/gardens/victory_assets/victory_asset_crown.png" id="10_7g80l"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0.36078432, 0.19607843, 0.03137255, 1) unlocked_lesson_text = Color(1, 0.8784314, 0.7607843, 1) completed_lesson = Color(1, 0.8784314, 0.7607843, 1) completed_lesson_text = Color(0.36078432, 0.19607843, 0.03137255, 1) +wheel_wedge_unlocked = Color(1, 0.8784314, 0.7607843, 1) +wheel_background = Color(0.54901963, 0.40784314, 0.26666668, 1) +animal_unlocked_color = Color(0.8509804, 0.6, 0.33333334, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/gardens/garden_09.tscn b/resources/gardens/garden_09.tscn index fe6e4897..b4fdecf4 100644 --- a/resources/gardens/garden_09.tscn +++ b/resources/gardens/garden_09.tscn @@ -5,7 +5,7 @@ [ext_resource type="Texture2D" uid="uid://c0lcx7x0naofl" path="res://assets/gardens/victory_assets/victory_asset_clouds.png" id="3_30y1d"] [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] [ext_resource type="Texture2D" uid="uid://x0skor7vxadl" path="res://assets/gardens/victory_assets/victory_asset_plant_16.png" id="4_pac6c"] -[ext_resource type="Texture2D" uid="uid://da7ppeamjqjpw" path="res://assets/gardens/animals/red_parakeet.png" id="5_30y1d"] +[ext_resource type="Texture2D" uid="uid://da7ppeamjqjpw" path="res://assets/gardens/victory_assets/animals/red_parakeet.png" id="5_30y1d"] [ext_resource type="Texture2D" uid="uid://bqafuj82xbdqm" path="res://assets/gardens/victory_assets/victory_asset_bird_treehouse.png" id="5_j4wf1"] [ext_resource type="Texture2D" uid="uid://bg02dhcrwf5nx" path="res://assets/gardens/victory_assets/victory_asset_plant_17.png" id="6_ym7nb"] [ext_resource type="Texture2D" uid="uid://chtr4d0a80s61" path="res://assets/gardens/victory_assets/victory_asset_plant_18.png" id="7_6bl1j"] @@ -13,7 +13,7 @@ [ext_resource type="Texture2D" uid="uid://bpqo8maufc3gr" path="res://assets/gardens/victory_assets/victory_asset_ladybugs.png" id="9_2xyhj"] [ext_resource type="Texture2D" uid="uid://its5dfr0ipak" path="res://assets/gardens/victory_assets/victory_asset_butterfly_01.png" id="10_cr4yr"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0.6, 0, 0, 1) unlocked_lesson_text = Color(1, 0.7254902, 0.7019608, 1) completed_lesson = Color(1, 0.7254902, 0.7019608, 1) completed_lesson_text = Color(0.6, 0, 0, 1) +wheel_wedge_unlocked = Color(1, 0.7607843, 0.7411765, 1) +wheel_background = Color(0.92156863, 0.3882353, 0.3882353, 1) +animal_unlocked_color = Color(1, 0.4, 0.4117647, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/gardens/garden_10.tscn b/resources/gardens/garden_10.tscn index 64bbb3d8..49e248fa 100644 --- a/resources/gardens/garden_10.tscn +++ b/resources/gardens/garden_10.tscn @@ -9,11 +9,11 @@ [ext_resource type="Texture2D" uid="uid://dufnm3bkfe5yv" path="res://assets/gardens/victory_assets/victory_asset_plant_05.png" id="6_ipdnh"] [ext_resource type="Texture2D" uid="uid://dt2a0dea0hv0c" path="res://assets/gardens/victory_assets/victory_asset_fish_02.png" id="7_xkwcf"] [ext_resource type="Texture2D" uid="uid://bqp1nkk53y1is" path="res://assets/gardens/victory_assets/victory_asset_plant_03.png" id="8_w51id"] -[ext_resource type="Texture2D" uid="uid://dcuobvoav863b" path="res://assets/gardens/animals/pink_jellyfish.png" id="8_xkwcf"] +[ext_resource type="Texture2D" uid="uid://dcuobvoav863b" path="res://assets/gardens/victory_assets/animals/pink_jellyfish.png" id="8_xkwcf"] [ext_resource type="Texture2D" uid="uid://dvxnktx1wiyxp" path="res://assets/gardens/victory_assets/victory_asset_bubbles.png" id="9_knmfc"] [ext_resource type="Texture2D" uid="uid://f2arml2f4b8p" path="res://assets/gardens/victory_assets/victory_asset_plant_04.png" id="10_83oc2"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0.6509804, 0.2901961, 0.5019608, 1) unlocked_lesson_text = Color(1, 0.81960785, 0.9254902, 1) completed_lesson = Color(1, 0.81960785, 0.9254902, 1) completed_lesson_text = Color(0.6509804, 0.2901961, 0.5019608, 1) +wheel_wedge_unlocked = Color(1, 0.81960785, 0.9254902, 1) +wheel_background = Color(0.87058824, 0.3882353, 0.67058825, 1) +animal_unlocked_color = Color(1, 0.49019608, 0.76862746, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/gardens/garden_11.tscn b/resources/gardens/garden_11.tscn index 6d0b0c44..26f2a405 100644 --- a/resources/gardens/garden_11.tscn +++ b/resources/gardens/garden_11.tscn @@ -5,7 +5,7 @@ [ext_resource type="Texture2D" uid="uid://dckd1xhcdf2ie" path="res://assets/gardens/victory_assets/victory_asset_plant_06.png" id="3_13gkf"] [ext_resource type="Texture2D" uid="uid://dro75vltqiq6j" path="res://assets/gardens/victory_assets/victory_asset_plant_07.png" id="3_th10l"] [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] -[ext_resource type="Texture2D" uid="uid://6bosyi1wv8vu" path="res://assets/gardens/animals/khaki_turtle.png" id="5_13gkf"] +[ext_resource type="Texture2D" uid="uid://6bosyi1wv8vu" path="res://assets/gardens/victory_assets/animals/khaki_turtle.png" id="5_13gkf"] [ext_resource type="Texture2D" uid="uid://blaltndbcv2yq" path="res://assets/gardens/victory_assets/victory_asset_plant_08.png" id="5_m2rr7"] [ext_resource type="Texture2D" uid="uid://dgssb0oonuqku" path="res://assets/gardens/victory_assets/victory_asset_fish_01.png" id="6_th10l"] [ext_resource type="Texture2D" uid="uid://bv510d5r4dn82" path="res://assets/gardens/victory_assets/victory_asset_dragon_flies_01.png" id="7_t2ok3"] @@ -13,7 +13,7 @@ [ext_resource type="Texture2D" uid="uid://co6vu63bybpnc" path="res://assets/gardens/victory_assets/victory_asset_plant_09.png" id="9_lswb8"] [ext_resource type="Texture2D" uid="uid://gm5x5p2f07rh" path="res://assets/gardens/victory_assets/victory_asset_plant_10.png" id="10_m37ct"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0.3372549, 0.29803923, 0.16470589, 1) unlocked_lesson_text = Color(0.9490196, 0.8901961, 0.72156864, 1) completed_lesson = Color(0.9490196, 0.8901961, 0.72156864, 1) completed_lesson_text = Color(0.3372549, 0.29803923, 0.16470589, 1) +wheel_wedge_unlocked = Color(0.9490196, 0.8901961, 0.72156864, 1) +wheel_background = Color(0.6117647, 0.5176471, 0.23137255, 1) +animal_unlocked_color = Color(0.7882353, 0.70980394, 0.43529412, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/gardens/garden_12.tscn b/resources/gardens/garden_12.tscn index 9557c74d..bcf6691d 100644 --- a/resources/gardens/garden_12.tscn +++ b/resources/gardens/garden_12.tscn @@ -6,14 +6,14 @@ [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] [ext_resource type="Texture2D" uid="uid://cjb3ygn2iycj4" path="res://assets/gardens/victory_assets/victory_asset_plant_26.png" id="4_go3so"] [ext_resource type="Texture2D" uid="uid://dgssb0oonuqku" path="res://assets/gardens/victory_assets/victory_asset_fish_01.png" id="5_88yjd"] -[ext_resource type="Texture2D" uid="uid://cy1nrnl520goj" path="res://assets/gardens/animals/penguin.png" id="5_xmsgp"] +[ext_resource type="Texture2D" uid="uid://cy1nrnl520goj" path="res://assets/gardens/victory_assets/animals/penguin.png" id="5_xmsgp"] [ext_resource type="Texture2D" uid="uid://d0je2xrnu1gem" path="res://assets/gardens/victory_assets/victory_asset_snowman.png" id="6_4h4hf"] [ext_resource type="Texture2D" uid="uid://bcjk0l771ugvq" path="res://assets/gardens/victory_assets/victory_asset_snowpile.png" id="7_wf34p"] [ext_resource type="Texture2D" uid="uid://0g80o48ewp7d" path="res://assets/gardens/victory_assets/victory_asset_cloud_snow.png" id="8_4h4hf"] [ext_resource type="Texture2D" uid="uid://28wjedoatx7c" path="res://assets/gardens/victory_assets/victory_asset_whale.png" id="9_m7voh"] [ext_resource type="Texture2D" uid="uid://bqxwflyxhcdvw" path="res://assets/gardens/victory_assets/victory_asset_snowflakes.png" id="10_g51bh"] -[node name="Garden" type="Control" unique_id=167073905] +[node name="GardenRoot" type="Control" unique_id=167073905] custom_minimum_size = Vector2(2400, 2.08165e-12) layout_mode = 3 anchors_preset = 15 @@ -28,6 +28,9 @@ unlocked_lesson = Color(0, 0.5529412, 0.76862746, 1) unlocked_lesson_text = Color(0.78431374, 0.9019608, 0.9529412, 1) completed_lesson = Color(0.78431374, 0.9019608, 0.9529412, 1) completed_lesson_text = Color(0, 0.5529412, 0.76862746, 1) +wheel_wedge_unlocked = Color(0.78431374, 0.9019608, 0.9529412, 1) +wheel_background = Color(0.3372549, 0.76862746, 0.9372549, 1) +animal_unlocked_color = Color(0.34901962, 0.84705883, 1, 1) [node name="Background" type="TextureRect" parent="." unique_id=1058030897] unique_name_in_owner = true diff --git a/resources/shaders/grayscale.gdshader b/resources/shaders/grayscale.gdshader new file mode 100644 index 00000000..406d9cef --- /dev/null +++ b/resources/shaders/grayscale.gdshader @@ -0,0 +1,7 @@ +shader_type canvas_item; + +void fragment() { + vec4 tex = texture(TEXTURE, UV); + float gray = dot(tex.rgb, vec3(0.299, 0.587, 0.114)); + COLOR = vec4(gray, gray, gray, tex.a); +} diff --git a/resources/shaders/grayscale.gdshader.uid b/resources/shaders/grayscale.gdshader.uid new file mode 100644 index 00000000..bcf37314 --- /dev/null +++ b/resources/shaders/grayscale.gdshader.uid @@ -0,0 +1 @@ +uid://bulhmeqr1cvlx diff --git a/resources/user/student_progression.gd b/resources/user/student_progression.gd index 65061843..67736be5 100644 --- a/resources/user/student_progression.gd +++ b/resources/user/student_progression.gd @@ -28,6 +28,52 @@ func _init() -> void: init_unlocks() +static func get_minigame_count_for_lesson(lesson_number: int) -> int: + return Database.get_exercise_for_lesson(lesson_number).size() + + +static func _build_default_lesson_unlock(lesson_number: int) -> Dictionary: + var minigame_count: int = get_minigame_count_for_lesson(lesson_number) + return { + "look_and_learn": Status.LOCKED, + "games": _make_locked_games_array(minigame_count), + "last_duration": _make_zero_durations(minigame_count), + "total_duration": _make_zero_durations(minigame_count), + } + + +static func _make_locked_games_array(minigame_count: int) -> Array: + var games: Array = [] + for _index: int in range(minigame_count): + games.append(Status.LOCKED) + return games + + +static func _make_zero_durations(minigame_count: int) -> PackedInt32Array: + var durations: PackedInt32Array = PackedInt32Array() + durations.resize(minigame_count) + return durations + + +# Resizes a games status array to target_size, keeping the existing statuses for +# the slots that remain (trim surplus / pad new slots with LOCKED). Used when a +# lesson's minigame count changes so old saves don't lose progress on resize. +static func _resize_games_array(games: Array, target_size: int) -> Array: + var resized: Array = [] + for index: int in range(target_size): + resized.append(games[index] if index < games.size() else Status.LOCKED) + return resized + + +# Same idea for the duration metrics: keep recorded times for remaining slots. +static func _resize_durations(durations: PackedInt32Array, target_size: int) -> PackedInt32Array: + var resized: PackedInt32Array = PackedInt32Array() + resized.resize(target_size) + for index: int in range(mini(target_size, durations.size())): + resized[index] = durations[index] + return resized + + # Make sure the unlocks are correct func init_unlocks() -> void: if not unlocks: @@ -35,22 +81,13 @@ func init_unlocks() -> void: else: unlocks = unlocks # Force ensure_data_integrity() _sanitize_boss_progression() - + # Verify the lessons var number_of_lessons: int = Database.get_lessons_count() if unlocks.size() != number_of_lessons: for index: int in range(number_of_lessons): if not unlocks.has(index+1): - unlocks[index + 1] = { - "look_and_learn": Status.LOCKED, - "games": [ - Status.LOCKED, - Status.LOCKED, - Status.LOCKED, - ], - "last_duration": PackedInt32Array([0, 0, 0]), - "total_duration": PackedInt32Array([0, 0, 0]) - } + unlocks[index + 1] = _build_default_lesson_unlock(index + 1) # Make sure that the first garden is always accessible if unlocks.has(1): @@ -74,37 +111,46 @@ func ensure_data_integrity(data: Dictionary[int, Dictionary]) -> Dictionary: if not result.has(index): if not is_init: Log.warn("StudentProgression: Garden %d missing → added with default values." % index) - result[index] = { - "games": [Status.LOCKED, Status.LOCKED, Status.LOCKED], - "look_and_learn": Status.LOCKED, - "last_duration": PackedInt32Array([0, 0, 0]), - "total_duration": PackedInt32Array([0, 0, 0]) - } + result[index] = _build_default_lesson_unlock(index) # Check internal structure for index: int in result.keys(): var garden: Dictionary = result[index] + var minigame_count: int = get_minigame_count_for_lesson(index) # Check missing keys if not garden.has("games"): if not is_init: Log.warn("StudentProgression: Garden %d: Add missing key 'games'." % index) - garden["games"] = [Status.LOCKED, Status.LOCKED, Status.LOCKED] + garden["games"] = _make_locked_games_array(minigame_count) if not garden.has("look_and_learn"): if not is_init: Log.warn("StudentProgression: Garden %d: Add missing key 'look_and_learn'." % index) garden["look_and_learn"] = Status.LOCKED if not garden.has("last_duration"): - garden["last_duration"] = PackedInt32Array([0, 0, 0]) + garden["last_duration"] = _make_zero_durations(minigame_count) if not garden.has("total_duration"): - garden["total_duration"] = PackedInt32Array([0, 0, 0]) + garden["total_duration"] = _make_zero_durations(minigame_count) - # Check array "games" - if typeof(garden["games"]) != TYPE_ARRAY or (garden["games"] as Array).size() != 3: + # Check array "games": a corrupt (non-array) value is reset, but a size + # mismatch (the lesson's minigame count changed) is resized in place so we + # keep existing progress for the slots that remain instead of wiping it. + if typeof(garden["games"]) != TYPE_ARRAY: if not is_init: Log.warn("StudentProgression: Garden %d: invalid format for 'games' → reset." % index) - garden["games"] = [Status.LOCKED, Status.LOCKED, Status.LOCKED] + garden["games"] = _make_locked_games_array(minigame_count) + elif (garden["games"] as Array).size() != minigame_count: + if not is_init: + Log.warn("StudentProgression: Garden %d: 'games' resized from %d to %d, progress preserved." % [index, (garden["games"] as Array).size(), minigame_count]) + garden["games"] = _resize_games_array(garden["games"] as Array, minigame_count) + + # Keep duration metrics aligned with the minigame count, preserving the + # recorded times for the slots that remain. + if (garden["last_duration"] as PackedInt32Array).size() != minigame_count: + garden["last_duration"] = _resize_durations(garden["last_duration"] as PackedInt32Array, minigame_count) + if (garden["total_duration"] as PackedInt32Array).size() != minigame_count: + garden["total_duration"] = _resize_durations(garden["total_duration"] as PackedInt32Array, minigame_count) # Check value outside of possible enum values - for game_index: int in range(3): + for game_index: int in range((garden["games"] as Array).size()): if garden["games"][game_index] not in [Status.LOCKED, Status.UNLOCKED, Status.COMPLETED]: garden["games"][game_index] = Status.LOCKED if garden["look_and_learn"] not in [Status.LOCKED, Status.UNLOCKED, Status.COMPLETED]: @@ -126,30 +172,57 @@ func ensure_data_integrity(data: Dictionary[int, Dictionary]) -> Dictionary: # First garden (key 1) is always unlocked prev_completed = true + var minigame_count: int = (garden["games"] as Array).size() + # Case: previous garden not completed if not prev_completed: - for game_index: int in range(3): - if garden["games"][game_index] != Status.LOCKED or garden["look_and_learn"] != Status.LOCKED: - if not is_init: - Log.warn("StudentProgression: Garden %d: invalid progression (previous not finished) → reset." % index) - garden["games"] = [Status.LOCKED, Status.LOCKED, Status.LOCKED] - garden["look_and_learn"] = Status.LOCKED - break + var needs_reset: bool = garden["look_and_learn"] != Status.LOCKED + if not needs_reset: + for game_index: int in range(minigame_count): + if garden["games"][game_index] != Status.LOCKED: + needs_reset = true + break + if needs_reset: + if not is_init: + Log.warn("StudentProgression: Garden %d: invalid progression (previous not finished) → reset." % index) + garden["games"] = _make_locked_games_array(minigame_count) + garden["look_and_learn"] = Status.LOCKED continue - # Case: lesson completed → unlock games if needed + # Enforce sequential unlock: first non-COMPLETED game → UNLOCKED, everything + # after it → LOCKED (including out-of-order COMPLETED in old saves). if garden["look_and_learn"] == Status.COMPLETED: - for game_index: int in range(3): - if garden["games"][game_index] == Status.LOCKED: - garden["games"][game_index] = Status.UNLOCKED + var next_to_play: int = -1 + for game_index: int in range(minigame_count): + if garden["games"][game_index] != Status.COMPLETED: + next_to_play = game_index + break + if next_to_play >= 0: + if garden["games"][next_to_play] == Status.LOCKED: + garden["games"][next_to_play] = Status.UNLOCKED if not is_init: - Log.warn("StudentProgression: Garden %d: game %d unlocked because lesson is completed" % [index, game_index + 1]) - - # Case: previous garden completed → unlock lesson if needed - elif garden["look_and_learn"] == Status.LOCKED: - garden["look_and_learn"] = Status.UNLOCKED - if not is_init: - Log.warn("StudentProgression: Garden %d: lesson unlocked because previous garden is completed" % index) + Log.warn("StudentProgression: Garden %d: minigame %d unlocked because it is next to play" % [index, next_to_play]) + for game_index: int in range(next_to_play + 1, minigame_count): + if garden["games"][game_index] != Status.LOCKED: + var was_completed: bool = garden["games"][game_index] == Status.COMPLETED + garden["games"][game_index] = Status.LOCKED + if not is_init: + if was_completed: + Log.warn("StudentProgression: Garden %d: minigame %d demoted from COMPLETED to LOCKED (out of play order — minigame %d not yet completed)" % [index, game_index, next_to_play]) + else: + Log.warn("StudentProgression: Garden %d: minigame %d re-locked (waits for minigame %d to be completed)" % [index, game_index, game_index - 1]) + else: + # L&L not completed → no game may be UNLOCKED (COMPLETED preserved). + for game_index: int in range(minigame_count): + if garden["games"][game_index] == Status.UNLOCKED: + garden["games"][game_index] = Status.LOCKED + if not is_init: + Log.warn("StudentProgression: Garden %d: minigame %d re-locked (look-and-learn not completed)" % [index, game_index]) + # Case: previous garden completed → unlock lesson if needed + if garden["look_and_learn"] == Status.LOCKED: + garden["look_and_learn"] = Status.UNLOCKED + if not is_init: + Log.warn("StudentProgression: Garden %d: lesson unlocked because previous garden is completed" % index) _sanitize_boss_progression() return result @@ -238,19 +311,25 @@ func get_max_unlocked_lesson_index() -> int: func is_lesson_completed(lesson_number: int) -> bool: - return unlocks[lesson_number]["look_and_learn"] == Status.COMPLETED and unlocks[lesson_number]["games"][0] == Status.COMPLETED and unlocks[lesson_number]["games"][1] == Status.COMPLETED and unlocks[lesson_number]["games"][2] == Status.COMPLETED + if unlocks[lesson_number]["look_and_learn"] != Status.COMPLETED: + return false + for game_status: int in unlocks[lesson_number]["games"]: + if game_status != Status.COMPLETED: + return false + return true # Return true if the progression is saved or false if the look and learn was already completed func look_and_learn_completed(lesson_number: int) -> bool: if unlocks[lesson_number]["look_and_learn"] == Status.COMPLETED: return false - + unlocks[lesson_number]["look_and_learn"] = Status.COMPLETED - - for index: int in range(3): - unlocks[lesson_number]["games"][index] = Status.UNLOCKED - + + var games: Array = unlocks[lesson_number]["games"] + if games.size() > 0 and games[0] == Status.LOCKED: + games[0] = Status.UNLOCKED + last_modified = Time.get_datetime_string_from_system(true) progression_changed.emit() return true @@ -258,20 +337,27 @@ func look_and_learn_completed(lesson_number: int) -> bool: # Return true if the progression is saved or false if the game was already completed func game_completed(lesson_number: int, game_number: int) -> bool: - # If the game is already completed, do nothing - if unlocks[lesson_number]["games"][game_number] == Status.COMPLETED: + var games: Array = unlocks[lesson_number]["games"] + + if games[game_number] == Status.COMPLETED: return false - - unlocks[lesson_number]["games"][game_number] = Status.COMPLETED - + + games[game_number] = Status.COMPLETED + + var next_game_index: int = game_number + 1 + if next_game_index < games.size() and games[next_game_index] == Status.LOCKED: + games[next_game_index] = Status.UNLOCKED + var all_completed: bool = true - for index: int in range(3): - all_completed = all_completed and unlocks[lesson_number]["games"][index] == Status.COMPLETED - + for game_status: int in games: + if game_status != Status.COMPLETED: + all_completed = false + break + if all_completed: if unlocks.has(lesson_number + 1): unlocks[lesson_number + 1]["look_and_learn"] = Status.UNLOCKED - + last_modified = Time.get_datetime_string_from_system(true) progression_changed.emit() return true @@ -320,13 +406,14 @@ func clear_boss_block() -> void: func add_level_time(lesson_number: int, game_number: int, time_spent: int) -> void: Log.trace("StudentProgression: Add time to level %d, minigame %d. Time added: %s" % [lesson_number, game_number, time_spent]) - if game_number > 2: - Log.error("StudentProgression: Cannot log a level time for a minigame number superior to 2") - return - if not unlocks.has(lesson_number): Log.error("StudentProgression: Cannot log a level time for lesson %d because it does not exists in progression data" % lesson_number) return + + var minigame_count: int = (unlocks[lesson_number]["games"] as Array).size() + if game_number < 0 or game_number >= minigame_count: + Log.error("StudentProgression: Cannot log a level time for minigame %d in lesson %d (lesson has %d minigame(s))" % [game_number, lesson_number, minigame_count]) + return if not (unlocks[lesson_number] as Dictionary).has("last_duration") or not (unlocks[lesson_number]["last_duration"] as PackedInt32Array).size() > game_number: Log.error("StudentProgression: Cannot log a last_duration for lesson %d, game %d, because it does not exists" % [lesson_number, game_number]) diff --git a/sources/gardens/boss_button.tscn b/sources/gardens/boss_button.tscn index 3b3a2e78..e4aebf58 100644 --- a/sources/gardens/boss_button.tscn +++ b/sources/gardens/boss_button.tscn @@ -14,6 +14,7 @@ offset_bottom = 512.0 pivot_offset = Vector2(180, 180) size_flags_horizontal = 4 size_flags_vertical = 4 +mouse_filter = 1 texture_normal = ExtResource("lesson_circle") texture_pressed = ExtResource("lesson_circle") texture_hover = ExtResource("lesson_circle") @@ -35,6 +36,7 @@ anchor_right = 0.5 anchor_bottom = 0.5 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 1 [node name="Border" type="TextureRect" parent="." unique_id=758604924] unique_name_in_owner = true diff --git a/sources/gardens/gardens.gd b/sources/gardens/gardens.gd index e134c678..71deb8cd 100644 --- a/sources/gardens/gardens.gd +++ b/sources/gardens/gardens.gd @@ -4,6 +4,22 @@ extends Control signal minigame_layout_opened() const KALULU: GDScript = preload("res://sources/minigames/base/kalulu_ingame.gd") +const MINIGAME_WEDGE_SCENE: PackedScene = preload("res://sources/gardens/minigame_wedge.tscn") +# Wheel geometry, in MinigameSelection-local coords (canvas 2560×1800). +const WHEEL_CENTER: Vector2 = Vector2(1280, 900) +# Matches the inner edge of big_button.png; past this the gray ring hides everything. +const WHEEL_RADIUS: float = 815.0 +const WHEEL_ARC_SEGMENTS: int = 48 +const WHEEL_ICON_DISTANCE_RATIO: float = 0.55 +const WHEEL_DIVIDER_WIDTH: float = 12.0 +const WHEEL_HIGHLIGHT_WIDTH: float = 12.0 +# Outline around the central Look-and-Learn button. Drawn at the button's visible +# edge. Colored dark by default, gold when L&L is the next-to-play step. +const LESSON_BUTTON_OUTLINE_RADIUS: float = 192.0 +# Top inset of the wheel's central label so the grapheme text sits just below the +# button center, mirroring the movie icon just above it. The 384x384 button has +# its center at y=192; the label (vertical-centered) then centers at y=(this+384)/2. +const LESSON_BUTTON_LABEL_TOP_OFFSET: float = 104.0 const GARDEN_SCENES: Array[PackedScene] = [ preload("res://resources/gardens/garden_01.tscn"), preload("res://resources/gardens/garden_02.tscn"), @@ -48,12 +64,12 @@ static var cached_layout_lessons: int = 0 get: return _gardens_layout @export var starting_garden: int = -1 -@export_category("Colors") -@export var unlocked_color: Color = Color("1c2662") -@export var locked_color: Color = Color("1d2229") -@export_group("Minigames") +@export_category("Minigames") @export var minigame_scene_paths: PackedStringArray = PackedStringArray() -@export var minigames_icons: Array[Texture] = [] +## Animal body (colored by the garden) and face (kept as-is for eyes/mouth details). +## Both arrays must be the same length and aligned with `minigame_scene_paths`. +@export var minigames_body_icons: Array[Texture] = [] +@export var minigames_face_icons: Array[Texture] = [] var _minigame_scene_cache: Dictionary = {} var lessons: Dictionary = {} @@ -84,17 +100,16 @@ var is_back_button_hold_active: bool = false @onready var boss_buttons_container: Control = %BossButtons @onready var minigame_selection: Control = %MinigameSelection @onready var lesson_button: LessonButton = %LessonButton +@onready var lesson_button_outline: Line2D = %LessonButtonOutline +@onready var lesson_button_movie_icon: TextureRect = %MovieIcon @onready var lesson_button_particles: GPUParticles2D = %LessonButtonParticles @onready var back_button: BackButton = %BackButton @onready var right_audio_stream_player: AudioStreamPlayer = $RightAudioStreamPlayer @onready var left_audio_stream_player: AudioStreamPlayer = $LeftAudioStreamPlayer @onready var feedback_audio_stream_player: AudioStreamPlayer = $FeedBackAudioStreamPlayer @onready var feedback_audio_stream_player2: AudioStreamPlayer = $FeedBackAudioStreamPlayer2 -@onready var minigame_layout_1: MinigameLayout = %MinigameBackground1 -@onready var minigame_layout_2: MinigameLayout = %MinigameBackground2 -@onready var minigame_layout_3: MinigameLayout = %MinigameBackground3 -@onready var minigame_background: TextureRect = %MinigameBackground -@onready var minigame_background_center: TextureRect = %MinigameBackgroundCenter +@onready var wedges_container: Control = %WedgesContainer +@onready var background_rect: ColorRect = %BackgroundRect @onready var lock: Control = %Lock @onready var kalulu: KALULU = %Kalulu @onready var kalulu_button: CanvasItem = %KaluluButton @@ -669,7 +684,6 @@ func _process(_delta: float) -> void: _process_back_button_hold(_delta) locked_line.position.x = - scroll_container.scroll_horizontal unlocked_line.position.x = - scroll_container.scroll_horizontal - boss_buttons_container.position.x = - scroll_container.scroll_horizontal parallax_background.scroll_offset.x = - scroll_container.scroll_horizontal clouds.scroll_offset = scroll_container.scroll_horizontal @@ -688,17 +702,198 @@ func _process_back_button_hold(delta: float) -> void: _confirm_back_button_pressed() -func _get_minigame_layouts() -> Array[MinigameLayout]: - return [minigame_layout_1, minigame_layout_2, minigame_layout_3] +# Single source of truth for wedge geometry. Returns the pie-slice's start/end +# angles and the bisector angle along which the icon sits, for wedge `wedge_index` +# of a wheel showing `minigame_count` wedges (1..3). +# N=1: full disc, icon to the left of the L&L button. +# N=2: game 0 left half, game 1 right half. +# N=3: game 0 top-right, game 1 bottom, game 2 top-left. +static func _get_wedge_angles(minigame_count: int, wedge_index: int) -> Dictionary: + if minigame_count == 1: + return {start = 0.0, end = TAU, icon = PI} + if minigame_count == 2: + if wedge_index == 0: + return {start = PI / 2.0, end = 3.0 * PI / 2.0, icon = PI} + return {start = -PI / 2.0, end = PI / 2.0, icon = 0.0} + if wedge_index == 0: + return {start = -PI / 2.0, end = PI / 6.0, icon = -PI / 6.0} + if wedge_index == 1: + return {start = PI / 6.0, end = 5.0 * PI / 6.0, icon = PI / 2.0} + return {start = 5.0 * PI / 6.0, end = 3.0 * PI / 2.0, icon = 7.0 * PI / 6.0} + + +static func _get_wedge_layout(minigame_count: int, wedge_index: int) -> Dictionary: + var angles: Dictionary = _get_wedge_angles(minigame_count, wedge_index) + var polygon: PackedVector2Array = _generate_full_disc_polygon() if minigame_count == 1 \ + else _generate_pie_slice_polygon(angles.start as float, angles.end as float) + return {polygon = polygon, icon_center = _wedge_icon_position(angles.icon as float)} + + +static func _generate_pie_slice_polygon(start_angle: float, end_angle: float, radius: float = WHEEL_RADIUS) -> PackedVector2Array: + var wheel_points: PackedVector2Array = PackedVector2Array() + wheel_points.append(WHEEL_CENTER) + var span: float = end_angle - start_angle + for index: int in range(WHEEL_ARC_SEGMENTS + 1): + var angle: float = start_angle + span * (float(index) / float(WHEEL_ARC_SEGMENTS)) + wheel_points.append(WHEEL_CENTER + Vector2(cos(angle), sin(angle)) * radius) + return wheel_points + + +static func _generate_full_disc_polygon(radius: float = WHEEL_RADIUS) -> PackedVector2Array: + var wheel_points: PackedVector2Array = PackedVector2Array() + for index: int in range(WHEEL_ARC_SEGMENTS): + var angle: float = TAU * float(index) / float(WHEEL_ARC_SEGMENTS) + wheel_points.append(WHEEL_CENTER + Vector2(cos(angle), sin(angle)) * radius) + return wheel_points + + +# Wedge polygon with outer arc inset by half the stroke width so the gold line +# stays inside the wedge. Radial edges keep their angles (fall on the dividers). +static func _generate_wedge_highlight_polygon(minigame_count: int, wedge_index: int) -> PackedVector2Array: + var inset_radius: float = WHEEL_RADIUS - WHEEL_HIGHLIGHT_WIDTH * 0.5 + if minigame_count == 1: + return _generate_full_disc_polygon(inset_radius) + var angles: Dictionary = _get_wedge_angles(minigame_count, wedge_index) + return _generate_pie_slice_polygon(angles.start as float, angles.end as float, inset_radius) + + +static func _wedge_icon_position(angle_rad: float) -> Vector2: + return WHEEL_CENTER + Vector2(cos(angle_rad), sin(angle_rad)) * (WHEEL_RADIUS * WHEEL_ICON_DISTANCE_RATIO) + + +static func _get_divider_segments(minigame_count: int) -> Array[PackedVector2Array]: + var segments: Array[PackedVector2Array] = [] + if minigame_count < 2: + return segments + for wedge_index: int in range(minigame_count): + var start_angle: float = _get_wedge_angles(minigame_count, wedge_index).start as float + var edge: Vector2 = WHEEL_CENTER + Vector2(cos(start_angle), sin(start_angle)) * WHEEL_RADIUS + segments.append(PackedVector2Array([WHEEL_CENTER, edge])) + return segments + + +func _clear_wheel() -> void: + for child: Node in wedges_container.get_children(): + child.queue_free() + + +func _build_wheel(exercises: Array[int], lesson_unlocks: Dictionary) -> void: + _clear_wheel() + var minigame_count: int = exercises.size() + for wedge_index: int in range(minigame_count): + var layout: Dictionary = _get_wedge_layout(minigame_count, wedge_index) + var exercise_type: int = exercises[wedge_index] + var icon_index: int = exercise_type - 1 + # Guard against exercise types with no matching wheel icon (e.g. the + # removed fish minigame, type 10): fall back to the highest available one + # so we never index past the icon arrays. + var max_icon_index: int = minigames_body_icons.size() - 1 + if icon_index < 0 or icon_index > max_icon_index: + Log.error("Gardens: Exercise type %d has no wheel icon (%d available); using the highest available minigame instead." % [exercise_type, minigames_body_icons.size()]) + icon_index = clampi(icon_index, 0, max_icon_index) + var status: StudentProgression.Status = lesson_unlocks["games"][wedge_index] as StudentProgression.Status + var wedge: MinigameWedge = MINIGAME_WEDGE_SCENE.instantiate() + wedges_container.add_child(wedge) + var is_wedge_locked: bool = status == StudentProgression.Status.LOCKED + wedge.configure( + layout.polygon as PackedVector2Array, + layout.icon_center as Vector2, + minigames_body_icons[icon_index], + minigames_face_icons[icon_index], + _wedge_color_for_status(status), + _body_color_for_status(status), + is_wedge_locked, + ) + wedge.is_disabled = is_wedge_locked + wedge.pressed.connect(_on_minigame_button_pressed.bind(icon_index, wedge_index)) + _apply_wedge_status_effects(wedge, status, wedge_index) + + for line_points: PackedVector2Array in _get_divider_segments(minigame_count): + var divider: Line2D = Line2D.new() + divider.width = WHEEL_DIVIDER_WIDTH + divider.default_color = current_garden.wheel_background + divider.points = line_points + wedges_container.add_child(divider) + + _draw_next_to_play_highlight(lesson_unlocks, minigame_count) + + +func _next_to_play_wedge_index(lesson_unlocks: Dictionary) -> int: + if lesson_unlocks["look_and_learn"] != StudentProgression.Status.COMPLETED: + return -1 + var games: Array = lesson_unlocks["games"] + for index: int in range(games.size()): + if games[index] == StudentProgression.Status.UNLOCKED: + return index + return -1 + + +func _draw_next_to_play_highlight(lesson_unlocks: Dictionary, minigame_count: int) -> void: + # L&L's "next to play" cue is the lesson-button outline color swap, handled + # in _configure_lesson_button_outline(). Wedges get a separate gold ring here. + var wedge_index: int = _next_to_play_wedge_index(lesson_unlocks) + if wedge_index < 0: + return + _draw_wedge_highlight(minigame_count, wedge_index) + + +func _draw_wedge_highlight(minigame_count: int, wedge_index: int) -> void: + _add_highlight_line(_generate_wedge_highlight_polygon(minigame_count, wedge_index)) + + +# Adds a gold outline tracing the given polygon to the wheel. The polyline is +# closed automatically. z_index lifts the line above Branches; LessonButton's +# higher z_index keeps it on top in turn. +func _add_highlight_line(polygon_points: PackedVector2Array) -> void: + if polygon_points.is_empty(): + return + var outline: PackedVector2Array = PackedVector2Array(polygon_points) + outline.append(polygon_points[0]) + var line: Line2D = Line2D.new() + line.width = WHEEL_HIGHLIGHT_WIDTH + line.default_color = Garden.WHEEL_HIGHLIGHT + line.joint_mode = Line2D.LINE_JOINT_ROUND + line.begin_cap_mode = Line2D.LINE_CAP_ROUND + line.end_cap_mode = Line2D.LINE_CAP_ROUND + line.points = outline + line.z_index = 5 + wedges_container.add_child(line) + + +func _wedge_color_for_status(status: StudentProgression.Status) -> Color: + match status: + StudentProgression.Status.LOCKED: + return Garden.WHEEL_WEDGE_LOCKED + _: + return current_garden.wheel_wedge_unlocked + + +# Animal body tint: gray when locked, garden's signature color otherwise. +func _body_color_for_status(status: StudentProgression.Status) -> Color: + if status == StudentProgression.Status.LOCKED: + return Garden.ANIMAL_LOCKED_COLOR + return current_garden.animal_unlocked_color + + +func _apply_wedge_status_effects(wedge: MinigameWedge, status: StudentProgression.Status, wedge_index: int) -> void: + if status != StudentProgression.Status.COMPLETED: + return + if not transition_data \ + or not transition_data.get("minigame_completed", false) \ + or transition_data.get("minigame_number", -1) != wedge_index \ + or not transition_data.get("first_clear", false): + return + await minigame_layout_opened + create_tween().tween_property(wedge, "modulate:a", 0.6, 0.5) + wedge.right() func _open_minigames_layout(button: LessonButton, lesson_number: int) -> void: if in_minigame_selection or not UserDataManager.student_progression: return - # Gets the correct exercises for the lesson var exercises: Array[int] = Database.get_exercise_for_lesson(lesson_number) - if not exercises or exercises.size() < 3: - Log.error("Gardens: Cannot open minigame layout for lesson %d: expected 3 exercises, got %d" % [lesson_number, exercises.size() if exercises else 0]) + if exercises.is_empty(): + Log.error("Gardens: Cannot open minigame layout for lesson %d: no minigames defined" % lesson_number) return feedback_audio_stream_player2.pitch_scale = 1.1 feedback_audio_stream_player2.play() @@ -714,69 +909,84 @@ func _open_minigames_layout(button: LessonButton, lesson_number: int) -> void: current_button_global_position = button.global_position # Gets the current lesson unlocks var lesson_unlocks: Dictionary = UserDataManager.student_progression.unlocks[current_lesson_number] - var are_minigames_locked: bool = lesson_unlocks["games"][0] == StudentProgression.Status.LOCKED and lesson_unlocks["games"][1] == StudentProgression.Status.LOCKED and lesson_unlocks["games"][2] == StudentProgression.Status.LOCKED # Deactivate the mouse filters on the buttons behind the layout for lesson_button_item: LessonButton in current_garden.get_lesson_buttons(): lesson_button_item.mouse_filter = Control.MOUSE_FILTER_IGNORE - # Background - if are_minigames_locked: - minigame_background_center.modulate = locked_color - else: - minigame_background_center.modulate = current_garden.color - # Lesson button - _handle_lesson_button(current_lesson_number, lesson_unlocks["look_and_learn"] as StudentProgression.Status) - # Minigames - var minigame_layouts: Array[MinigameLayout] = _get_minigame_layouts() - for layout_index: int in minigame_layouts.size(): - _fill_minigame_choice(minigame_layouts[layout_index], exercises[layout_index], lesson_unlocks["games"][layout_index] as StudentProgression.Status, layout_index) + var ll_status: StudentProgression.Status = lesson_unlocks["look_and_learn"] as StudentProgression.Status + background_rect.color = current_garden.wheel_background + _configure_lesson_button_outline(ll_status) + _center_lesson_button_label() + _handle_lesson_button(current_lesson_number, ll_status) + _build_wheel(exercises, lesson_unlocks) # Animations minigame_selection.show() back_button.hide() kalulu_button.hide() line_particles.hide() - minigame_background.size = 300.0 * Vector2.ONE - minigame_background.global_position = current_button_global_position - minigame_background.show() - minigame_background_center.size = 300.0 * Vector2.ONE - minigame_background_center.global_position = current_button_global_position - minigame_background_center.show() - var tween: Tween = create_tween().set_parallel(true).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) - tween.tween_property(minigame_background_center, "scale", (1800.0 / 300.0) * Vector2.ONE, 0.25) - tween.tween_property(minigame_background_center, "global_position", Vector2(380.0, 0), 0.25) - tween.tween_property(minigame_background, "scale", (1800.0 / 300.0) * Vector2.ONE, 0.25) - tween.tween_property(minigame_background, "global_position", Vector2(380.0, 0), 0.25) - tween.chain().tween_property(minigame_selection, "modulate:a", 1.0, 0.25) + var tween: Tween = create_tween().set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) + tween.tween_property(minigame_selection, "modulate:a", 1.0, 0.25) await tween.finished minigame_layout_opened.emit() +# Perfectly centers the grapheme label horizontally and drops it just below the +# button center, so it pairs with the movie icon sitting just above. Done in code +# because instanced-scene property overrides on the inherited Label don't survive +# Godot re-saves. This LessonButton is a dedicated wheel instance, so it doesn't +# affect the garden lesson buttons. +func _center_lesson_button_label() -> void: + var label: Label = lesson_button.label + label.anchor_left = 0.0 + label.anchor_top = 0.0 + label.anchor_right = 1.0 + label.anchor_bottom = 1.0 + label.offset_left = 0.0 + label.offset_right = 0.0 + label.offset_top = LESSON_BUTTON_LABEL_TOP_OFFSET + label.offset_bottom = 0.0 + + +func _configure_lesson_button_outline(ll_status: StudentProgression.Status) -> void: + # Gold when L&L is the next-to-play step (UNLOCKED but not yet COMPLETED), + # divider color otherwise. Replaces the separate gold ring we used to draw. + var color: Color = Garden.WHEEL_HIGHLIGHT if ll_status == StudentProgression.Status.UNLOCKED else current_garden.wheel_background + lesson_button_outline.default_color = color + var circle_points: PackedVector2Array = _generate_full_disc_polygon(LESSON_BUTTON_OUTLINE_RADIUS) + if circle_points.size() > 0: + circle_points.append(circle_points[0]) + lesson_button_outline.points = circle_points + + func _handle_lesson_button(lesson_number: int, status: StudentProgression.Status) -> void: lesson_button.text = lessons[lesson_number][0].grapheme + # Center stays the unlocked-wedge color across all states; pair it with the + # garden's dark color so the label and icon stay readable on it. + lesson_button.set_garden_colors( + current_garden.wheel_wedge_unlocked, + current_garden.unlocked_lesson, + current_garden.wheel_wedge_unlocked, + current_garden.unlocked_lesson, + ) lesson_button.set_button_disabled(status == StudentProgression.Status.LOCKED) lesson_button.completed = status == StudentProgression.Status.COMPLETED + # Override the hardcoded gray LessonButton uses when disabled, so the L&L + # center button keeps a uniform background regardless of progression state. + lesson_button.center.modulate = current_garden.wheel_wedge_unlocked lesson_button_particles.emitting = status == StudentProgression.Status.UNLOCKED + lesson_button_movie_icon.modulate = _lesson_button_label_color(status) if status == StudentProgression.Status.COMPLETED: if transition_data and transition_data.has("look_and_learn_completed") and transition_data.look_and_learn_completed: await minigame_layout_opened lesson_button.right() -func _fill_minigame_choice(minigame_layout: MinigameLayout, exercise_type: int, status: StudentProgression.Status, minigame_number: int) -> void: - minigame_layout.icon.texture = minigames_icons[exercise_type-1] - minigame_layout.is_disabled = status == StudentProgression.Status.LOCKED +# Mirrors LessonButton._update_visual_state() so the movie icon tracks the label. +func _lesson_button_label_color(status: StudentProgression.Status) -> Color: + if status == StudentProgression.Status.LOCKED: + return LessonButton.LOCKED_LABEL_COLOR if status == StudentProgression.Status.COMPLETED: - if transition_data and transition_data.has("minigame_completed") and transition_data.minigame_completed and transition_data.has("minigame_number") and transition_data.minigame_number == minigame_number and transition_data.has("first_clear") and transition_data.first_clear: - minigame_layout.self_modulate = unlocked_color - await minigame_layout_opened - create_tween().tween_property(minigame_layout, "self_modulate:a", 0, 0.5) - minigame_layout.right() - else: - minigame_layout.self_modulate.a = 0 - elif status == StudentProgression.Status.LOCKED: - minigame_layout.self_modulate = locked_color - else: - minigame_layout.self_modulate = unlocked_color - minigame_layout.pressed.connect(_on_minigame_button_pressed.bind(exercise_type - 1, minigame_number)) + return lesson_button.completed_label_color + return lesson_button.unlocked_label_color func _get_minigame_scene(scene_index: int) -> PackedScene: @@ -811,26 +1021,18 @@ func _close_minigames_layout() -> void: in_minigame_selection = false feedback_audio_stream_player2.pitch_scale = 0.75 feedback_audio_stream_player2.play() - var tween: Tween = create_tween().set_parallel(true).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) + var tween: Tween = create_tween().set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) tween.tween_property(minigame_selection, "modulate:a", 0.0, 0.25) - var other_tween: Tween = tween.chain() - other_tween.tween_property(minigame_background_center, "scale", Vector2.ONE, 0.25) - other_tween.tween_property(minigame_background_center, "global_position", current_button_global_position, 0.25) - other_tween.tween_property(minigame_background, "scale", Vector2.ONE, 0.25) - other_tween.tween_property(minigame_background, "global_position", current_button_global_position, 0.25) await tween.finished if current_button: current_button.show_placeholder(false) minigame_selection.hide() - minigame_background.hide() - minigame_background_center.hide() back_button.show() kalulu_button.show() line_particles.show() for button: LessonButton in current_garden.get_lesson_buttons(): button.mouse_filter = Control.MOUSE_FILTER_STOP - for layout: MinigameLayout in _get_minigame_layouts(): - layout.pressed.disconnect(_on_minigame_button_pressed) + _clear_wheel() #region Lesson setup and path @@ -967,8 +1169,6 @@ func _sync_boss_buttons_container() -> void: if not boss_buttons_container or not garden_parent: return boss_buttons_container.mouse_filter = Control.MOUSE_FILTER_IGNORE - boss_buttons_container.position = Vector2.ZERO - boss_buttons_container.size = scroll_container.size func _clear_boss_buttons() -> void: @@ -1014,7 +1214,6 @@ func _set_up_boss_buttons() -> void: boss_button.set_button_disabled(true) var garden_index: int = _get_garden_index_for_lesson(gate_lesson) boss_button.pressed.connect(_on_boss_button_pressed.bind(gate_lesson, garden_index)) - boss_button.gui_input.connect(_on_boss_button_gui_input) _set_up_final_boss_button() @@ -1041,7 +1240,6 @@ func _set_up_final_boss_button() -> void: boss_button.position = final_boss_center - final_boss_size * 0.5 boss_button.set_button_disabled(false) boss_button.pressed.connect(_on_final_boss_button_pressed.bind(final_lesson_number, last_garden_index)) - boss_button.gui_input.connect(_on_boss_button_gui_input) _update_final_boss_scroll_space(final_boss_center, final_boss_size) @@ -1268,6 +1466,8 @@ func _on_minigame_button_pressed(scene_index: int, minigame_number: int) -> void if not minigame_scene: Log.error("Gardens: Missing minigame scene for index %d" % scene_index) return + # Block a second wedge click during the curtain-close await below. + _lock() feedback_audio_stream_player.play() await (OpeningCurtain as OpeningCurtainClass).close() Minigame.transition_data = { @@ -1308,19 +1508,6 @@ func _on_scroll_container_gui_input(event: InputEvent) -> void: scroll_container.scroll_horizontal -= int(motion_event.relative.x) -func _on_boss_button_gui_input(event: InputEvent) -> void: - # Boss buttons live outside the ScrollContainer, so without forwarding, - # their default STOP mouse filter would swallow scroll events that pass over them. - if event is InputEventMouseButton: - var mb: InputEventMouseButton = event - if mb.button_index == MOUSE_BUTTON_WHEEL_UP or mb.button_index == MOUSE_BUTTON_WHEEL_DOWN \ - or mb.button_index == MOUSE_BUTTON_WHEEL_LEFT or mb.button_index == MOUSE_BUTTON_WHEEL_RIGHT: - _on_scroll_container_gui_input(event) - return - if is_scrolling and event is InputEventMouseMotion: - _on_scroll_container_gui_input(event) - - func _scroll_by_garden(p_direction: int) -> void: var target_scroll: int = scroll_container.scroll_horizontal + p_direction * 200 scroll_container.scroll_horizontal = target_scroll @@ -1357,6 +1544,31 @@ func _on_area_2d_input_event(_viewport: Node, event: InputEvent, _shape_idx: int _close_minigames_layout() +# BackgroundRect spans the wheel screen with mouse_filter=STOP so it absorbs +# every click that doesn't hit the L&L button (which is on top of it). We +# dispatch the click to the matching wedge via point-in-polygon, or close the +# wheel if the click falls outside every wedge. +func _on_background_rect_gui_input(event: InputEvent) -> void: + if is_locked or not in_minigame_selection: + return + if not event.is_action_pressed("left_click"): + return + var click_pos: Vector2 = (event as InputEventMouseButton).position + for child: Node in wedges_container.get_children(): + if child is MinigameWedge: + var wedge: MinigameWedge = child + if Geometry2D.is_point_in_polygon(click_pos, wedge.polygon.polygon): + # Hit on a wedge — enabled ones launch the minigame; disabled + # ones play the wrong-click feedback. Either way the click is + # consumed so the wheel stays open. + if wedge.is_disabled: + wedge.wrong() + else: + wedge.pressed.emit() + return + _close_minigames_layout() + + func _on_kalulu_button_pressed() -> void: kalulu_button.hide() if current_garden.get_progress_ratio() > 0.75: diff --git a/sources/gardens/gardens.tscn b/sources/gardens/gardens.tscn index f0e14cee..d297d1e0 100644 --- a/sources/gardens/gardens.tscn +++ b/sources/gardens/gardens.tscn @@ -2,36 +2,17 @@ [ext_resource type="Script" uid="uid://djolw68efn6r5" path="res://sources/gardens/gardens.gd" id="1_qlsw4"] [ext_resource type="Texture2D" uid="uid://jlwblk7lj7vi" path="res://assets/vfx/fx_10.png" id="3_xbvhu"] -[ext_resource type="Texture2D" uid="uid://cq5wwf7y1msh7" path="res://assets/minigames/crabs/graphic/gauge_icon_crab_full.png" id="5_h8c5w"] -[ext_resource type="Texture2D" uid="uid://di2qcv6jw8wh0" path="res://assets/minigames/parakeets/graphic/gauge_icon_parakeet_full.png" id="6_hekq6"] -[ext_resource type="Texture2D" uid="uid://cq87j1xw4c31r" path="res://assets/minigames/jellyfish/graphic/gauge_icon_jellyfish_full.png" id="6_p30hm"] -[ext_resource type="Texture2D" uid="uid://cffuqacgb1jra" path="res://assets/lesson_screen/branches.png" id="7_axgdc"] -[ext_resource type="Texture2D" uid="uid://c3okdxpi317x5" path="res://assets/minigames/monkeys/graphic/gauge_icon_monkey_full.png" id="9_68su4"] -[ext_resource type="Texture2D" uid="uid://re7qgivb3n5w" path="res://assets/minigames/frog/graphics/gauge_icon_frog_full.png" id="10_5wvwc"] -[ext_resource type="Texture2D" uid="uid://nwbekpbuu472" path="res://assets/minigames/ants/graphics/gauge_icon_ant_full.png" id="12_ohgqx"] -[ext_resource type="Texture2D" uid="uid://bc3e0qths2cvt" path="res://assets/minigames/boss/boss_icon_full.png" id="16_5rwfp"] -[ext_resource type="Texture2D" uid="uid://bmdhpgxmur1vo" path="res://assets/minigames/caterpillar/graphics/gauge_icon_caterpillar_full.png" id="16_prl1o"] [ext_resource type="AudioStream" uid="uid://4bv1hr6r68op" path="res://assets/gardens/ui_transition_right.mp3" id="17_37f6y"] -[ext_resource type="Texture2D" uid="uid://rnqme2j272qf" path="res://assets/minigames/turtles/graphic/gauge_icon_turtle_full.png" id="18_12pcf"] [ext_resource type="AudioStream" uid="uid://bwgrj3quwtbvm" path="res://assets/gardens/ui_transition_left.mp3" id="18_bdar8"] -[ext_resource type="Texture2D" uid="uid://bb00fhnenbml5" path="res://assets/lesson_screen/big_button.png" id="20_elp7t"] -[ext_resource type="Texture2D" uid="uid://dq23np4euf6da" path="res://assets/minigames/penguin/graphic/gauge_icon_penguin_full.png" id="20_ouafq"] -[ext_resource type="Texture2D" uid="uid://dlnklpyefn0m2" path="res://assets/lesson_screen/big_button_center.png" id="21_r0a4h"] -[ext_resource type="Material" uid="uid://dne7hgkrp4tdy" path="res://resources/gardens/minigame_icon_material.tres" id="22_cgp31"] -[ext_resource type="Texture2D" uid="uid://dkomjpclxvmqf" path="res://assets/lesson_screen/top_left.png" id="23_p1d10"] -[ext_resource type="Texture2D" uid="uid://rux5delnabp5" path="res://assets/lesson_screen/top_right.png" id="24_30f83"] [ext_resource type="AudioStream" uid="uid://bgof22p2ofunc" path="res://assets/sfx/ui_yes_button.mp3" id="24_ljadf"] [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="25_0ruwb"] [ext_resource type="Texture2D" uid="uid://dx7w01wdyq0b5" path="res://assets/particles/bigstar_x36_15fps.png" id="25_00sy7"] [ext_resource type="AudioStream" uid="uid://vyj4leik80w2" path="res://assets/sfx/swoosh.mp3" id="25_npbuv"] -[ext_resource type="Texture2D" uid="uid://cqhbpt3lk6f15" path="res://assets/lesson_screen/bottom.png" id="25_tyvq6"] [ext_resource type="AudioStream" uid="uid://dlxvbjp63w6wm" path="res://assets/look_and_learn/effect.wav" id="26_5g3l0"] -[ext_resource type="Script" uid="uid://ddew42fnpmsx1" path="res://sources/gardens/minigame_layout.gd" id="28_kvgph"] [ext_resource type="PackedScene" uid="uid://cyoioissvrkj8" path="res://sources/ui/back_button.tscn" id="29_back_button"] [ext_resource type="Texture2D" uid="uid://dj0ygi5q6kbdw" path="res://assets/minigames/minigame_ui/graphic/button_back_normal.png" id="29_cgp31"] [ext_resource type="Texture2D" uid="uid://gmoc5mxxfqin" path="res://assets/minigames/minigame_ui/graphic/button_back_pressed.png" id="30_wnxkf"] [ext_resource type="Texture2D" uid="uid://bnvx1mujmy3vf" path="res://assets/minigames/minigame_ui/graphic/button_back_disabled.png" id="31_b65yw"] -[ext_resource type="PackedScene" uid="uid://cn2rw06pltyiu" path="res://sources/utils/fx/right.tscn" id="33_5y3ye"] [ext_resource type="Texture2D" uid="uid://iw84x6mx8h2g" path="res://assets/minigames/minigame_ui/graphic/button_kalulu_normal.png" id="41_xcos2"] [ext_resource type="Texture2D" uid="uid://ub1dnysbojn8" path="res://assets/minigames/minigame_ui/graphic/button_kalulu_pressed.png" id="42_l35j3"] [ext_resource type="Texture2D" uid="uid://crnxawhf68po3" path="res://assets/minigames/minigame_ui/graphic/button_kalulu_disabled.png" id="43_jfyfk"] @@ -40,6 +21,25 @@ [ext_resource type="Texture2D" uid="uid://rx270y4n7tul" path="res://assets/minigames/parakeets/graphic/cloud_1.png" id="46_cloud1"] [ext_resource type="Texture2D" uid="uid://dphj3hqfnnw4p" path="res://assets/minigames/parakeets/graphic/cloud_2.png" id="47_cloud2"] [ext_resource type="Texture2D" uid="uid://1btgagsporxa" path="res://assets/minigames/parakeets/graphic/cloud_3.png" id="48_cloud3"] +[ext_resource type="Texture2D" uid="uid://d1j23o6nq476v" path="res://assets/gardens/animals/ant_body.png" id="ant_body"] +[ext_resource type="Texture2D" uid="uid://by3xfdin7jrsn" path="res://assets/gardens/animals/ant_face.png" id="ant_face"] +[ext_resource type="Texture2D" uid="uid://b6nrx0dn0h3f2" path="res://assets/gardens/animals/caterpillar_body.png" id="caterpillar_body"] +[ext_resource type="Texture2D" uid="uid://cnihbmks0piwi" path="res://assets/gardens/animals/caterpillar_face.png" id="caterpillar_face"] +[ext_resource type="Texture2D" uid="uid://b2e61oot7ht35" path="res://assets/gardens/animals/crab_body.png" id="crab_body"] +[ext_resource type="Texture2D" uid="uid://ruclqu4dc13u" path="res://assets/gardens/animals/crab_face.png" id="crab_face"] +[ext_resource type="Texture2D" uid="uid://oagcnmxs0xx1" path="res://assets/gardens/animals/frog_body.png" id="frog_body"] +[ext_resource type="Texture2D" uid="uid://b4243242f34g0" path="res://assets/gardens/animals/frog_face.png" id="frog_face"] +[ext_resource type="Texture2D" uid="uid://bb3we2it550v6" path="res://assets/gardens/animals/jellyfish_body.png" id="jellyfish_body"] +[ext_resource type="Texture2D" uid="uid://dppmdv8u3cwl1" path="res://assets/gardens/animals/jellyfish_face.png" id="jellyfish_face"] +[ext_resource type="Texture2D" uid="uid://dr12efhuotfgt" path="res://assets/gardens/animals/monkey_body.png" id="monkey_body"] +[ext_resource type="Texture2D" uid="uid://dc52xvm4y6rir" path="res://assets/gardens/animals/monkey_face.png" id="monkey_face"] +[ext_resource type="Texture2D" uid="uid://c1ml42sp1vqga" path="res://assets/gardens/buttons/movie_icon.png" id="movie_icon"] +[ext_resource type="Texture2D" uid="uid://c2yalimkyunxi" path="res://assets/gardens/animals/parakeet_body.png" id="parakeet_body"] +[ext_resource type="Texture2D" uid="uid://l52tfb7fdrpt" path="res://assets/gardens/animals/parakeet_face.png" id="parakeet_face"] +[ext_resource type="Texture2D" uid="uid://noekve4gjudr" path="res://assets/gardens/animals/penguin_body.png" id="penguin_body"] +[ext_resource type="Texture2D" uid="uid://dbg7mxg3x7vd4" path="res://assets/gardens/animals/penguin_face.png" id="penguin_face"] +[ext_resource type="Texture2D" uid="uid://b7rqldqdft30a" path="res://assets/gardens/animals/turtle_body.png" id="turtle_body"] +[ext_resource type="Texture2D" uid="uid://nu4kpbywwpgn" path="res://assets/gardens/animals/turtle_face.png" id="turtle_face"] [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_ey6av"] blend_mode = 1 @@ -123,7 +123,8 @@ grow_vertical = 2 mouse_filter = 2 script = ExtResource("1_qlsw4") minigame_scene_paths = PackedStringArray("res://sources/minigames/jellyfish/jellyfish_minigame.tscn", "res://sources/minigames/crabs/crabs_minigame.tscn", "res://sources/minigames/parakeets/parakeets_minigame.tscn", "res://sources/minigames/monkeys/monkeys_minigame.tscn", "res://sources/minigames/caterpillar/caterpillar_minigame.tscn", "res://sources/minigames/frog/frog_minigame.tscn", "res://sources/minigames/turtles/turtles_minigame.tscn", "res://sources/minigames/ants/ants_minigame.tscn", "res://sources/minigames/penguin/penguin_minigame.tscn", "res://sources/minigames/boss/boss_minigame.tscn") -minigames_icons = Array[Texture]([ExtResource("6_p30hm"), ExtResource("5_h8c5w"), ExtResource("6_hekq6"), ExtResource("9_68su4"), ExtResource("16_prl1o"), ExtResource("10_5wvwc"), ExtResource("18_12pcf"), ExtResource("12_ohgqx"), ExtResource("20_ouafq"), ExtResource("16_5rwfp")]) +minigames_body_icons = Array[Texture]([ExtResource("jellyfish_body"), ExtResource("crab_body"), ExtResource("parakeet_body"), ExtResource("monkey_body"), ExtResource("caterpillar_body"), ExtResource("frog_body"), ExtResource("turtle_body"), ExtResource("ant_body"), ExtResource("penguin_body")]) +minigames_face_icons = Array[Texture]([ExtResource("jellyfish_face"), ExtResource("crab_face"), ExtResource("parakeet_face"), ExtResource("monkey_face"), ExtResource("caterpillar_face"), ExtResource("frog_face"), ExtResource("turtle_face"), ExtResource("ant_face"), ExtResource("penguin_face")]) [node name="RightAudioStreamPlayer" type="AudioStreamPlayer" parent="." unique_id=941811110] stream = ExtResource("17_37f6y") @@ -207,9 +208,8 @@ size_flags_horizontal = 3 custom_minimum_size = Vector2(80, 2.08165e-12) layout_mode = 2 -[node name="BossButtons" type="Control" parent="." unique_id=1176317047] +[node name="BossButtons" type="Control" parent="ScrollContainer" unique_id=1176317047] unique_name_in_owner = true -anchors_preset = 0 mouse_filter = 2 [node name="LockedLine" type="Line2D" parent="." unique_id=1229207154] @@ -237,20 +237,6 @@ volume_db = -5.0 [node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=1456876816] -[node name="MinigameBackgroundCenter" type="TextureRect" parent="CanvasLayer" unique_id=380724732] -unique_name_in_owner = true -visible = false -modulate = Color(0.109804, 0.14902, 0.384314, 1) -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -texture = ExtResource("21_r0a4h") -expand_mode = 1 -stretch_mode = 5 - [node name="MinigameSelection" type="Control" parent="CanvasLayer" unique_id=613163331] unique_name_in_owner = true visible = false @@ -265,121 +251,17 @@ grow_vertical = 2 pivot_offset = Vector2(1280, 900) mouse_filter = 2 -[node name="MinigameBackground1" type="TextureRect" parent="CanvasLayer/MinigameSelection" unique_id=405469610] +[node name="BackgroundRect" type="ColorRect" parent="CanvasLayer/MinigameSelection" unique_id=380724732] unique_name_in_owner = true -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 -mouse_filter = 2 -texture = ExtResource("23_p1d10") -script = ExtResource("28_kvgph") - -[node name="TextureRect" type="TextureRect" parent="CanvasLayer/MinigameSelection/MinigameBackground1" unique_id=1383000761] -material = ExtResource("22_cgp31") -custom_minimum_size = Vector2(256, 256) -layout_mode = 0 -offset_left = 704.0 -offset_top = 576.0 -offset_right = 960.0 -offset_bottom = 832.0 -size_flags_horizontal = 4 -size_flags_vertical = 4 -texture = ExtResource("10_5wvwc") -expand_mode = 1 -stretch_mode = 5 - -[node name="RightFX" parent="CanvasLayer/MinigameSelection/MinigameBackground1/TextureRect" unique_id=1031123340 instance=ExtResource("33_5y3ye")] layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="Area2D" type="Area2D" parent="CanvasLayer/MinigameSelection/MinigameBackground1" unique_id=802836280] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="CanvasLayer/MinigameSelection/MinigameBackground1/Area2D" unique_id=1785915721] -polygon = PackedVector2Array(1279, 61.6, 1284, 63.6, 1284, 901.8, 1280.8, 905, 1278.5, 905, 556, 1324.3, 554, 1323.2, 554, 1321.5, 513, 1244.5, 513, 1241.3, 489, 1185.4, 489, 1184.3, 467, 1114.3, 467, 1109, 459, 1080.3, 459, 1079, 458.1, 1066, 455, 1061.6, 455, 1060, 446, 1005.2, 446, 1004, 440, 930.1, 440, 865, 441.1, 865, 445.1, 801, 446.3, 801, 460.3, 713, 461.5, 713, 481.5, 638, 482.6, 638, 500.6, 586, 501.7, 586, 513, 562.5, 513, 561.5, 510.8, 557, 513.7, 557, 540.7, 501, 541.9, 501, 570.8, 450, 572.2, 450, 576, 446.2, 574.6, 444.5, 575.7, 442, 577, 442, 587, 429.3, 587, 425.5, 588.8, 422, 590, 422, 639, 357, 640.1, 357, 691.1, 301, 693.1, 301, 745.2, 252, 747.3, 252, 809.3, 204, 811.4, 204, 865.4, 169, 867.5, 169, 957.5, 124, 960.6, 124, 996, 111.6, 996, 111, 1001.3, 107, 1002.9, 107, 1022, 102.5, 1025.2, 99, 1026.8, 99, 1075.7, 85, 1077.2, 85, 1080, 85.5, 1110.7, 77, 1113.2, 77, 1115.6, 77.6, 1118.2, 75, 1119.7, 75, 1182.8, 65, 1184.8, 65, 1185.8, 66, 1204.8, 63, 1207.6, 63, 1209.2, 64.1, 1212.4, 62, 1214.5, 62, 1216.6, 63.1, 1252, 61.1, 1252, 60, 1279, 60) - -[node name="MinigameBackground2" type="TextureRect" parent="CanvasLayer/MinigameSelection" unique_id=1529070021] +[node name="WedgesContainer" type="Control" parent="CanvasLayer/MinigameSelection" unique_id=1010111213] unique_name_in_owner = true -layout_mode = 0 -offset_right = 2560.0 -offset_bottom = 1800.0 -mouse_filter = 2 -texture = ExtResource("24_30f83") -script = ExtResource("28_kvgph") - -[node name="TextureRect" type="TextureRect" parent="CanvasLayer/MinigameSelection/MinigameBackground2" unique_id=373021186] -material = ExtResource("22_cgp31") -custom_minimum_size = Vector2(256, 256) -layout_mode = 0 -offset_left = 1600.0 -offset_top = 576.0 -offset_right = 1856.0 -offset_bottom = 832.0 -size_flags_horizontal = 4 -size_flags_vertical = 4 -texture = ExtResource("10_5wvwc") -expand_mode = 1 -stretch_mode = 5 - -[node name="RightFX" parent="CanvasLayer/MinigameSelection/MinigameBackground2/TextureRect" unique_id=1160342672 instance=ExtResource("33_5y3ye")] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Area2D" type="Area2D" parent="CanvasLayer/MinigameSelection/MinigameBackground2" unique_id=204471632] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="CanvasLayer/MinigameSelection/MinigameBackground2/Area2D" unique_id=1948283316] -polygon = PackedVector2Array(1378, 65.1, 1378, 66.3, 1457, 78.3, 1457, 79.5, 1537, 99.4, 1537, 100.6, 1608, 125.6, 1608, 126.7, 1663, 151.7, 1663, 153, 1671.5, 159, 1673.3, 159, 1682, 161.5, 1682, 162.9, 1750, 202.9, 1750, 204, 1801, 240, 1801, 241.1, 1839, 272.1, 1839, 273.1, 1879, 310.1, 1879, 312.4, 1880.1, 314, 1885, 315.6, 1885, 318.2, 1936, 374.2, 1936, 376.3, 1983, 438.3, 1983, 439.5, 2026, 511.4, 2026, 515.5, 2044, 547.5, 2044, 548.6, 2045.7, 557, 2046.3, 557, 2061, 587.5, 2061, 590.6, 2082, 646.6, 2082, 651, 2082.7, 655, 2087, 661.4, 2087, 663, 2107, 744.8, 2107, 748, 2119, 835.9, 2119, 837, 2121, 923, 2120, 923, 2120, 955, 2118.8, 955, 2111.8, 1029, 2110.7, 1029, 2104.7, 1068, 2103.7, 1068, 2098.7, 1096, 2097.5, 1096, 2088, 1127.3, 2088, 1128.7, 2089.8, 1134, 2087.4, 1134, 2052.4, 1235, 2051.3, 1235, 2017.3, 1306, 2016.3, 1306, 2010.2, 1317, 2008.5, 1317, 2003, 1320.3, 2001, 1319.2, 2001, 1318.1, 1276, 902.2, 1276, 63.9, 1279, 61.9, 1279, 59.9) - -[node name="MinigameBackground3" type="TextureRect" parent="CanvasLayer/MinigameSelection" unique_id=433963142] -unique_name_in_owner = true -layout_mode = 0 -offset_right = 2560.0 -offset_bottom = 1800.0 -mouse_filter = 2 -texture = ExtResource("25_tyvq6") -script = ExtResource("28_kvgph") - -[node name="TextureRect" type="TextureRect" parent="CanvasLayer/MinigameSelection/MinigameBackground3" unique_id=1532680395] -material = ExtResource("22_cgp31") -custom_minimum_size = Vector2(256, 256) -layout_mode = 0 -offset_left = 1152.0 -offset_top = 1248.0 -offset_right = 1408.0 -offset_bottom = 1504.0 -size_flags_horizontal = 4 -size_flags_vertical = 4 -texture = ExtResource("10_5wvwc") -expand_mode = 1 -stretch_mode = 5 - -[node name="RightFX" parent="CanvasLayer/MinigameSelection/MinigameBackground3/TextureRect" unique_id=151107649 instance=ExtResource("33_5y3ye")] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Area2D" type="Area2D" parent="CanvasLayer/MinigameSelection/MinigameBackground3" unique_id=1208926048] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="CanvasLayer/MinigameSelection/MinigameBackground3/Area2D" unique_id=890040811] -polygon = PackedVector2Array(1902, 1250.8, 1902, 1251.9, 2010.3, 1316.1, 2009.5, 1319, 2008.1, 1319, 1986.2, 1358, 1985, 1358, 1974, 1371.7, 1974, 1372.4, 1970.4, 1382, 1969, 1382, 1916, 1451, 1914.9, 1451, 1865.9, 1504, 1863.8, 1504, 1827.8, 1539, 1825.7, 1539, 1791.7, 1568, 1789.6, 1568, 1720.6, 1617, 1717.7, 1617, 1702.7, 1628, 1700.5, 1628, 1633.5, 1664, 1632.6, 1664, 1556.4, 1695, 1555.1, 1695, 1509, 1707.5, 1509, 1708.3, 1498.4, 1713, 1497.4, 1713, 1407.2, 1732, 1406.2, 1732, 1330.1, 1740, 1328, 1740, 1254, 1741, 1254, 1739.9, 1184, 1735.9, 1184, 1734.8, 1112, 1724.7, 1112, 1723.5, 1094.7, 1718, 1085, 1719.3, 1085, 1717.4, 1072.6, 1713, 1065, 1714.4, 1065, 1712.4, 1030.7, 1701, 1030.1, 1701, 1024, 1702.6, 1024, 1700.5, 1009, 1696.5, 1009, 1695, 1006.3, 1693, 994, 1691.8, 994, 1690.4, 969, 1681.4, 969, 1680.1, 964.3, 1677, 962.8, 1677, 961.5, 1678.4, 959, 1677.3, 959, 1676.4, 924, 1662.4, 924, 1661.3, 875, 1637.2, 875, 1636.1, 826, 1608.2, 826, 1607.1, 781, 1577.1, 781, 1576, 738, 1543, 738, 1541.9, 695, 1503.9, 695, 1502.8, 661, 1468.8, 661, 1466.7, 615, 1414.8, 615, 1412.7, 582, 1368.7, 582, 1365.6, 553.7, 1321.1, 554.8, 1319, 556, 1319, 560, 1314, 562.5, 1314, 619.4, 1279, 621.5, 1279, 1276, 897.9, 1276, 894.6) - -[node name="Branches" type="TextureRect" parent="CanvasLayer/MinigameSelection" unique_id=301987876] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -387,10 +269,16 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -texture = ExtResource("7_axgdc") + +[node name="LessonButtonOutline" type="Line2D" parent="CanvasLayer/MinigameSelection" unique_id=1010111290] +unique_name_in_owner = true +z_index = 11 +width = 12.0 +joint_mode = 2 [node name="LessonButton" parent="CanvasLayer/MinigameSelection" unique_id=843010913 instance=ExtResource("25_0ruwb")] unique_name_in_owner = true +z_index = 10 layout_mode = 1 anchors_preset = 8 anchor_left = 0.5 @@ -404,6 +292,25 @@ offset_bottom = 192.0 grow_horizontal = 2 grow_vertical = 2 +[node name="MovieIcon" type="TextureRect" parent="CanvasLayer/MinigameSelection/LessonButton" unique_id=1010111291] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -42.0 +offset_top = -94.0 +offset_right = 42.0 +offset_bottom = -10.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("movie_icon") +expand_mode = 1 +stretch_mode = 6 + [node name="LessonButtonParticles" type="GPUParticles2D" parent="CanvasLayer/MinigameSelection/LessonButton" unique_id=1605639976] unique_name_in_owner = true z_index = 1 @@ -414,21 +321,6 @@ emitting = false texture = ExtResource("25_00sy7") process_material = SubResource("ParticleProcessMaterial_4gqpn") -[node name="MinigameBackground" type="TextureRect" parent="CanvasLayer" unique_id=2050203805] -unique_name_in_owner = true -visible = false -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 4 -size_flags_vertical = 4 -mouse_filter = 2 -texture = ExtResource("20_elp7t") -expand_mode = 1 -stretch_mode = 5 - [node name="BackButton" parent="CanvasLayer" unique_id=1838227918 instance=ExtResource("29_back_button")] custom_minimum_size = Vector2(275, 275) offset_left = 50.0 @@ -513,6 +405,7 @@ texture = ExtResource("47_cloud2") texture = ExtResource("48_cloud3") [connection signal="gui_input" from="ScrollContainer" to="." method="_on_scroll_container_gui_input"] +[connection signal="gui_input" from="CanvasLayer/MinigameSelection/BackgroundRect" to="." method="_on_background_rect_gui_input"] [connection signal="pressed" from="CanvasLayer/MinigameSelection/LessonButton" to="." method="_on_lesson_button_pressed"] [connection signal="button_down" from="CanvasLayer/BackButton" to="." method="_on_back_button_button_down"] [connection signal="button_up" from="CanvasLayer/BackButton" to="." method="_on_back_button_button_up"] diff --git a/sources/gardens/minigame_layout.gd b/sources/gardens/minigame_layout.gd deleted file mode 100644 index b5ee2bcb..00000000 --- a/sources/gardens/minigame_layout.gd +++ /dev/null @@ -1,23 +0,0 @@ -class_name MinigameLayout -extends TextureRect - -signal pressed() - -var is_disabled: bool = false - -@onready var icon: TextureRect = $TextureRect -@onready var area: Area2D = $Area2D -@onready var right_fx: RightFX = $TextureRect/RightFX - - -func _ready() -> void: - area.connect("input_event", _on_click) - - -func _on_click(_viewport: Node, event: InputEvent, _shape_idx: int) -> void: - if event.is_action_pressed("left_click") and not is_disabled: - pressed.emit() - - -func right() -> void: - right_fx.play() diff --git a/sources/gardens/minigame_layout.gd.uid b/sources/gardens/minigame_layout.gd.uid deleted file mode 100644 index 029ed474..00000000 --- a/sources/gardens/minigame_layout.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ddew42fnpmsx1 diff --git a/sources/gardens/minigame_wedge.gd b/sources/gardens/minigame_wedge.gd new file mode 100644 index 00000000..6ac03ff9 --- /dev/null +++ b/sources/gardens/minigame_wedge.gd @@ -0,0 +1,61 @@ +class_name MinigameWedge +extends Control + +signal pressed() + +const ICON_SIZE: Vector2 = Vector2(256, 256) +const GRAYSCALE_SHADER: Shader = preload("res://resources/shaders/grayscale.gdshader") + +var is_disabled: bool = false + +@onready var polygon: Polygon2D = $Polygon2D +@onready var area: Area2D = $Area2D +@onready var collision: CollisionPolygon2D = $Area2D/CollisionPolygon2D +@onready var icon_body_rect: TextureRect = $IconBodyRect +@onready var icon_face_rect: TextureRect = $IconFaceRect +@onready var right_fx: RightFX = $IconFaceRect/RightFX +@onready var wrong_fx: WrongFX = $IconFaceRect/WrongFX + + +func _ready() -> void: + area.input_event.connect(_on_click) + + +func configure( + wedge_polygon: PackedVector2Array, + icon_center: Vector2, + body_texture: Texture, + face_texture: Texture, + wedge_color: Color, + body_color: Color, + is_locked: bool, +) -> void: + polygon.polygon = wedge_polygon + polygon.color = wedge_color + collision.polygon = wedge_polygon + var icon_origin: Vector2 = icon_center - ICON_SIZE * 0.5 + icon_body_rect.position = icon_origin + icon_body_rect.texture = body_texture + icon_body_rect.modulate = body_color + icon_face_rect.position = icon_origin + icon_face_rect.texture = face_texture + # Desaturate the face when locked. + if is_locked: + var grayscale: ShaderMaterial = ShaderMaterial.new() + grayscale.shader = GRAYSCALE_SHADER + icon_face_rect.material = grayscale + else: + icon_face_rect.material = null + + +func right() -> void: + right_fx.play() + + +func wrong() -> void: + wrong_fx.play() + + +func _on_click(_viewport: Node, event: InputEvent, _shape_idx: int) -> void: + if event.is_action_pressed("left_click") and not is_disabled: + pressed.emit() diff --git a/sources/gardens/minigame_wedge.gd.uid b/sources/gardens/minigame_wedge.gd.uid new file mode 100644 index 00000000..8d05e1ef --- /dev/null +++ b/sources/gardens/minigame_wedge.gd.uid @@ -0,0 +1 @@ +uid://dh555xp8ebnb8 diff --git a/sources/gardens/minigame_wedge.tscn b/sources/gardens/minigame_wedge.tscn new file mode 100644 index 00000000..ffc06c07 --- /dev/null +++ b/sources/gardens/minigame_wedge.tscn @@ -0,0 +1,63 @@ +[gd_scene format=3 uid="uid://b1u0xkalulu01"] + +[ext_resource type="Script" uid="uid://dh555xp8ebnb8" path="res://sources/gardens/minigame_wedge.gd" id="1_wedge"] +[ext_resource type="PackedScene" uid="uid://cn2rw06pltyiu" path="res://sources/utils/fx/right.tscn" id="3_rightfx"] +[ext_resource type="PackedScene" uid="uid://dlmbxcgiv8tpr" path="res://sources/utils/fx/wrong.tscn" id="4_wrongfx"] + +[node name="MinigameWedge" type="Control" unique_id=1762693146] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_wedge") + +[node name="Polygon2D" type="Polygon2D" parent="." unique_id=1912619179] + +[node name="Area2D" type="Area2D" parent="." unique_id=870297940] + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Area2D" unique_id=1114106226] + +[node name="IconBodyRect" type="TextureRect" parent="." unique_id=2053672816] +custom_minimum_size = Vector2(256, 256) +layout_mode = 0 +offset_right = 256.0 +offset_bottom = 256.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +mouse_filter = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="IconFaceRect" type="TextureRect" parent="." unique_id=2053672817] +custom_minimum_size = Vector2(256, 256) +layout_mode = 0 +offset_right = 256.0 +offset_bottom = 256.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +mouse_filter = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="RightFX" parent="IconFaceRect" unique_id=333957231 instance=ExtResource("3_rightfx")] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="WrongFX" parent="IconFaceRect" unique_id=333957232 instance=ExtResource("4_wrongfx")] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 diff --git a/sources/menus/settings/lesson_unlock.gd b/sources/menus/settings/lesson_unlock.gd index a2d2da6d..82d8b02d 100644 --- a/sources/menus/settings/lesson_unlock.gd +++ b/sources/menus/settings/lesson_unlock.gd @@ -23,7 +23,7 @@ func _ready() -> void: exercise_option_button_1.add_item(tr(status)) exercise_option_button_2.add_item(tr(status)) exercise_option_button_3.add_item(tr(status)) - + reload() @@ -45,77 +45,76 @@ func reload() -> void: func _set_lesson_number(value: int) -> void: lesson_number = value - + if not lesson_label: return - + lesson_label.text = str(lesson_number) - + look_and_learn_option_button.select(unlocks[lesson_number]["look_and_learn"] as int) - exercise_option_button_1.select(unlocks[lesson_number]["games"][0] as int) - exercise_option_button_2.select(unlocks[lesson_number]["games"][1] as int) - exercise_option_button_3.select(unlocks[lesson_number]["games"][2] as int) + # A lesson can have 1–3 minigames, so only populate the buttons that map to a + # real game and disable the surplus ones (the grid keeps all three cells). + var games: Array = unlocks[lesson_number]["games"] + var exercise_buttons: Array[OptionButton] = [exercise_option_button_1, exercise_option_button_2, exercise_option_button_3] + for index: int in range(exercise_buttons.size()): + var button: OptionButton = exercise_buttons[index] + if index < games.size(): + button.disabled = false + button.select(games[index] as int) + else: + button.disabled = true + button.select(-1) func _set_lesson_gps(value: String) -> void: lesson_gps = value if not gps_label: return - + gps_label.text = value func _on_look_and_learn_option_button_item_selected(index: int) -> void: unlocks[lesson_number]["look_and_learn"] = index - + if index == StudentProgression.Status.LOCKED: if lesson_number == 1: unlocks[lesson_number]["look_and_learn"] = StudentProgression.Status.UNLOCKED else: unlocks[lesson_number - 1]["look_and_learn"] = StudentProgression.Status.UNLOCKED - unlocks[lesson_number - 1]["games"][0] = StudentProgression.Status.LOCKED - unlocks[lesson_number - 1]["games"][1] = StudentProgression.Status.LOCKED - unlocks[lesson_number - 1]["games"][2] = StudentProgression.Status.LOCKED - - unlocks[lesson_number]["games"][0] = StudentProgression.Status.LOCKED - unlocks[lesson_number]["games"][1] = StudentProgression.Status.LOCKED - unlocks[lesson_number]["games"][2] = StudentProgression.Status.LOCKED - + _set_lesson_games(lesson_number - 1, StudentProgression.Status.LOCKED) + + _set_lesson_games(lesson_number, StudentProgression.Status.LOCKED) + for lesson: int in unlocks.keys(): if lesson > lesson_number: unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED - unlocks[lesson]["games"][0] = StudentProgression.Status.LOCKED - unlocks[lesson]["games"][1] = StudentProgression.Status.LOCKED - unlocks[lesson]["games"][2] = StudentProgression.Status.LOCKED - + _set_lesson_games(lesson, StudentProgression.Status.LOCKED) + elif index == StudentProgression.Status.UNLOCKED: - unlocks[lesson_number]["games"][0] = StudentProgression.Status.LOCKED - unlocks[lesson_number]["games"][1] = StudentProgression.Status.LOCKED - unlocks[lesson_number]["games"][2] = StudentProgression.Status.LOCKED + _set_lesson_games(lesson_number, StudentProgression.Status.LOCKED) for lesson: int in unlocks.keys(): if lesson < lesson_number: unlocks[lesson]["look_and_learn"] = StudentProgression.Status.COMPLETED - unlocks[lesson]["games"][0] = StudentProgression.Status.COMPLETED - unlocks[lesson]["games"][1] = StudentProgression.Status.COMPLETED - unlocks[lesson]["games"][2] = StudentProgression.Status.COMPLETED + _set_lesson_games(lesson, StudentProgression.Status.COMPLETED) elif lesson > lesson_number: unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED - unlocks[lesson]["games"][0] = StudentProgression.Status.LOCKED - unlocks[lesson]["games"][1] = StudentProgression.Status.LOCKED - unlocks[lesson]["games"][2] = StudentProgression.Status.LOCKED + _set_lesson_games(lesson, StudentProgression.Status.LOCKED) elif index == StudentProgression.Status.COMPLETED: - unlocks[lesson_number]["games"][0] = StudentProgression.Status.UNLOCKED - unlocks[lesson_number]["games"][1] = StudentProgression.Status.UNLOCKED - unlocks[lesson_number]["games"][2] = StudentProgression.Status.UNLOCKED + _set_lesson_games(lesson_number, StudentProgression.Status.UNLOCKED) for lesson: int in unlocks.keys(): if lesson < lesson_number: unlocks[lesson]["look_and_learn"] = StudentProgression.Status.COMPLETED - unlocks[lesson]["games"][0] = StudentProgression.Status.COMPLETED - unlocks[lesson]["games"][1] = StudentProgression.Status.COMPLETED - unlocks[lesson]["games"][2] = StudentProgression.Status.COMPLETED + _set_lesson_games(lesson, StudentProgression.Status.COMPLETED) elif lesson > lesson_number: unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED - unlocks[lesson]["games"][0] = StudentProgression.Status.LOCKED - unlocks[lesson]["games"][1] = StudentProgression.Status.LOCKED - unlocks[lesson]["games"][2] = StudentProgression.Status.LOCKED + _set_lesson_games(lesson, StudentProgression.Status.LOCKED) unlocks_changed.emit() + + +# Sets every minigame of a lesson to the same status, respecting the lesson's +# actual minigame count (1–3) rather than assuming a fixed three. +func _set_lesson_games(lesson: int, status: StudentProgression.Status) -> void: + var games: Array = unlocks[lesson]["games"] + for game_index: int in range(games.size()): + games[game_index] = status diff --git a/sources/utils/autoloads/database.gd b/sources/utils/autoloads/database.gd index 3e635b07..224f5ad7 100644 --- a/sources/utils/autoloads/database.gd +++ b/sources/utils/autoloads/database.gd @@ -104,13 +104,13 @@ func get_exercise_for_lesson(lesson_nb: int) -> Array[int]: INNER JOIN Lessons ON Lessons.ID = LessonsExercises.LessonID WHERE LessonNB == " + str(lesson_nb) db.query(query) - + # Exercise* == 0 means "no minigame in this slot": drop zeros so size = count. var result: Array[int] = [] for element: Dictionary in db.query_result: - result.append(element.Exercise1) - result.append(element.Exercise2) - result.append(element.Exercise3) - + for column: String in ["Exercise1", "Exercise2", "Exercise3"]: + var exercise_id: int = element[column] as int + if exercise_id > 0: + result.append(exercise_id) return result