Expanded world/level icons (#763)

* Expanded Level Icons

Level icons are now defined in their own custom JSON file (LevelIcons.json) which determines which icons will be shown, along with an area where the user can input the size of their icons for custom sizing (larger sizes will likely be a bit odd in behavior, smaller should work fine though)

Along with that, icons have been greatly expanded, with 32 new level icons available for levels to use now, (a total of 45!) along with various older icons recieving slight touch-ups. Various levels now use these new icons to better represent major recognizable elements from those levels, and to give them a bit more variation between each other.

If there are any additional level icons that would make sense for implementation, let me know. I think this should cover most of the important ones, though.

* Delete LevelIcons.png.import

* Marathon + ANN Medal Icons on World Select

Marathon mode and ANN now show the highest ranking achieved on all levels when applicable. So if you manage to get a gold medal on every level, but get a bronze on one, then it'll display a bronze medal for your world completion.

Side note: Why the fuck was the only solution to the GPU particle emitting behavior to make a massive array of node paths. I hate this! This sucks! Joe, why did you do that? And why was it the only thing I could find that worked?

* Optimized particle emitting for world/level select

* ANN now has its own menu + bugfixes

This gives ANN its own dedicated menu rather than throwing you directly into the world selection menu, which additionally fixes an issue with rendering medal icons when selecting the campaign, and a few other fixes like the DiscoResults menu not using the ANN visual settings.

* Challenge Hunt Icons + menu bugfixes

Challenge Hunt icons are now implemented, so you can see all of your red coins, eggs and score requirements if you've met them. Along with that, fixed a bug where you could enter Worlds 9-D in marathon when you aren't supposed to by selecting a story mode option and then entering marathon.

* New icons + layout change for Challenge Hunt icons

By recommendation by Vanny, Challenge Hunt icons have been changed. Along with this, all icons for progress tracking are now in their own relegated image file for separate modification, and have been updated to use white outlines similar to the world icons themselves.

* Update ChallengeModeResults.tscn

Forgot to update this to use challenge icons for the world select screen.

* Eggs cycle through color again

Accidentally got rid of this, but didn't want to update every node. It simply does it based on the world number now rather than needing to be manually set.
This commit is contained in:
SkyanUltra 2025-12-02 08:30:32 -05:00 committed by GitHub
parent 2773d2e8e1
commit becdf9ba77
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 2890 additions and 586 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://wb67mbrs5u05"
path="res://.godot/imported/LevelIcons.png-4b08ffadb3e3163a4d083656ccffc674.ctex"
uid="uid://bx7jvtnfom4ik"
path="res://.godot/imported/DayLevelIcons.png-6cf9f039701f5af6b2ebbc4c2d093290.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Sprites/UI/LevelIcons.png"
dest_files=["res://.godot/imported/LevelIcons.png-4b08ffadb3e3163a4d083656ccffc674.ctex"]
source_file="res://Assets/Sprites/UI/LevelIcons/DayLevelIcons.png"
dest_files=["res://.godot/imported/DayLevelIcons.png-6cf9f039701f5af6b2ebbc4c2d093290.ctex"]
[params]

View file

@ -0,0 +1,235 @@
{
"icon_size": [56, 32],
"icon_data": {
"SMB1_ICONS": [
[
["day", [0,0]],
["day", [0,4]],
["day", [1,0]],
["day", [1,4]],
],
[
["day", [0,2]],
["day", [3,1]],
["day", [1,2]],
["day", [1,5]],
],
[
["day", [0,0]],
["day", [0,1]],
["day", [1,0]],
["day", [1,4]],
],
[
["day", [0,1]],
["day", [0,5]],
["day", [1,3]],
["day", [1,6]],
],
[
["night", [0,1]],
["night", [0,3]],
["night", [1,0]],
["night", [1,5]],
],
[
["night", [0,0]],
["night", [0,2]],
["night", [1,1]],
["night", [1,4]],
],
[
["night", [0,3]],
["night", [0,4]],
["night", [1,2]],
["night", [1,5]],
],
[
["night", [0,1]],
["night", [0,3]],
["night", [2,0]],
["night", [1,6]],
],
],
"SMBLL_ICONS": [
[
["day", [0,2]],
["day", [0,7]],
["day", [1,0]],
["day", [1,4]],
],
[
["day", [1,2]],
["day", [0,1]],
["day", [1,2]],
["day", [1,7]],
],
[
["day", [0,3]],
["day", [3,0]],
["day", [1,1]],
["day", [1,6]],
],
[
["day", [0,1]],
["day", [0,3]],
["day", [1,1]],
["day", [1,5]],
],
[
["night", [0,2]],
["night", [0,6]],
["night", [1,0]],
["night", [1,5]],
],
[
["night", [0,0]],
["night", [3,1]],
["night", [1,2]],
["night", [1,7]],
],
[
["night", [0,2]],
["night", [1,2]],
["night", [1,1]],
["night", [1,5]],
],
[
["night", [0,2]],
["night", [2,0]],
["night", [2,2]],
["night", [1,7]],
],
[
["night", [0,0]],
["night", [3,6]],
["night", [3,7]],
["night", [4,4]],
],
[
["day", [0,2]],
["day", [0,5]],
["day", [1,0]],
["day", [1,4]],
],
[
["day", [0,0]],
["day", [3,1]],
["day", [1,1]],
["day", [1,6]],
],
[
["day", [0,2]],
["day", [1,0]],
["day", [1,1]],
["day", [1,5]],
],
[
["day", [2,6]],
["day", [2,6]],
["day", [2,7]],
["day", [1,7]],
],
],
"SMBS_ICONS": [
[
["day", [0,1]],
["day", [0,4]],
["day", [1,0]],
["day", [1,6]],
],
[
["day", [0,0]],
["day", [3,1]],
["day", [1,2]],
["day", [1,7]],
],
[
["day", [3,0]],
["day", [1,2]],
["day", [1,0]],
["day", [1,4]],
],
[
["day", [0,1]],
["day", [0,5]],
["day", [1,3]],
["day", [1,6]],
],
[
["night", [0,1]],
["night", [0,0]],
["night", [1,0]],
["night", [1,5]],
],
[
["night", [0,1]],
["night", [0,2]],
["night", [1,0]],
["night", [1,4]],
],
[
["night", [0,3]],
["night", [3,1]],
["night", [1,2]],
["night", [1,7]],
],
[
["night", [1,3]],
["night", [2,1]],
["night", [0,7]],
["night", [1,5]],
],
],
"SMBANN_ICONS": [
[
["night", [0,0]],
["night", [0,4]],
["night", [1,0]],
["night", [1,4]],
],
[
["night", [0,2]],
["night", [3,1]],
["night", [1,2]],
["night", [1,5]],
],
[
["night", [0,0]],
["night", [0,1]],
["night", [1,0]],
["night", [1,4]],
],
[
["night", [0,1]],
["night", [0,5]],
["night", [1,3]],
["night", [1,6]],
],
[
["night", [0,1]],
["night", [0,3]],
["night", [1,1]],
["night", [1,7]],
],
[
["night", [0,0]],
["night", [0,2]],
["night", [1,1]],
["night", [1,5]],
],
[
["night", [0,3]],
["night", [3,1]],
["night", [1,2]],
["night", [1,5]],
],
[
["night", [0,1]],
["night", [0,3]],
["night", [2,0]],
["night", [1,7]],
],
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bxx6r6wjnkfqo"
path="res://.godot/imported/LockedLevelIcon.png-37b1e7a62a34d00d34a37d8e54f17024.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Sprites/UI/LevelIcons/LockedLevelIcon.png"
dest_files=["res://.godot/imported/LockedLevelIcon.png-37b1e7a62a34d00d34a37d8e54f17024.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: 14 KiB

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bgjedrd2p0j04"
path="res://.godot/imported/NightLevelIcons.png-ea0f1c34b333a381e0d0071d5de93bde.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Sprites/UI/LevelIcons/NightLevelIcons.png"
dest_files=["res://.godot/imported/NightLevelIcons.png-ea0f1c34b333a381e0d0071d5de93bde.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.6 KiB

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cvchqrf0fdg5x"
path="res://.godot/imported/ProgressTrackerIcons.png-0767a59884d1e021b878d6efc1d518dd.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Sprites/UI/ProgressTrackerIcons.png"
dest_files=["res://.godot/imported/ProgressTrackerIcons.png-0767a59884d1e021b878d6efc1d518dd.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.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before After
Before After

View file

@ -607,13 +607,13 @@ animations = [{
"speed": 15.0
}]
[node name="ChallengeModeResults" type="Node"]
[node name="ChallengeModeResults" type="Node" unique_id=1344692039]
script = ExtResource("1_3x4fv")
[node name="BG" type="CanvasLayer" parent="."]
[node name="BG" type="CanvasLayer" parent="." unique_id=2056593822]
layer = -1
[node name="ColorRect" type="ColorRect" parent="BG"]
[node name="ColorRect" type="ColorRect" parent="BG" unique_id=398032741]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
@ -621,10 +621,10 @@ grow_horizontal = 2
grow_vertical = 2
color = Color(0, 0, 0, 1)
[node name="Camera" type="Camera2D" parent="."]
[node name="Camera" type="Camera2D" parent="." unique_id=2090750111]
process_callback = 0
[node name="Sprite2D2" type="Sprite2D" parent="."]
[node name="Sprite2D2" type="Sprite2D" parent="." unique_id=1857730228]
visible = false
modulate = Color(0.261477, 0.261477, 0.261477, 1)
visibility_layer = 2
@ -633,14 +633,14 @@ texture = ExtResource("3_um36a")
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="Sprite2D" type="Sprite2D" parent="."]
[node name="Sprite2D" type="Sprite2D" parent="." unique_id=606335083]
visibility_layer = 2
z_index = -4096
position = Vector2(0, -8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="Sprite2D3" type="Sprite2D" parent="Sprite2D"]
[node name="Sprite2D3" type="Sprite2D" parent="Sprite2D" unique_id=1044616586]
visibility_layer = 2
z_index = 5
z_as_relative = false
@ -648,7 +648,7 @@ position = Vector2(-76, 56)
region_enabled = true
region_rect = Rect2(0, 0, 8, 64)
[node name="Overlay" type="ColorRect" parent="Sprite2D/Sprite2D3"]
[node name="Overlay" type="ColorRect" parent="Sprite2D/Sprite2D3" unique_id=442302167]
visible = false
offset_left = -60.0
offset_top = -32.0
@ -656,7 +656,7 @@ offset_right = -4.0
offset_bottom = 32.0
color = Color(0, 0, 0, 1)
[node name="Score" type="Label" parent="Sprite2D/Sprite2D3"]
[node name="Score" type="Label" parent="Sprite2D/Sprite2D3" unique_id=542029849]
offset_left = 8.0
offset_top = 56.0
offset_right = 56.0
@ -664,7 +664,7 @@ offset_bottom = 64.0
text = "CHALLENGE_DIALOGUE_SCORE"
uppercase = true
[node name="ScoreText" type="Label" parent="Sprite2D/Sprite2D3"]
[node name="ScoreText" type="Label" parent="Sprite2D/Sprite2D3" unique_id=1218819375]
offset_left = 44.0
offset_top = 56.0
offset_right = 108.0
@ -672,7 +672,7 @@ offset_bottom = 79.0
text = "0"
horizontal_alignment = 2
[node name="Target" type="Label" parent="Sprite2D/Sprite2D3/ScoreText"]
[node name="Target" type="Label" parent="Sprite2D/Sprite2D3/ScoreText" unique_id=700581250]
layout_mode = 1
anchors_preset = -1
anchor_left = 1.0
@ -684,7 +684,7 @@ theme_override_colors/font_color = Color(0.462745, 0.52549, 1, 1)
text = "/00000"
horizontal_alignment = 2
[node name="Coins2" type="Label" parent="Sprite2D/Sprite2D3"]
[node name="Coins2" type="Label" parent="Sprite2D/Sprite2D3" unique_id=1876682854]
offset_left = 8.0
offset_top = 40.0
offset_right = 56.0
@ -692,11 +692,11 @@ offset_bottom = 48.0
text = "CHALLENGE_DIALOGUE_COINS"
uppercase = true
[node name="Coins" type="Node2D" parent="Sprite2D/Sprite2D3"]
[node name="Coins" type="Node2D" parent="Sprite2D/Sprite2D3" unique_id=897187102]
visible = false
position = Vector2(72, 12)
[node name="1" type="Sprite2D" parent="Sprite2D/Sprite2D3/Coins"]
[node name="1" type="Sprite2D" parent="Sprite2D/Sprite2D3/Coins" unique_id=1528461058]
position = Vector2(-5, 36)
texture = ExtResource("10_d76il")
hframes = 2
@ -704,7 +704,7 @@ region_rect = Rect2(8, 0, 8, 8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="2" type="Sprite2D" parent="Sprite2D/Sprite2D3/Coins"]
[node name="2" type="Sprite2D" parent="Sprite2D/Sprite2D3/Coins" unique_id=1836829558]
position = Vector2(3, 36)
texture = ExtResource("10_d76il")
hframes = 2
@ -713,7 +713,7 @@ region_rect = Rect2(8, 0, 8, 8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="3" type="Sprite2D" parent="Sprite2D/Sprite2D3/Coins"]
[node name="3" type="Sprite2D" parent="Sprite2D/Sprite2D3/Coins" unique_id=831763568]
position = Vector2(11, 36)
texture = ExtResource("10_d76il")
hframes = 2
@ -722,7 +722,7 @@ region_rect = Rect2(8, 0, 8, 8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="4" type="Sprite2D" parent="Sprite2D/Sprite2D3/Coins"]
[node name="4" type="Sprite2D" parent="Sprite2D/Sprite2D3/Coins" unique_id=696674550]
position = Vector2(19, 36)
texture = ExtResource("10_d76il")
hframes = 2
@ -731,7 +731,7 @@ region_rect = Rect2(8, 0, 8, 8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="5" type="Sprite2D" parent="Sprite2D/Sprite2D3/Coins"]
[node name="5" type="Sprite2D" parent="Sprite2D/Sprite2D3/Coins" unique_id=1701753957]
position = Vector2(27, 36)
texture = ExtResource("10_d76il")
hframes = 2
@ -740,15 +740,15 @@ region_rect = Rect2(8, 0, 8, 8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="Sprite2D" type="Sprite2D" parent="Sprite2D"]
[node name="Sprite2D" type="Sprite2D" parent="Sprite2D" unique_id=849347414]
position = Vector2(-28, 44)
texture = ExtResource("6_moc5y")
[node name="Sprite2D2" type="Sprite2D" parent="Sprite2D"]
[node name="Sprite2D2" type="Sprite2D" parent="Sprite2D" unique_id=1148794137]
position = Vector2(-28, 60)
texture = ExtResource("6_moc5y")
[node name="PlayerSprite" type="AnimatedSprite2D" parent="." node_paths=PackedStringArray("resource_setter")]
[node name="PlayerSprite" type="AnimatedSprite2D" parent="." unique_id=1537245075 node_paths=PackedStringArray("resource_setter")]
position = Vector2(-96, 0)
sprite_frames = ExtResource("4_u7ohs")
animation = &"Move"
@ -759,15 +759,15 @@ script = ExtResource("5_x1tpn")
resource_setter = NodePath("ResourceSetterNew")
metadata/_custom_type_script = "uid://b08qfwj5jk6g1"
[node name="ResourceSetterNew" type="Node" parent="PlayerSprite"]
[node name="ResourceSetterNew" type="Node" parent="PlayerSprite" unique_id=951425779]
script = ExtResource("7_bob8r")
metadata/_custom_type_script = "uid://cbal8ms2oe1ik"
[node name="ChallengeResults" type="AudioStreamPlayer" parent="."]
[node name="ChallengeResults" type="AudioStreamPlayer" parent="." unique_id=1689039047]
stream = ExtResource("7_6dwpv")
bus = &"Music"
[node name="ResourceSetterNew" type="Node" parent="ChallengeResults" node_paths=PackedStringArray("node_to_affect")]
[node name="ResourceSetterNew" type="Node" parent="ChallengeResults" unique_id=127176486 node_paths=PackedStringArray("node_to_affect")]
script = ExtResource("7_bob8r")
node_to_affect = NodePath("..")
property_name = "stream"
@ -775,11 +775,11 @@ mode = 2
resource_json = ExtResource("12_fb45j")
metadata/_custom_type_script = "uid://cbal8ms2oe1ik"
[node name="ChallengeEnd" type="AudioStreamPlayer" parent="."]
[node name="ChallengeEnd" type="AudioStreamPlayer" parent="." unique_id=377169015]
stream = ExtResource("12_x7w5s")
bus = &"Music"
[node name="ResourceSetterNew" type="Node" parent="ChallengeEnd" node_paths=PackedStringArray("node_to_affect")]
[node name="ResourceSetterNew" type="Node" parent="ChallengeEnd" unique_id=593640018 node_paths=PackedStringArray("node_to_affect")]
script = ExtResource("7_bob8r")
node_to_affect = NodePath("..")
property_name = "stream"
@ -787,21 +787,21 @@ mode = 2
resource_json = ExtResource("12_y63tt")
metadata/_custom_type_script = "uid://cbal8ms2oe1ik"
[node name="MainSequence" type="AnimationPlayer" parent="."]
[node name="MainSequence" type="AnimationPlayer" parent="." unique_id=877815898]
libraries = {
&"": SubResource("AnimationLibrary_nud7a")
}
autoplay = "Main"
autoplay = &"Main"
speed_scale = 0.8
[node name="Toad" type="AnimatedSprite2D" parent="."]
[node name="Toad" type="AnimatedSprite2D" parent="." unique_id=130158692]
position = Vector2(56, 0)
sprite_frames = SubResource("SpriteFrames_woqpu")
animation = &"1Idle"
autoplay = "Idle"
speed_scale = 2.0
[node name="ResourceSetterNew" type="Node" parent="Toad" node_paths=PackedStringArray("node_to_affect")]
[node name="ResourceSetterNew" type="Node" parent="Toad" unique_id=826345731 node_paths=PackedStringArray("node_to_affect")]
script = ExtResource("7_bob8r")
node_to_affect = NodePath("..")
property_name = "sprite_frames"
@ -809,7 +809,7 @@ resource_json = ExtResource("14_sv6qk")
use_cache = false
metadata/_custom_type_script = "uid://cbal8ms2oe1ik"
[node name="SpeechBubble" type="Sprite2D" parent="."]
[node name="SpeechBubble" type="Sprite2D" parent="." unique_id=579725043]
visible = false
visibility_layer = 2
position = Vector2(-24, -40)
@ -818,7 +818,7 @@ centered = false
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="Your" type="Label" parent="SpeechBubble"]
[node name="Your" type="Label" parent="SpeechBubble" unique_id=1272803665]
visible = false
material = SubResource("ShaderMaterial_1l20f")
offset_left = 1.0
@ -828,7 +828,7 @@ offset_bottom = 27.0
text = "your"
uppercase = true
[node name="Results" type="Label" parent="SpeechBubble/Your"]
[node name="Results" type="Label" parent="SpeechBubble/Your" unique_id=1456303163]
use_parent_material = true
layout_mode = 0
offset_left = 27.0
@ -838,7 +838,7 @@ offset_bottom = 31.0
text = "results"
uppercase = true
[node name="Coins" type="Label" parent="SpeechBubble"]
[node name="Coins" type="Label" parent="SpeechBubble" unique_id=893262062]
visible = false
material = SubResource("ShaderMaterial_1l20f")
offset_left = -1.0
@ -848,10 +848,10 @@ offset_bottom = 27.0
text = "CHALLENGE_DIALOGUE_COINS"
uppercase = true
[node name="Node2D" type="Node2D" parent="SpeechBubble/Coins"]
[node name="Node2D" type="Node2D" parent="SpeechBubble/Coins" unique_id=1703833338]
visible = false
[node name="1" type="Sprite2D" parent="SpeechBubble/Coins/Node2D"]
[node name="1" type="Sprite2D" parent="SpeechBubble/Coins/Node2D" unique_id=277536899]
position = Vector2(52, 12)
texture = ExtResource("10_d76il")
centered = false
@ -861,7 +861,7 @@ region_rect = Rect2(8, 0, 8, 8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="2" type="Sprite2D" parent="SpeechBubble/Coins/Node2D"]
[node name="2" type="Sprite2D" parent="SpeechBubble/Coins/Node2D" unique_id=158042035]
position = Vector2(60, 12)
texture = ExtResource("10_d76il")
centered = false
@ -871,7 +871,7 @@ region_rect = Rect2(8, 0, 8, 8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="3" type="Sprite2D" parent="SpeechBubble/Coins/Node2D"]
[node name="3" type="Sprite2D" parent="SpeechBubble/Coins/Node2D" unique_id=1546774830]
position = Vector2(68, 12)
texture = ExtResource("10_d76il")
centered = false
@ -881,7 +881,7 @@ region_rect = Rect2(8, 0, 8, 8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="4" type="Sprite2D" parent="SpeechBubble/Coins/Node2D"]
[node name="4" type="Sprite2D" parent="SpeechBubble/Coins/Node2D" unique_id=1306926662]
position = Vector2(76, 12)
texture = ExtResource("10_d76il")
centered = false
@ -891,7 +891,7 @@ region_rect = Rect2(8, 0, 8, 8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="5" type="Sprite2D" parent="SpeechBubble/Coins/Node2D"]
[node name="5" type="Sprite2D" parent="SpeechBubble/Coins/Node2D" unique_id=1225162184]
position = Vector2(84, 12)
texture = ExtResource("10_d76il")
centered = false
@ -901,7 +901,7 @@ region_rect = Rect2(8, 0, 8, 8)
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="Score" type="Label" parent="SpeechBubble"]
[node name="Score" type="Label" parent="SpeechBubble" unique_id=784135289]
visible = false
material = SubResource("ShaderMaterial_1l20f")
offset_left = -1.0
@ -911,7 +911,7 @@ offset_bottom = 27.0
text = "CHALLENGE_DIALOGUE_SCORE"
uppercase = true
[node name="ScoreLabel" type="Label" parent="SpeechBubble/Score"]
[node name="ScoreLabel" type="Label" parent="SpeechBubble/Score" unique_id=427565371]
visible = false
material = SubResource("ShaderMaterial_1l20f")
layout_mode = 0
@ -924,14 +924,14 @@ horizontal_alignment = 2
vertical_alignment = 2
uppercase = true
[node name="Sprite2D3" type="Sprite2D" parent="."]
[node name="Sprite2D3" type="Sprite2D" parent="." unique_id=1441403262]
position = Vector2(58, -112)
texture = ExtResource("11_02i7h")
centered = false
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="RedCoins" type="Sprite2D" parent="Sprite2D3"]
[node name="RedCoins" type="Sprite2D" parent="Sprite2D3" unique_id=1811034064]
visible = false
position = Vector2(14, 13)
texture = ExtResource("14_woqpu")
@ -939,7 +939,7 @@ hframes = 2
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="Score" type="Sprite2D" parent="Sprite2D3"]
[node name="Score" type="Sprite2D" parent="Sprite2D3" unique_id=1066650364]
visible = false
position = Vector2(30, 13)
texture = ExtResource("14_woqpu")
@ -948,7 +948,7 @@ frame = 1
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="YoshiEgg" type="Sprite2D" parent="Sprite2D3"]
[node name="YoshiEgg" type="Sprite2D" parent="Sprite2D3" unique_id=1296085224]
visible = false
position = Vector2(46, 12)
texture = ExtResource("16_1h3k2")
@ -957,27 +957,27 @@ vframes = 4
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="TalkSFX" type="AudioStreamPlayer" parent="."]
[node name="TalkSFX" type="AudioStreamPlayer" parent="." unique_id=414429401]
stream = ExtResource("9_qaelr")
bus = &"SFX"
script = ExtResource("21_xk7j8")
metadata/_custom_type_script = "uid://dmtw1jesw1vl7"
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="." unique_id=2109458546]
process_mode = 3
stream = ExtResource("11_nym8o")
bus = &"SFX"
script = ExtResource("21_xk7j8")
metadata/_custom_type_script = "uid://dmtw1jesw1vl7"
[node name="AudioStreamPlayer2" type="AudioStreamPlayer" parent="."]
[node name="AudioStreamPlayer2" type="AudioStreamPlayer" parent="." unique_id=1824179585]
process_mode = 3
stream = ExtResource("16_eupxr")
bus = &"SFX"
script = ExtResource("21_xk7j8")
metadata/_custom_type_script = "uid://dmtw1jesw1vl7"
[node name="Yoshi" type="AnimatedSprite2D" parent="."]
[node name="Yoshi" type="AnimatedSprite2D" parent="." unique_id=227881632]
process_mode = 3
visible = false
position = Vector2(16, 0)
@ -986,34 +986,34 @@ animation = &"1"
autoplay = "1"
frame_progress = 0.466158
[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Yoshi"]
[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Yoshi" unique_id=1372566037]
visible = false
stream = ExtResource("19_n4lt1")
volume_db = 5.0
bus = &"SFX"
[node name="ResourceSetter" type="Node" parent="Yoshi/AudioStreamPlayer2D" node_paths=PackedStringArray("node_to_affect")]
[node name="ResourceSetter" type="Node" parent="Yoshi/AudioStreamPlayer2D" unique_id=377762125 node_paths=PackedStringArray("node_to_affect")]
script = ExtResource("9_iyieq")
node_to_affect = NodePath("..")
property_name = "stream"
themed_resource = SubResource("Resource_vohx7")
metadata/_custom_type_script = "uid://cq6f682453q6o"
[node name="ResourceSetterNew" type="Node" parent="Yoshi" node_paths=PackedStringArray("node_to_affect")]
[node name="ResourceSetterNew" type="Node" parent="Yoshi" unique_id=1898262442 node_paths=PackedStringArray("node_to_affect")]
script = ExtResource("7_bob8r")
node_to_affect = NodePath("..")
property_name = "sprite_frames"
resource_json = ExtResource("23_vohx7")
metadata/_custom_type_script = "uid://cbal8ms2oe1ik"
[node name="SmokeParticle" type="AnimatedSprite2D" parent="."]
[node name="SmokeParticle" type="AnimatedSprite2D" parent="." unique_id=865577033]
position = Vector2(16, 0)
scale = Vector2(2, 2)
sprite_frames = SubResource("SpriteFrames_bob8r")
frame = 4
frame_progress = 1.0
[node name="Label" type="Label" parent="."]
[node name="Label" type="Label" parent="." unique_id=373370055]
offset_left = -112.0
offset_top = -112.0
offset_right = -64.0
@ -1021,7 +1021,7 @@ offset_bottom = -89.0
text = "world"
uppercase = true
[node name="WorldLevel" type="Label" parent="."]
[node name="WorldLevel" type="Label" parent="." unique_id=1548529906]
offset_left = -104.0
offset_top = -104.0
offset_right = -72.0
@ -1030,9 +1030,9 @@ text = "1-1"
horizontal_alignment = 1
uppercase = true
[node name="DropShadow" parent="." instance=ExtResource("21_bob8r")]
[node name="DropShadow" parent="." unique_id=357749683 instance=ExtResource("21_bob8r")]
[node name="Label2" type="Label" parent="."]
[node name="Label2" type="Label" parent="." unique_id=706098611]
visible = false
visibility_layer = 2
z_index = 4096
@ -1047,39 +1047,39 @@ horizontal_alignment = 1
vertical_alignment = 2
uppercase = true
[node name="LabelFontChanger" type="Node" parent="." node_paths=PackedStringArray("labels")]
[node name="LabelFontChanger" type="Node" parent="." unique_id=1370610741 node_paths=PackedStringArray("labels")]
script = ExtResource("24_cq5a1")
labels = [NodePath("../Sprite2D/Sprite2D3/Score"), NodePath("../Sprite2D/Sprite2D3/Coins2"), NodePath("../Sprite2D/Sprite2D3/ScoreText"), NodePath("../Sprite2D/Sprite2D3/ScoreText/Target"), null, NodePath("../SpeechBubble/Your"), NodePath("../SpeechBubble/Your/Results"), NodePath("../SpeechBubble/Coins"), NodePath("../SpeechBubble/Score"), NodePath("../SpeechBubble/Score/ScoreLabel"), NodePath("../Label"), NodePath("../WorldLevel"), NodePath("../Label2")]
metadata/_custom_type_script = "uid://co6tjg3w6qpd8"
[node name="BG2" type="Node2D" parent="."]
[node name="BG2" type="Node2D" parent="." unique_id=2095273623]
z_index = -50
position = Vector2(0, -8)
[node name="PackSprite3" type="Sprite2D" parent="BG2"]
[node name="PackSprite3" type="Sprite2D" parent="BG2" unique_id=986269619]
visibility_layer = 2
z_index = -4096
texture = ExtResource("27_w3bjn")
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="PackSprite2" type="Sprite2D" parent="BG2"]
[node name="PackSprite2" type="Sprite2D" parent="BG2" unique_id=1934819400]
texture = ExtResource("28_vohx7")
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="PackSprite4" type="Sprite2D" parent="BG2"]
[node name="PackSprite4" type="Sprite2D" parent="BG2" unique_id=934123746]
texture = ExtResource("29_1l20f")
script = ExtResource("3_xe6g7")
metadata/_custom_type_script = "uid://364rywt44hy6"
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=2137081576]
[node name="PauseMenu" parent="CanvasLayer" instance=ExtResource("31_1l20f")]
[node name="PauseMenu" parent="CanvasLayer" unique_id=461587507 instance=ExtResource("31_1l20f")]
visible = false
can_exit = false
[node name="WorldSelect" parent="CanvasLayer" instance=ExtResource("32_xk7j8")]
[node name="WorldSelect" parent="CanvasLayer" unique_id=978391179 instance=ExtResource("32_xk7j8")]
visible = false
anchors_preset = 8
anchor_left = 0.5
@ -1092,8 +1092,9 @@ offset_right = 90.0
offset_bottom = 32.5
grow_horizontal = 2
grow_vertical = 2
has_challenge_stuff = true
[node name="LevelSelect" parent="CanvasLayer" instance=ExtResource("33_x7w5s")]
[node name="LevelSelect" parent="CanvasLayer" unique_id=178968045 instance=ExtResource("33_x7w5s")]
visible = false
anchors_preset = 8
anchor_left = 0.5

