From 5daa630a7257d25ce8d746ed3a167a6674de047b Mon Sep 17 00:00:00 2001 From: jdaster64 Date: Sat, 22 Nov 2025 11:41:04 -0500 Subject: [PATCH] Alternate Challenge HUD Proposal: Previously obtained coins/eggs are transparent (#712) * Challenge Hunt: Transparent HUD for previously obtained coins/eggs * Add 'score potential' tracker, make egg not default to empty if egg isn't in the current room on a replay * Make transparent HUD elements render on top, and become invisible if their fully-opaque equivalents should be enabled instead --- Scenes/Prefabs/GameHud.tscn | 223 +++++++++++++++++- Scenes/Prefabs/UI/StoryPause.tscn | 2 +- Scripts/Classes/Entities/Items/RedCoin.gd | 2 +- .../Classes/Entities/Items/SpinningRedCoin.gd | 2 +- .../Singletons/ChallengeModeHandler.gd | 4 + Scripts/Classes/UI/GameHUD.gd | 56 +++-- Scripts/Parts/GameOver.gd | 2 +- Scripts/Parts/TitleScreen.gd | 2 +- Scripts/UI/ChallengeModeResults.gd | 5 +- 9 files changed, 273 insertions(+), 25 deletions(-) diff --git a/Scenes/Prefabs/GameHud.tscn b/Scenes/Prefabs/GameHud.tscn index 6781ca0e..d64deb6a 100644 --- a/Scenes/Prefabs/GameHud.tscn +++ b/Scenes/Prefabs/GameHud.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=40 format=3 uid="uid://bod0jkf7jc5pm"] +[gd_scene load_steps=41 format=3 uid="uid://bod0jkf7jc5pm"] [ext_resource type="Script" uid="uid://bjbd3a6su47si" path="res://Scripts/Classes/UI/GameHUD.gd" id="1_f34v2"] [ext_resource type="Script" uid="uid://caq1qiwmy0mox" path="res://Scripts/Parts/BetterAnimatedSprite.gd" id="2_cbrve"] @@ -68,6 +68,21 @@ animations = [{ [sub_resource type="ShaderMaterial" id="ShaderMaterial_cfljn"] shader = ExtResource("9_oqalm") +[sub_resource type="Animation" id="Animation_40ba1"] +resource_name = "AlwaysOn" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:visible") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} + [sub_resource type="Animation" id="Animation_niy8w"] resource_name = "Flash" loop_mode = 1 @@ -101,6 +116,7 @@ tracks/0/keys = { [sub_resource type="AnimationLibrary" id="AnimationLibrary_cfljn"] _data = { +&"AlwaysOn": SubResource("Animation_40ba1"), &"Flash": SubResource("Animation_niy8w"), &"RESET": SubResource("Animation_oqalm") } @@ -371,6 +387,90 @@ centered = false hframes = 2 region_rect = Rect2(0, 0, 8, 8) +[node name="Coin1Transparent" type="Sprite2D" parent="Main/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +position = Vector2(-8, 0) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="Main/RedCoins/Coin1Transparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Coin2Transparent" type="Sprite2D" parent="Main/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="Main/RedCoins/Coin2Transparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Coin3Transparent" type="Sprite2D" parent="Main/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +position = Vector2(8, 0) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="Main/RedCoins/Coin3Transparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Coin4Transparent" type="Sprite2D" parent="Main/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +position = Vector2(16, 0) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="Main/RedCoins/Coin4Transparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Coin5Transparent" type="Sprite2D" parent="Main/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +position = Vector2(24, 0) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="Main/RedCoins/Coin5Transparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + [node name="BorderR" type="Sprite2D" parent="Main/RedCoins"] position = Vector2(32, 0) texture = ExtResource("5_gmuut") @@ -450,6 +550,23 @@ centered = false hframes = 2 region_rect = Rect2(0, 0, 8, 8) +[node name="ScoreMedalTransparent" type="Sprite2D" parent="Main/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +position = Vector2(43, -2) +texture = ExtResource("9_m8toq") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="Main/RedCoins/ScoreMedalTransparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("9_m8toq") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + [node name="Buffer3" type="Control" parent="Main"] custom_minimum_size = Vector2(24, 0) layout_mode = 2 @@ -742,6 +859,90 @@ centered = false hframes = 2 region_rect = Rect2(0, 0, 8, 8) +[node name="Coin1Transparent" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +position = Vector2(-8, 0) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins/Coin1Transparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Coin2Transparent" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins/Coin2Transparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Coin3Transparent" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +position = Vector2(8, 0) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins/Coin3Transparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Coin4Transparent" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +position = Vector2(16, 0) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins/Coin4Transparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Coin5Transparent" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +position = Vector2(24, 0) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins/Coin5Transparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("6_2ww58") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + [node name="BorderR" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins"] position = Vector2(32, 0) texture = ExtResource("5_gmuut") @@ -780,6 +981,7 @@ region_rect = Rect2(0, 0, 8, 8) [node name="ModernRadar" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins/YoshiEgg"] unique_name_in_owner = true visible = false +material = SubResource("ShaderMaterial_cfljn") texture = ExtResource("7_r3m7e") centered = false hframes = 3 @@ -820,6 +1022,23 @@ centered = false hframes = 2 region_rect = Rect2(0, 0, 8, 8) +[node name="ScoreMedalTransparent" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins"] +material = SubResource("ShaderMaterial_cfljn") +position = Vector2(43, -2) +texture = ExtResource("9_m8toq") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + +[node name="Shadow" type="Sprite2D" parent="ModernHUD/TopLeft/RedCoins/ScoreMedalTransparent"] +show_behind_parent = true +material = SubResource("ShaderMaterial_eon7h") +position = Vector2(1, 1) +texture = ExtResource("9_m8toq") +centered = false +hframes = 2 +region_rect = Rect2(0, 0, 8, 8) + [node name="LifeCount" type="HBoxContainer" parent="ModernHUD/TopLeft"] layout_mode = 0 offset_left = 20.0 @@ -1079,7 +1298,7 @@ metadata/_custom_type_script = "uid://co6tjg3w6qpd8" [node name="TextureUpdater" type="Node" parent="." node_paths=PackedStringArray("sprites")] script = SubResource("GDScript_jwl8o") -sprites = [NodePath("../Main/RedCoins/BorderL"), NodePath("../Main/RedCoins/BorderL/Shadow"), NodePath("../Main/RedCoins/Coin1"), NodePath("../Main/RedCoins/Coin1/Shadow"), NodePath("../Main/RedCoins/Coin2"), NodePath("../Main/RedCoins/Coin2/Shadow"), NodePath("../Main/RedCoins/Coin3"), NodePath("../Main/RedCoins/Coin3/Shadow"), NodePath("../Main/RedCoins/Coin4"), NodePath("../Main/RedCoins/Coin4/Shadow"), NodePath("../Main/RedCoins/Coin5"), NodePath("../Main/RedCoins/Coin5/Shadow"), NodePath("../Main/RedCoins/BorderR"), NodePath("../Main/RedCoins/BorderR/Shadow"), NodePath("../Main/RedCoins/YoshiEgg"), NodePath("../Main/RedCoins/YoshiEgg/Shadow"), NodePath("../Main/RedCoins/ScoreMedal"), NodePath("../Main/RedCoins/ScoreMedal/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/BorderL"), NodePath("../ModernHUD/TopLeft/RedCoins/BorderL/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin1"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin1/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin2"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin2/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin3"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin3/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin4"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin4/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin5"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin5/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/BorderR"), NodePath("../ModernHUD/TopLeft/RedCoins/BorderR/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/YoshiEgg"), NodePath("../ModernHUD/TopLeft/RedCoins/YoshiEgg/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/ScoreMedal"), NodePath("../ModernHUD/TopLeft/RedCoins/ScoreMedal/Shadow")] +sprites = [NodePath("../Main/RedCoins/BorderL"), NodePath("../Main/RedCoins/BorderL/Shadow"), NodePath("../Main/RedCoins/Coin1"), NodePath("../Main/RedCoins/Coin1/Shadow"), NodePath("../Main/RedCoins/Coin2"), NodePath("../Main/RedCoins/Coin2/Shadow"), NodePath("../Main/RedCoins/Coin3"), NodePath("../Main/RedCoins/Coin3/Shadow"), NodePath("../Main/RedCoins/Coin4"), NodePath("../Main/RedCoins/Coin4/Shadow"), NodePath("../Main/RedCoins/Coin5"), NodePath("../Main/RedCoins/Coin5/Shadow"), NodePath("../Main/RedCoins/Coin1Transparent"), NodePath("../Main/RedCoins/Coin1Transparent/Shadow"), NodePath("../Main/RedCoins/Coin2Transparent"), NodePath("../Main/RedCoins/Coin2Transparent/Shadow"), NodePath("../Main/RedCoins/Coin3Transparent"), NodePath("../Main/RedCoins/Coin3Transparent/Shadow"), NodePath("../Main/RedCoins/Coin4Transparent"), NodePath("../Main/RedCoins/Coin4Transparent/Shadow"), NodePath("../Main/RedCoins/Coin5Transparent"), NodePath("../Main/RedCoins/Coin5Transparent/Shadow"), NodePath("../Main/RedCoins/BorderR"), NodePath("../Main/RedCoins/BorderR/Shadow"), NodePath("../Main/RedCoins/YoshiEgg"), NodePath("../Main/RedCoins/YoshiEgg/Shadow"), NodePath("../Main/RedCoins/ScoreMedalTransparent"), NodePath("../Main/RedCoins/ScoreMedalTransparent/Shadow"), NodePath("../Main/RedCoins/ScoreMedal"), NodePath("../Main/RedCoins/ScoreMedal/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/BorderL"), NodePath("../ModernHUD/TopLeft/RedCoins/BorderL/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin1"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin1/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin2"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin2/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin3"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin3/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin4"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin4/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin5"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin5/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin1Transparent"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin1Transparent/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin2Transparent"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin2Transparent/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin3Transparent"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin3Transparent/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin4Transparent"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin4Transparent/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin5Transparent"), NodePath("../ModernHUD/TopLeft/RedCoins/Coin5Transparent/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/BorderR"), NodePath("../ModernHUD/TopLeft/RedCoins/BorderR/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/YoshiEgg"), NodePath("../ModernHUD/TopLeft/RedCoins/YoshiEgg/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/ScoreMedalTransparent"), NodePath("../ModernHUD/TopLeft/RedCoins/ScoreMedalTransparent/Shadow"), NodePath("../ModernHUD/TopLeft/RedCoins/ScoreMedal"), NodePath("../ModernHUD/TopLeft/RedCoins/ScoreMedal/Shadow")] [connection signal="timeout" from="Timer" to="." method="on_timeout"] [connection signal="updated" from="ColourPaletteSampler" to="TextShadowColourChanger" method="handle_shadow_colours"] diff --git a/Scenes/Prefabs/UI/StoryPause.tscn b/Scenes/Prefabs/UI/StoryPause.tscn index ba27b151..c72b180d 100644 --- a/Scenes/Prefabs/UI/StoryPause.tscn +++ b/Scenes/Prefabs/UI/StoryPause.tscn @@ -17,7 +17,7 @@ func restart_level() -> void: DiscoLevel.reset_values() if Global.current_game_mode == Global.GameMode.CHALLENGE: Global.score = 0 - ChallengeModeHandler.current_run_red_coins_collected = ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1] + ChallengeModeHandler.current_run_red_coins_collected = 0 Global.current_level.reload_level() await Global.current_level.tree_exited $\"..\".close() diff --git a/Scripts/Classes/Entities/Items/RedCoin.gd b/Scripts/Classes/Entities/Items/RedCoin.gd index b0d6df3a..8d7e303a 100644 --- a/Scripts/Classes/Entities/Items/RedCoin.gd +++ b/Scripts/Classes/Entities/Items/RedCoin.gd @@ -11,7 +11,7 @@ var can_spawn_particles := false signal collected func _ready() -> void: - if ChallengeModeHandler.is_coin_collected(id): + if ChallengeModeHandler.is_coin_collected(id) or ChallengeModeHandler.is_coin_permanently_collected(id): already_collected = true $Sprite.play("Collected") set_visibility_layer_bit(0, false) diff --git a/Scripts/Classes/Entities/Items/SpinningRedCoin.gd b/Scripts/Classes/Entities/Items/SpinningRedCoin.gd index e1848ad3..4ff1542a 100644 --- a/Scripts/Classes/Entities/Items/SpinningRedCoin.gd +++ b/Scripts/Classes/Entities/Items/SpinningRedCoin.gd @@ -12,7 +12,7 @@ var can_spawn_particles := false @onready var COIN_SPARKLE = load("res://Scenes/Prefabs/Particles/RedCoinSparkle.tscn") func _ready() -> void: - already_collected = ChallengeModeHandler.is_coin_collected(id) + already_collected = ChallengeModeHandler.is_coin_collected(id) or ChallengeModeHandler.is_coin_permanently_collected(id) if already_collected == false: ChallengeModeHandler.red_coins += 1 AudioManager.play_sfx(collection_sounds[ChallengeModeHandler.red_coins - 1], global_position) diff --git a/Scripts/Classes/Singletons/ChallengeModeHandler.gd b/Scripts/Classes/Singletons/ChallengeModeHandler.gd index 4463b21a..990269b7 100644 --- a/Scripts/Classes/Singletons/ChallengeModeHandler.gd +++ b/Scripts/Classes/Singletons/ChallengeModeHandler.gd @@ -83,6 +83,10 @@ static func set_value(coin_id := CoinValues.R_COIN_1, value := false) -> void: static func is_coin_collected(coin_id: CoinValues = CoinValues.R_COIN_1, num := current_run_red_coins_collected) -> bool: return num & (1 << coin_id) != 0 +static func is_coin_permanently_collected(coin_id: CoinValues = CoinValues.R_COIN_1) -> bool: + var permanently_collected = int(red_coins_collected[Global.world_num - 1][Global.level_num - 1]) + return permanently_collected & (1 << coin_id) != 0 + func check_for_achievement() -> void: for x in red_coins_collected: for i in x: diff --git a/Scripts/Classes/UI/GameHUD.gd b/Scripts/Classes/UI/GameHUD.gd index 2cf668f3..60cffee5 100644 --- a/Scripts/Classes/UI/GameHUD.gd +++ b/Scripts/Classes/UI/GameHUD.gd @@ -100,54 +100,78 @@ func handle_challenge_mode_hud() -> void: %ModernLifeCount.hide() %CharacterIcon.hide() var red_coins_collected = ChallengeModeHandler.current_run_red_coins_collected - var idx := 0 + if Global.world_num > 8: return if Global.in_title_screen: red_coins_collected = int(ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1]) + + var idx := 0 for i in [$Main/RedCoins/Coin1, $Main/RedCoins/Coin2, $Main/RedCoins/Coin3, $Main/RedCoins/Coin4, $Main/RedCoins/Coin5]: i.frame = int(ChallengeModeHandler.is_coin_collected(idx, red_coins_collected)) idx += 1 + idx = 0 + for i in [$Main/RedCoins/Coin1Transparent, $Main/RedCoins/Coin2Transparent, $Main/RedCoins/Coin3Transparent, $Main/RedCoins/Coin4Transparent, $Main/RedCoins/Coin5Transparent]: + i.visible = false + if ChallengeModeHandler.is_coin_permanently_collected(idx) and not ChallengeModeHandler.is_coin_collected(idx, red_coins_collected): + i.visible = true + i.frame = 1 + idx += 1 + + $Main/RedCoins/ScoreMedal.frame = 0 + $Main/RedCoins/ScoreMedalTransparent.visible = false + var score_target = ChallengeModeHandler.CHALLENGE_TARGETS[Global.current_campaign][Global.world_num - 1][Global.level_num - 1] + if Global.score >= score_target or ChallengeModeHandler.top_challenge_scores[Global.world_num - 1][Global.level_num - 1] >= score_target: + $Main/RedCoins/ScoreMedal.frame = 1 + elif Global.score > 0 and (Global.score + (Global.time * 50)) >= score_target: + $Main/RedCoins/ScoreMedalTransparent.frame = 1 + $Main/RedCoins/ScoreMedalTransparent.visible = true + if ChallengeModeHandler.is_coin_collected(ChallengeModeHandler.CoinValues.YOSHI_EGG, red_coins_collected): $Main/RedCoins/YoshiEgg.frame = Global.level_num else: $Main/RedCoins/YoshiEgg.frame = 0 - $Main/RedCoins/ScoreMedal.frame = (Global.score > ChallengeModeHandler.CHALLENGE_TARGETS[Global.current_campaign][Global.world_num - 1][Global.level_num - 1] or ChallengeModeHandler.top_challenge_scores[Global.world_num - 1][Global.level_num - 1] >= ChallengeModeHandler.CHALLENGE_TARGETS[Global.current_campaign][Global.world_num - 1][Global.level_num - 1]) - - if is_instance_valid(Global.current_level): - handle_yoshi_radar() + handle_yoshi_radar() for i in $Main/RedCoins.get_children(): i.get_node("Shadow").frame = i.frame + i.get_node("Shadow").visible = i.visible for i in $ModernHUD/TopLeft/RedCoins.get_child_count(): $ModernHUD/TopLeft/RedCoins.get_child(i).frame = $Main/RedCoins.get_child(i).frame + $ModernHUD/TopLeft/RedCoins.get_child(i).visible = $Main/RedCoins.get_child(i).visible $ModernHUD/TopLeft/RedCoins.get_child(i).get_node("Shadow").frame = $Main/RedCoins.get_child(i).frame + $ModernHUD/TopLeft/RedCoins.get_child(i).get_node("Shadow").visible = $Main/RedCoins.get_child(i).visible func handle_yoshi_radar() -> void: + if not is_instance_valid(Global.current_level) or ChallengeModeHandler.is_coin_collected(ChallengeModeHandler.CoinValues.YOSHI_EGG): + %Radar.get_node("AnimationPlayer").play("RESET") + %ModernRadar.get_node("AnimationPlayer").play("RESET") + return + var has_egg = false var egg_position = Vector2.ZERO + var distance = 999 for i in get_tree().get_nodes_in_group("Blocks"): if i.item != null: if i.item.resource_path == "res://Scenes/Prefabs/Entities/Items/YoshiEgg.tscn": has_egg = true egg_position = i.global_position break + if has_egg: + var player_position = get_tree().get_first_node_in_group("Players").global_position + distance = (egg_position - player_position).length() + %Radar.frame = Global.level_num - %ModernRadar.frame = Global.level_num - if has_egg == false or ChallengeModeHandler.is_coin_collected(ChallengeModeHandler.CoinValues.YOSHI_EGG): - %Radar.get_node("AnimationPlayer").play("RESET") - %ModernRadar.get_node("AnimationPlayer").play("RESET") - return - - var player_position = get_tree().get_first_node_in_group("Players").global_position - var distance = (egg_position - player_position).length() - - %Radar.get_node("AnimationPlayer").speed_scale = (250 / distance) - %ModernRadar.get_node("AnimationPlayer").speed_scale = $Main/RedCoins/YoshiEgg/Radar/AnimationPlayer.speed_scale + if distance < 512: + %Radar.get_node("AnimationPlayer").speed_scale = (250 / distance) + %ModernRadar.get_node("AnimationPlayer").speed_scale = $Main/RedCoins/YoshiEgg/Radar/AnimationPlayer.speed_scale %Radar.get_node("AnimationPlayer").play("Flash") %ModernRadar.get_node("AnimationPlayer").play("Flash") + elif ChallengeModeHandler.is_coin_permanently_collected(ChallengeModeHandler.CoinValues.YOSHI_EGG): + %Radar.get_node("AnimationPlayer").play("AlwaysOn") + %ModernRadar.get_node("AnimationPlayer").play("AlwaysOn") else: %Radar.get_node("AnimationPlayer").play("RESET") %ModernRadar.get_node("AnimationPlayer").play("RESET") diff --git a/Scripts/Parts/GameOver.gd b/Scripts/Parts/GameOver.gd index d16f69c7..769c0694 100644 --- a/Scripts/Parts/GameOver.gd +++ b/Scripts/Parts/GameOver.gd @@ -50,7 +50,7 @@ func quit_to_menu() -> void: func reset_values() -> void: if Global.world_num <= 8: - ChallengeModeHandler.current_run_red_coins_collected = ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1] + ChallengeModeHandler.current_run_red_coins_collected = 0 Global.lives = 3 Global.score = 0 Global.player_power_states = "0000" diff --git a/Scripts/Parts/TitleScreen.gd b/Scripts/Parts/TitleScreen.gd index 793f7e4e..6cbb2602 100644 --- a/Scripts/Parts/TitleScreen.gd +++ b/Scripts/Parts/TitleScreen.gd @@ -195,7 +195,7 @@ func challenge_hunt_start() -> void: LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num) - ChallengeModeHandler.current_run_red_coins_collected = ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num -1] + ChallengeModeHandler.current_run_red_coins_collected = 0 Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn") func world_9_selected() -> void: diff --git a/Scripts/UI/ChallengeModeResults.gd b/Scripts/UI/ChallengeModeResults.gd index ff5887e4..b37edf5e 100644 --- a/Scripts/UI/ChallengeModeResults.gd +++ b/Scripts/UI/ChallengeModeResults.gd @@ -46,7 +46,7 @@ func save_results() -> void: func retry_level() -> void: Global.player_power_states = "0000" - ChallengeModeHandler.current_run_red_coins_collected = ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1] + ChallengeModeHandler.current_run_red_coins_collected = 0 Global.score = 0 LevelTransition.level_to_transition_to = Level.get_scene_string(Global.world_num, Global.level_num) Global.transition_to_scene("res://Scenes/Levels/LevelTransition.tscn") @@ -90,7 +90,8 @@ func update_score() -> void: func give_red_coin_medal() -> void: const mask = (1 << ChallengeModeHandler.CoinValues.R_COIN_1) | (1 << ChallengeModeHandler.CoinValues.R_COIN_2) | (1 << ChallengeModeHandler.CoinValues.R_COIN_3) | (1 << ChallengeModeHandler.CoinValues.R_COIN_4) | (1 << ChallengeModeHandler.CoinValues.R_COIN_5) - var valid := (ChallengeModeHandler.current_run_red_coins_collected & mask) == mask + var all_collected = int(ChallengeModeHandler.red_coins_collected[Global.world_num - 1][Global.level_num - 1]) | ChallengeModeHandler.current_run_red_coins_collected + var valid := (int(all_collected) & mask) == mask if valid and not coin_medal: do_medal_give_animation($Sprite2D3/RedCoins)