Minigames wheel version 2

This commit is contained in:
Adrien Ufferte
2026-06-06 11:13:22 +02:00
parent 42118fad1b
commit 2db21b597b
91 changed files with 1322 additions and 408 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -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]
Binary file not shown.

After

Width:  |  Height:  |  Size: 953 B

@@ -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]
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 1005 B

@@ -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]
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -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]
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -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

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

@@ -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]

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

@@ -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]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

+8
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+5 -2
View File
@@ -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
+7
View File
@@ -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);
}
+1
View File
@@ -0,0 +1 @@
uid://bulhmeqr1cvlx
+121 -60
View File
@@ -28,6 +28,33 @@ 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
# Make sure the unlocks are correct
func init_unlocks() -> void:
if not unlocks:
@@ -35,22 +62,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 +92,39 @@ 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:
if typeof(garden["games"]) != TYPE_ARRAY or (garden["games"] as Array).size() != minigame_count:
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)
# Make sure duration arrays match the minigame count
if (garden["last_duration"] as PackedInt32Array).size() != minigame_count:
garden["last_duration"] = _make_zero_durations(minigame_count)
if (garden["total_duration"] as PackedInt32Array).size() != minigame_count:
garden["total_duration"] = _make_zero_durations(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 +146,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 +285,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 +311,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 +380,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])
+2
View File
@@ -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
+287 -82
View File
@@ -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,191 @@ 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
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 +902,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 +1014,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 +1162,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 +1207,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 +1233,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 +1459,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 +1501,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 +1537,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:
+54 -161
View File
@@ -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"]
-23
View File
@@ -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()
-1
View File
@@ -1 +0,0 @@
uid://ddew42fnpmsx1
+61
View File
@@ -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()
+1
View File
@@ -0,0 +1 @@
uid://dh555xp8ebnb8
+63
View File
@@ -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
+5 -5
View File
@@ -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