File diff suppressed because one or more lines are too long

View file

@ -276,15 +276,15 @@ func update_texture() -> void:
atlas = ExtResource("19_3l3ph")
region = Rect2(0, 0, 8, 8)
[node name="Global" type="Node"]
[node name="Global" type="Node" unique_id=1506289717]
process_mode = 3
script = ExtResource("1_t23sr")
[node name="Transition" type="CanvasLayer" parent="."]
[node name="Transition" type="CanvasLayer" parent="." unique_id=240864005]
layer = 128
visible = false
[node name="TransitionBlock" type="ColorRect" parent="Transition"]
[node name="TransitionBlock" type="ColorRect" parent="Transition" unique_id=1940622078]
unique_name_in_owner = true
anchors_preset = 15
anchor_right = 1.0
@ -294,7 +294,7 @@ grow_vertical = 2
mouse_filter = 2
color = Color(0, 0, 0, 1)
[node name="Freeze" type="TextureRect" parent="Transition"]
[node name="Freeze" type="TextureRect" parent="Transition" unique_id=1013697456]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
@ -302,15 +302,15 @@ grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="AnimationPlayer" type="AnimationPlayer" parent="Transition"]
[node name="AnimationPlayer" type="AnimationPlayer" parent="Transition" unique_id=804731792]
libraries = {
&"": SubResource("AnimationLibrary_l7dvb")
}
[node name="GameHUD" parent="." instance=ExtResource("1_ctvpw")]
[node name="GameHUD" parent="." unique_id=1073507466 instance=ExtResource("1_ctvpw")]
layer = 1
[node name="FPSCount" type="Label" parent="GameHUD"]
[node name="FPSCount" type="Label" parent="GameHUD" unique_id=1476489533]
unique_name_in_owner = true
visible = false
anchors_preset = 3
@ -325,64 +325,64 @@ grow_vertical = 0
text = "120FPS"
horizontal_alignment = 2
[node name="ScoreTally" type="AudioStreamPlayer" parent="."]
[node name="ScoreTally" type="AudioStreamPlayer" parent="." unique_id=1702522037]
stream = ExtResource("3_vjpdy")
bus = &"SFX"
[node name="ResourceSetter" type="Node" parent="ScoreTally" node_paths=PackedStringArray("node_to_affect")]
[node name="ResourceSetter" type="Node" parent="ScoreTally" unique_id=1337925757 node_paths=PackedStringArray("node_to_affect")]
script = ExtResource("4_7puui")
node_to_affect = NodePath("..")
property_name = "stream"
themed_resource = SubResource("Resource_6jmk5")
metadata/_custom_type_script = "uid://cq6f682453q6o"
[node name="ScoreTallyEnd" type="AudioStreamPlayer" parent="."]
[node name="ScoreTallyEnd" type="AudioStreamPlayer" parent="." unique_id=1222589524]
stream = ExtResource("6_30rl1")
bus = &"SFX"
[node name="ResourceSetter" type="Node" parent="ScoreTallyEnd" node_paths=PackedStringArray("node_to_affect")]
[node name="ResourceSetter" type="Node" parent="ScoreTallyEnd" unique_id=713410305 node_paths=PackedStringArray("node_to_affect")]
script = ExtResource("4_7puui")
node_to_affect = NodePath("..")
property_name = "stream"
themed_resource = SubResource("Resource_l7dvb")
metadata/_custom_type_script = "uid://cq6f682453q6o"
[node name="SettingsApply" type="Node" parent="."]
[node name="SettingsApply" type="Node" parent="." unique_id=897934208]
[node name="Video" type="Node" parent="SettingsApply"]
[node name="Video" type="Node" parent="SettingsApply" unique_id=1109441365]
script = ExtResource("4_nxm2a")
[node name="Audio" type="Node" parent="SettingsApply"]
[node name="Audio" type="Node" parent="SettingsApply" unique_id=1780893547]
script = ExtResource("5_l70br")
[node name="Visuals" type="Node" parent="SettingsApply"]
[node name="Visuals" type="Node" parent="SettingsApply" unique_id=115602530]
script = ExtResource("6_pamiy")
[node name="Difficulty" type="Node" parent="SettingsApply"]
[node name="Difficulty" type="Node" parent="SettingsApply" unique_id=1395239814]
script = ExtResource("7_3324c")
[node name="Timer" type="Timer" parent="."]
[node name="Timer" type="Timer" parent="." unique_id=1047030680]
autostart = true
[node name="Framerule" type="Timer" parent="."]
[node name="Framerule" type="Timer" parent="." unique_id=182874644]
wait_time = 0.351
autostart = true
[node name="SpriteFramesToJSONConverter" type="Node" parent="."]
[node name="SpriteFramesToJSONConverter" type="Node" parent="." unique_id=1797424646]
script = ExtResource("10_nptu4")
resource = SubResource("Resource_qalov")
json_file_path = "res://Assets/Sprites/Blocks/BrickDestructionParticles.json"
metadata/_custom_type_script = "uid://cqif1li7otvpl"
[node name="PlayerGhost" parent="." instance=ExtResource("14_6o310")]
[node name="PlayerGhost" parent="." unique_id=2092747110 instance=ExtResource("14_6o310")]
process_mode = 1
visible = false
z_index = 50
z_as_relative = false
[node name="CanvasLayer" type="CanvasLayer" parent="."]
[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=471195696]
[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer"]
[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer" unique_id=1151066527]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
@ -390,7 +390,7 @@ grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="ErrorMessage" type="Label" parent="CanvasLayer/VBoxContainer"]
[node name="ErrorMessage" type="Label" parent="CanvasLayer/VBoxContainer" unique_id=1317877014]
visible = false
modulate = Color(1, 0, 0, 1)
layout_mode = 2
@ -399,7 +399,7 @@ text = "ERROR! PLEASE REPORT!"
autowrap_mode = 1
uppercase = true
[node name="Warning" type="Label" parent="CanvasLayer/VBoxContainer"]
[node name="Warning" type="Label" parent="CanvasLayer/VBoxContainer" unique_id=1002195923]
visible = false
modulate = Color(1, 1, 0, 1)
layout_mode = 2
@ -408,7 +408,7 @@ text = "Warning!"
autowrap_mode = 1
uppercase = true
[node name="Comment" type="Label" parent="CanvasLayer/VBoxContainer"]
[node name="Comment" type="Label" parent="CanvasLayer/VBoxContainer" unique_id=1122997232]
visible = false
layout_mode = 2
theme_override_colors/font_shadow_color = Color(0.121569, 0.121569, 0.121569, 1)
@ -416,22 +416,22 @@ text = "Comment"
autowrap_mode = 1
uppercase = true
[node name="PanelSetter" type="Node" parent="."]
[node name="PanelSetter" type="Node" parent="." unique_id=1346795200]
script = SubResource("GDScript_30rl1")
panel = ExtResource("16_l7dvb")
texture = ExtResource("16_qalov")
[node name="PanelSetter2" type="Node" parent="."]
[node name="PanelSetter2" type="Node" parent="." unique_id=833840143]
script = SubResource("GDScript_30rl1")
panel = ExtResource("18_yyu8s")
texture = ExtResource("19_xspbb")
[node name="CursorSetter" type="Node" parent="."]
[node name="CursorSetter" type="Node" parent="." unique_id=1281577356]
script = SubResource("GDScript_l7dvb")
cursor = ExtResource("18_xcxrh")
texture = SubResource("AtlasTexture_m6bur")
[node name="ResourceSetterNew" type="Node" parent="CursorSetter" node_paths=PackedStringArray("node_to_affect")]
[node name="ResourceSetterNew" type="Node" parent="CursorSetter" unique_id=1861402201 node_paths=PackedStringArray("node_to_affect")]
script = ExtResource("19_okfpr")
node_to_affect = NodePath("..")
property_name = "texture"
@ -439,11 +439,11 @@ mode = 1
resource_json = ExtResource("20_3l3ph")
metadata/_custom_type_script = "uid://cbal8ms2oe1ik"
[node name="FontUpdater" type="Node" parent="."]
[node name="FontUpdater" type="Node" parent="." unique_id=573027079]
script = ExtResource("18_1la0o")
metadata/_custom_type_script = "uid://ctsjagoa5t33f"
[node name="MainFontGetter" type="Node" parent="FontUpdater" node_paths=PackedStringArray("node_to_affect")]
[node name="MainFontGetter" type="Node" parent="FontUpdater" unique_id=615367155 node_paths=PackedStringArray("node_to_affect")]
script = ExtResource("19_okfpr")
node_to_affect = NodePath("..")
property_name = "main_font"
@ -451,7 +451,7 @@ mode = 4
resource_json = ExtResource("23_3l3ph")
metadata/_custom_type_script = "uid://cbal8ms2oe1ik"
[node name="ScoreFontGetter" type="Node" parent="FontUpdater" node_paths=PackedStringArray("node_to_affect")]
[node name="ScoreFontGetter" type="Node" parent="FontUpdater" unique_id=1594194950 node_paths=PackedStringArray("node_to_affect")]
script = ExtResource("19_okfpr")
node_to_affect = NodePath("..")
property_name = "score_font"
@ -459,7 +459,7 @@ mode = 4
resource_json = ExtResource("24_m6bur")
metadata/_custom_type_script = "uid://cbal8ms2oe1ik"
[node name="TextShadowColourChanger" type="Node" parent="." node_paths=PackedStringArray("labels")]
[node name="TextShadowColourChanger" type="Node" parent="." unique_id=1662063214 node_paths=PackedStringArray("labels")]
script = ExtResource("19_l7dvb")
labels = [NodePath("../CanvasLayer/VBoxContainer/ErrorMessage"), NodePath("../CanvasLayer/VBoxContainer/Comment"), NodePath("../CanvasLayer/VBoxContainer/Warning"), NodePath("../GameHUD/FPSCount")]
metadata/_custom_type_script = "uid://dt2p68xl462v2"

View file

@ -14,7 +14,7 @@ color = Color(1, 1, 1, 1)
[sub_resource type="StyleBoxLine" id="StyleBoxLine_lfyeb"]
color = Color(1, 1, 1, 1)
[node name="DiscoResults" type="Control"]
[node name="DiscoResults" type="Control" unique_id=1298188288]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@ -23,7 +23,7 @@ grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_up7vl")
[node name="PanelContainer" type="PanelContainer" parent="."]
[node name="PanelContainer" type="PanelContainer" parent="." unique_id=1498395662]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
@ -38,15 +38,15 @@ grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = ExtResource("1_nfk08")
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"]
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer" unique_id=1061658617]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer"]
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer" unique_id=1367824242]
layout_mode = 2
size_flags_horizontal = 4
text = "YOUR RESULTS"
[node name="HSeparator" type="HSeparator" parent="PanelContainer/VBoxContainer/Label"]
[node name="HSeparator" type="HSeparator" parent="PanelContainer/VBoxContainer/Label" unique_id=1977156132]
layout_mode = 1
anchors_preset = 12
anchor_top = 1.0
@ -57,28 +57,28 @@ grow_horizontal = 2
grow_vertical = 0
theme_override_styles/separator = SubResource("StyleBoxLine_6886a")
[node name="Score" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
[node name="Score" type="HBoxContainer" parent="PanelContainer/VBoxContainer" unique_id=277801092]
layout_mode = 2
[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/Score"]
[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/Score" unique_id=168254607]
layout_mode = 2
text = "SCORE:"
[node name="Score" type="Label" parent="PanelContainer/VBoxContainer/Score"]
[node name="Score" type="Label" parent="PanelContainer/VBoxContainer/Score" unique_id=1767125717]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 0
text = "000000"
[node name="Rank" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
[node name="Rank" type="HBoxContainer" parent="PanelContainer/VBoxContainer" unique_id=1686368771]
layout_mode = 2
[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/Rank"]
[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/Rank" unique_id=678139659]
layout_mode = 2
size_flags_vertical = 0
text = "RANK:"
[node name="Medal" type="NinePatchRect" parent="PanelContainer/VBoxContainer/Rank"]
[node name="Medal" type="NinePatchRect" parent="PanelContainer/VBoxContainer/Rank" unique_id=52736512]
unique_name_in_owner = true
custom_minimum_size = Vector2(16, 16)
layout_mode = 2
@ -88,45 +88,45 @@ region_rect = Rect2(16, 0, 16, 16)
script = ExtResource("3_up7vl")
metadata/_custom_type_script = "uid://xem6lai3ufyj"
[node name="RankMessage" type="Label" parent="PanelContainer/VBoxContainer/Rank"]
[node name="RankMessage" type="Label" parent="PanelContainer/VBoxContainer/Rank" unique_id=571890284]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 4
text = "FAIL!"
uppercase = true
[node name="HSeparator" type="HSeparator" parent="PanelContainer/VBoxContainer"]
[node name="HSeparator" type="HSeparator" parent="PanelContainer/VBoxContainer" unique_id=1051377687]
layout_mode = 2
theme_override_styles/separator = SubResource("StyleBoxLine_lfyeb")
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/VBoxContainer"]
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/VBoxContainer" unique_id=1493933591]
layout_mode = 2
theme_override_constants/margin_left = 4
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/MarginContainer"]
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/MarginContainer" unique_id=1607230461]
layout_mode = 2
[node name="Continue" parent="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer" instance=ExtResource("4_lxtk8")]
[node name="Continue" parent="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer" unique_id=1776656853 instance=ExtResource("4_lxtk8")]
unique_name_in_owner = true
layout_mode = 2
text = "CONTINUE"
[node name="Retry" parent="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer" instance=ExtResource("4_lxtk8")]
[node name="Retry" parent="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer" unique_id=1308037190 instance=ExtResource("4_lxtk8")]
unique_name_in_owner = true
layout_mode = 2
text = "RETRY"
[node name="LevelSelect" parent="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer" instance=ExtResource("4_lxtk8")]
[node name="LevelSelect" parent="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer" unique_id=84515105 instance=ExtResource("4_lxtk8")]
unique_name_in_owner = true
layout_mode = 2
text = "LEVEL SELECT"
[node name="ReturnMenu" parent="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer" instance=ExtResource("4_lxtk8")]
[node name="ReturnMenu" parent="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer" unique_id=2105400998 instance=ExtResource("4_lxtk8")]
unique_name_in_owner = true
layout_mode = 2
text = "RETURN TO MENU"
[node name="WorldSelect" parent="." instance=ExtResource("6_lfyeb")]
[node name="WorldSelect" parent="." unique_id=2048757589 instance=ExtResource("6_lfyeb")]
visible = false
layout_mode = 1
anchors_preset = 8
@ -140,8 +140,9 @@ offset_right = 90.0
offset_bottom = 32.5
grow_horizontal = 2
grow_vertical = 2
has_disco_stuff = true
[node name="LevelSelect" parent="." instance=ExtResource("7_mjrut")]
[node name="LevelSelect" parent="." unique_id=1828692017 instance=ExtResource("7_mjrut")]
visible = false
layout_mode = 1
anchors_preset = 8
@ -164,8 +165,8 @@ grow_vertical = 2
[connection signal="pressed" from="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/LevelSelect" to="WorldSelect" method="open"]
[connection signal="pressed" from="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/LevelSelect" to="." method="set_focus" binds= [false]]
[connection signal="focus_entered" from="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/ReturnMenu" to="." method="set_index" binds= [3]]
[connection signal="pressed" from="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/ReturnMenu" to="." method="go_to_menu"]
[connection signal="pressed" from="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/ReturnMenu" to="." method="close"]
[connection signal="pressed" from="PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/ReturnMenu" to="." method="go_to_menu"]
[connection signal="cancelled" from="WorldSelect" to="." method="open"]
[connection signal="cancelled" from="WorldSelect" to="." method="set_focus" binds= [true]]
[connection signal="world_selected" from="WorldSelect" to="LevelSelect" method="open"]

View file

@ -2,21 +2,21 @@
[ext_resource type="PackedScene" uid="uid://dntk2js0tu3y2" path="res://Scenes/Prefabs/UI/WorldSelect.tscn" id="1_fvn0p"]
[node name="WorldSelect" instance=ExtResource("1_fvn0p")]
[node name="WorldSelect" unique_id=110172661 instance=ExtResource("1_fvn0p")]
world_offset = 8
num_of_worlds = 4
[node name="Slot1" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" index="0"]
[node name="Slot1" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" parent_id_path=PackedInt32Array(181733477) index="0" unique_id=1293243576]
focus_neighbor_left = NodePath("../Slot5")
[node name="Slot5" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" index="4"]
[node name="Slot5" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" parent_id_path=PackedInt32Array(181733477) index="4" unique_id=286713451]
focus_neighbor_right = NodePath("../Slot1")
[node name="Slot6" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" index="5"]
[node name="Slot6" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" parent_id_path=PackedInt32Array(181733477) index="5" unique_id=1911479070]
visible = false
[node name="Slot7" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" index="6"]
[node name="Slot7" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" parent_id_path=PackedInt32Array(181733477) index="6" unique_id=1681952344]
visible = false
[node name="Slot8" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" index="7"]
[node name="Slot8" parent="Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer" parent_id_path=PackedInt32Array(181733477) index="7" unique_id=576787431]
visible = false

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -507,3 +507,11 @@ func get_base_asset_version() -> int:
func get_version_num_int(ver_num := "0.0.0") -> int:
return int(ver_num.replace(".", ""))
func merge_dict(target: Dictionary, source: Dictionary) -> void:
# SkyanUltra: Used to properly merge dictionaries JSONs rather than out right overwriting entries.
for key in source.keys():
if target.has(key) and target[key] is Dictionary and source[key] is Dictionary:
merge_dict(target[key], source[key])
else:
target[key] = source[key]

View file

@ -54,6 +54,11 @@ var best_level_warpless_times := [
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1]
]
@ -95,7 +100,12 @@ const SMB1_LEVEL_GOLD_WARPLESS_TIMES := [
[22, 22, 17, 16], # World 5
[21, 25, 18, 16], # World 6
[20, 38, 25, 23], # World 7
[40, 24, 24, 50] # World 8
[40, 24, 24, 50], # World 8
[-1, -1, -1, -1], # World 9
[-1, -1, -1, -1], # World A
[-1, -1, -1, -1], # World B
[-1, -1, -1, -1], # World C
[-1, -1, -1, -1] # World D
]
const SMBLL_LEVEL_GOLD_WARPLESS_TIMES := [
@ -107,6 +117,11 @@ const SMBLL_LEVEL_GOLD_WARPLESS_TIMES := [
[28, 39, 23, 29],
[21, 26, 32, 36],
[24, 27, 25, 60],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1]
]
const SMB1_LEVEL_GOLD_ANY_TIMES := {
@ -135,6 +150,11 @@ const SMBS_LEVEL_GOLD_TIMES := [
[24, 21, 23, 20],
[24, 40, 30, 27],
[30, 35, 30, 43],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1]
]
const SMB1_WARP_LEVELS := ["1-2", "4-2"]
@ -262,7 +282,7 @@ func load_best_times(campaign = Global.current_campaign) -> void:
return
best_time_campaign = campaign
best_level_any_times.clear()
for world_num in 8:
for world_num in 13:
for level_num in 4:
var path = Global.config_path.path_join("marathon_recordings/" + campaign + "/" + str(world_num + 1) + "-" + str(level_num + 1) + ".json")
if FileAccess.file_exists(path):

View file

@ -71,14 +71,13 @@ func _process(_delta: float) -> void:
$BGM.play()
func campaign_selected() -> void:
$CanvasLayer/Options1.close()
if last_campaign != Global.current_campaign:
last_campaign = Global.current_campaign
update_title()
if Global.current_campaign == "SMBANN":
Global.current_game_mode = Global.GameMode.CAMPAIGN
$CanvasLayer/AllNightNippon/WorldSelect.open()
$CanvasLayer/Options2Stripped.open()
return
$CanvasLayer/Options1.close()
$CanvasLayer/Options2.open()
func open_story_options() -> void:

View file

@ -12,49 +12,136 @@ var starting_value := -1
@export var has_challenge_stuff := false
@export var has_disco_stuff := false
const LEVEL_ICON_JSON_PATH := "res://Assets/Sprites/UI/LevelIcons/LevelIcons.json"
const LEVEL_ICONS := {
"SMB1": SMB1_ICONS,
"SMBLL": SMBLL_ICONS,
"SMBS": SMBS_ICONS,
"SMBANN": SMB1_ICONS
"SMBANN": SMBANN_ICONS
}
const SMB1_ICONS := [
"0123",
"0453",
"0023",
"0163",
"8893",
"8893",
"8AB3",
"8883"
[
["day", [0,0]],["day", [0,4]],["day", [1,0]],["day", [1,4]],
],
[
["day", [0,2]],["day", [3,1]],["day", [1,2]],["day", [1,5]],
],
[
["day", [0,0]],["day", [0,1]],["day", [1,0]],["day", [1,4]],
],
[
["day", [0,1]],["day", [0,5]],["day", [1,3]],["day", [1,6]],
],
[
["night", [0,1]],["night", [0,3]],["night", [1,0]],["night", [1,5]],
],
[
["night", [0,0]],["night", [0,2]],["night", [1,1]],["night", [1,4]],
],
[
["night", [0,3]],["night", [0,4]],["night", [1,2]],["night", [1,5]],
],
[
["night", [0,1]],["night", [0,3]],["night", [2,0]],["night", [1,6]],
],
]
const SMBLL_ICONS := [
"0123",
"0053",
"0423",
"0023",
"8193",
"8AB3",
"8993",
"88D3",
"8888",
"0123",
"0423",
"0523",
"0003"
[
["day", [0,2]],["day", [0,7]],["day", [1,0]],["day", [1,4]],
],
[
["day", [1,2]],["day", [0,1]],["day", [1,2]],["day", [1,7]],
],
[
["day", [0,3]],["day", [3,0]],["day", [1,1]],["day", [1,6]],
],
[
["day", [0,1]],["day", [0,3]],["day", [1,1]],["day", [1,5]],
],
[
["night", [0,2]],["night", [0,6]],["night", [1,0]],["night", [1,5]],
],
[
["night", [0,0]],["night", [3,1]],["night", [1,2]],["night", [1,7]],
],
[
["night", [0,2]],["night", [1,2]],["night", [1,1]],["night", [1,5]],
],
[
["night", [0,2]],["night", [2,0]],["night", [2,2]],["night", [1,7]],
],
[
["night", [0,0]],["night", [3,6]],["night", [3,7]],["night", [4,4]],
],
[
["day", [0,2]],["day", [0,5]],["day", [1,0]],["day", [1,4]],
],
[
["day", [0,0]],["day", [3,1]],["day", [1,1]],["day", [1,6]],
],
[
["day", [0,2]],["day", [1,0]],["day", [1,1]],["day", [1,5]],
],
[
["day", [2,6]],["day", [2,6]],["day", [2,7]],["day", [1,7]],
],
]
const SMBS_ICONS := [
"0123",
"0453",
"0023",
"0163",
"8893",
"8893",
"8AB3",
"CA13"
[
["day", [0,1]],["day", [0,4]],["day", [1,0]],["day", [1,6]],
],
[
["day", [0,0]],["day", [3,1]],["day", [1,2]],["day", [1,7]],
],
[
["day", [3,0]],["day", [1,2]],["day", [1,0]],["day", [1,4]],
],
[
["day", [0,1]],["day", [0,5]],["day", [1,3]],["day", [1,6]],
],
[
["night", [0,1]],["night", [0,0]],["night", [1,0]],["night", [1,5]],
],
[
["night", [0,1]],["night", [0,2]],["night", [1,0]],["night", [1,4]],
],
[
["night", [0,3]],["night", [3,1]],["night", [1,2]],["night", [1,7]],
],
[
["night", [1,3]],["night", [2,1]],["night", [0,7]],["night", [1,5]],
],
]
const SMBANN_ICONS := [
[
["night", [0,0]],["night", [0,4]],["night", [1,0]],["night", [1,4]],
],
[
["night", [0,2]],["night", [3,1]],["night", [1,2]],["night", [1,5]],
],
[
["night", [0,0]],["night", [0,1]],["night", [1,0]],["night", [1,4]],
],
[
["night", [0,1]],["night", [0,5]],["night", [1,3]],["night", [1,6]],
],
[
["night", [0,1]],["night", [0,3]],["night", [1,1]],["night", [1,7]],
],
[
["night", [0,0]],["night", [0,2]],["night", [1,1]],["night", [1,5]],
],
[
["night", [0,3]],["night", [3,1]],["night", [1,2]],["night", [1,5]],
],
[
["night", [0,1]],["night", [0,3]],["night", [2,0]],["night", [1,7]],
],
]
const NUMBER_Y := [
@ -69,7 +156,7 @@ const NUMBER_Y := [
func _ready() -> void:
for i in %SlotContainer.get_children():
i.focus_entered.connect(slot_selected.bind(i.get_index()))
for i in [$Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot1/Icon/RankMedal/SRankParticles, $Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot1/Icon/RankMedal/PRankParticles, $Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot2/Icon/RankMedal/SRankParticles, $Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot2/Icon/RankMedal/PRankParticles, $Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot3/Icon/RankMedal/SRankParticles, $Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot3/Icon/RankMedal/PRankParticles, $Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot4/Icon/RankMedal/SRankParticles, $Panel/MarginContainer/VBoxContainer/HBoxContainer/ScrollContainer/SlotContainer/Slot4/Icon/RankMedal/PRankParticles]:
for i in get_tree().get_nodes_in_group("Particles"):
start_particle(i)
func start_particle(particle: GPUParticles2D) -> void:
@ -86,6 +173,7 @@ func open() -> void:
starting_value = Global.level_num
print([Global.level_num, starting_value])
selected_level = Global.level_num - 1
setup_level_icon_data()
setup_visuals()
update_pb()
show()
@ -93,10 +181,22 @@ func open() -> void:
await get_tree().create_timer(0.1).timeout
active = true
const CHARSET := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var visited_levels := "0000"
const ICON_DAY := preload("res://Assets/Sprites/UI/LevelIcons/DayLevelIcons.png")
const ICON_NIGHT := preload("res://Assets/Sprites/UI/LevelIcons/NightLevelIcons.png")
const ICON_LOCKED := preload("res://Assets/Sprites/UI/LevelIcons/LockedLevelIcon.png")
var icon_size := [56, 32]
func setup_level_icon_data() -> void:
var json = JSON.parse_string(FileAccess.open(LEVEL_ICON_JSON_PATH, FileAccess.READ).get_as_text())
icon_size = json.icon_size
for key in json.icon_data:
if get(key) is Dictionary and json.icon_data[key] is Dictionary:
Global.merge_dict(get(key), json.icon_data[key])
else:
set(key, json.icon_data[key])
func setup_visuals() -> void:
%MarathonBits.visible = Global.current_game_mode == Global.GameMode.MARATHON_PRACTICE
%ChallengeBits.visible = Global.current_game_mode == Global.GameMode.CHALLENGE
@ -107,16 +207,18 @@ func setup_visuals() -> void:
var level_theme = Global.LEVEL_THEMES[Global.current_campaign][Global.world_num - 1]
visited_levels = (SaveManager.visited_levels.substr((Global.world_num - 1) * 4, 4))
var level_visited = SaveManager.visited_levels[SaveManager.get_level_idx(Global.world_num, idx + 1)] != "0" or Global.debug_mode
var num = CHARSET.find(LEVEL_ICONS[Global.current_campaign][Global.world_num - 1][idx])
if level_visited == false:
num = 7
i.get_node("ChallengeModeBits").visible = Global.current_game_mode == Global.GameMode.CHALLENGE
if Global.current_game_mode == Global.GameMode.CHALLENGE:
setup_challenge_mode_bits(i.get_node("ChallengeModeBits"), idx + 1)
i.get_node("Icon").region_rect = Rect2((num % 4) * 56, (num / 4) * 32, 56, 32)
var cur_level = LEVEL_ICONS[Global.current_campaign][Global.world_num - 1][idx]
var cur_icon = ICON_LOCKED if not level_visited else ICON_NIGHT if cur_level[0] == "night" else ICON_DAY
var grid_size = [cur_icon.get_width() - icon_size[0], cur_icon.get_height() - icon_size[1]]
var clamp_icon = clamp([cur_level[1][0] * icon_size[0], cur_level[1][1] * icon_size[1]], [0, 0], grid_size)
i.get_node("Icon").texture = cur_icon
i.get_node("Icon").region_rect = Rect2(clamp_icon[0], clamp_icon[1], icon_size[0], icon_size[1])
i.get_node("Icon/Number").region_rect.position.y = clamp(NUMBER_Y.find(level_theme) * 12, 0, 9999)
i.get_node("Icon/Number").region_rect.position.x = (idx) * 12
i.get_node("Icon/RankMedal").visible = Global.current_campaign == "SMBANN"
i.get_node("ChallengeModeBits").visible = Global.current_game_mode == Global.GameMode.CHALLENGE
if Global.current_game_mode == Global.GameMode.CHALLENGE:
setup_challenge_mode_bits(i.get_node("ChallengeModeBits"), idx + 1)
if Global.current_campaign == "SMBANN":
i.get_node("Icon/RankMedal").frame = "ZFDCBASP".find(DiscoLevel.level_ranks[SaveManager.get_level_idx(Global.world_num, idx + 1)])
i.get_node("Icon/RankMedal/SRankParticles").visible = i.get_node("Icon/RankMedal").frame == 6
@ -138,7 +240,6 @@ func update_score() -> void:
func update_pb() -> void:
if has_speedrun_stuff == false: return
var best_warpless_time = SpeedrunHandler.best_level_warpless_times[Global.world_num - 1][selected_level]
print(SpeedrunHandler.best_level_warpless_times)
var best_any_time = SpeedrunHandler.best_level_any_times.get(str(Global.world_num) + "-" + str(selected_level + 1), -1)
%FullRunPB.text = "--:--:--" if best_warpless_time == -1 else SpeedrunHandler.gen_time_string(SpeedrunHandler.format_time(best_warpless_time))
%WarpRunPB.text = "--:--:--" if best_any_time == -1 else SpeedrunHandler.gen_time_string(SpeedrunHandler.format_time(best_any_time))

View file

@ -2,6 +2,10 @@ extends Control
var selected_world := 0
@export var has_speedrun_stuff := false
@export var has_challenge_stuff := false
@export var has_disco_stuff := false
@export var world_offset := 0
@export var num_of_worlds := 7
@ -26,6 +30,12 @@ const NUMBER_Y := [
func _ready() -> void:
for i in %SlotContainer.get_children():
i.focus_entered.connect(slot_focused.bind(i.get_index()))
for i in get_tree().get_nodes_in_group("Particles"):
start_particle(i)
func start_particle(particle: GPUParticles2D) -> void:
await get_tree().create_timer(randf_range(0, 5)).timeout
particle.emitting = true
func _process(_delta: float) -> void:
if active:
@ -36,6 +46,7 @@ func open() -> void:
if starting_value == -1:
starting_value = Global.world_num
selected_world = Global.world_num - 1 - world_offset
if has_speedrun_stuff and not Global.current_game_mode in [Global.GameMode.MARATHON, Global.GameMode.MARATHON_PRACTICE]: Global.current_game_mode = Global.GameMode.MARATHON
setup_visuals()
show()
await get_tree().process_frame
@ -64,10 +75,74 @@ func setup_visuals() -> void:
var resource_getter = ResourceGetter.new() #Is it safe to be making a new one of these per icon?
i.get_node("Icon").region_rect = CustomLevelContainer.THEME_RECTS[level_theme]
i.get_node("Icon").texture = resource_getter.get_resource(CustomLevelContainer.ICON_TEXTURES[0 if (idx <= 3 or idx >= 8) and Global.current_campaign != "SMBANN" else 1])
i.get_node("Icon/Number").position.y = 10 if has_challenge_stuff else 17
i.get_node("Icon/Number").region_rect.position.y = clamp(NUMBER_Y.find(level_theme) * 12, 0, 9999)
i.get_node("Icon/Number").region_rect.position.x = (idx + world_offset) * 12
setup_challenge_mode_bits(i.get_node("Icon/RedCoins"), i.get_node("Icon/Egg"), i.get_node("Icon/Score"), i.get_node("Icon/RedCoins/Full"), i.get_node("Icon/Egg/Full"), i.get_node("Icon/Score/Full"), idx + world_offset)
setup_marathon_bits(i.get_node("Icon/Medal"), i.get_node("Icon/Medal/Full"), idx + world_offset)
setup_disco_bits(i.get_node("Icon/Medal"), i.get_node("Icon/Medal/Full"), i.get_node("Icon/Medal/Full/SRankParticles"), i.get_node("Icon/Medal/Full/PRankParticles"), idx + world_offset)
idx += 1
func setup_challenge_mode_bits(red_coins_outline: TextureRect, egg_outline: TextureRect, score_outline: TextureRect, red_coins: NinePatchRect, egg: NinePatchRect, score: NinePatchRect, world_num := 1) -> void:
if has_challenge_stuff == false: return
var red_coins_collected = []
var eggs_collected = []
var scores_collected = []
for level in 4:
for i in 5:
red_coins_collected.append(ChallengeModeHandler.is_coin_collected(i, ChallengeModeHandler.red_coins_collected[world_num][level]))
eggs_collected.append(ChallengeModeHandler.is_coin_collected(ChallengeModeHandler.CoinValues.YOSHI_EGG, ChallengeModeHandler.red_coins_collected[world_num][level]))
scores_collected.append(ChallengeModeHandler.top_challenge_scores[world_num][level] >= ChallengeModeHandler.CHALLENGE_TARGETS[Global.current_campaign][world_num][level])
for i in [red_coins_outline, egg_outline, score_outline]:
i.visible = true
red_coins.visible = not red_coins_collected.has(false)
egg.visible = not eggs_collected.has(false)
var egg_frame = 10 * (world_num % 4)
egg.region_rect = Rect2(egg_frame, 0, 10, 10)
score.visible = not scores_collected.has(false)
func setup_marathon_bits(medal_outline: TextureRect, medal: NinePatchRect, world_num := 1) -> void:
if has_speedrun_stuff == false: return
var saved_medal_ids = []
for i in 4:
var best_warpless_time = SpeedrunHandler.best_level_warpless_times[world_num][i]
var best_any_time = SpeedrunHandler.best_level_any_times.get(str(world_num + 1) + "-" + str(i + 1), -1)
var gold_warpless_time = SpeedrunHandler.LEVEL_GOLD_WARPLESS_TIMES[Global.current_campaign][world_num][i]
var gold_any_time := -1.0
if SpeedrunHandler.LEVEL_GOLD_ANY_TIMES[Global.current_campaign].has(str(world_num + 1) + "-" + str(i + 1)):
gold_any_time = SpeedrunHandler.LEVEL_GOLD_ANY_TIMES[Global.current_campaign][str(world_num + 1) + "-" + str(i + 1)]
var medal_id = -1
for o in SpeedrunHandler.MEDAL_CONVERSIONS:
var target_time = gold_warpless_time * SpeedrunHandler.MEDAL_CONVERSIONS[o]
medal_id += 1 if SpeedrunHandler.met_target_time(best_warpless_time, target_time) else 0
saved_medal_ids.append(medal_id)
if gold_any_time != -1:
medal_id = -1
for o in SpeedrunHandler.MEDAL_CONVERSIONS:
var target_time = gold_any_time * SpeedrunHandler.MEDAL_CONVERSIONS[o]
medal_id += 1 if SpeedrunHandler.met_target_time(best_any_time, target_time) else 0
saved_medal_ids.append(medal_id)
medal_outline.visible = true
medal.visible = saved_medal_ids.min() >= 0
var medal_rect_x = saved_medal_ids.min() * 10
medal.region_rect = Rect2(10 + medal_rect_x, 10, 10, 10)
func setup_disco_bits(medal_outline: TextureRect, medal: NinePatchRect, s_rank_pfx: GPUParticles2D, p_rank_pfx: GPUParticles2D, world_num := 1) -> void:
if has_disco_stuff == false: return
var saved_rank_ids = []
var lowest_rank = -1
for i in 4:
saved_rank_ids.append(DiscoLevel.level_ranks[SaveManager.get_level_idx(world_num + 1, i + 1)])
for rank in DiscoLevel.RANK_IDs.size():
if DiscoLevel.RANK_IDs[rank] == saved_rank_ids[i] and (lowest_rank > rank + 1 or lowest_rank < 0):
lowest_rank = rank + 1
medal_outline.visible = true
medal.visible = lowest_rank != -1
var medal_rect_x = lowest_rank * 10
medal.region_rect = Rect2(medal_rect_x, 20, 10, 10)
s_rank_pfx.visible = lowest_rank == 6
p_rank_pfx.visible = lowest_rank == 7
func handle_input() -> void:
if Input.is_action_just_pressed("ui_accept"):
if SaveManager.visited_levels.substr((selected_world + world_offset) * 4, 4) == "0000" and not Global.debug_mode and selected_world != 0: