extends CanvasLayer # Level Complete UI - Shows stats when level is completed var title_label: Label = null var stats_header_label: Label = null var enemies_label: Label = null var time_label: Label = null var downed_label: Label = null var exp_label: Label = null var coins_label: Label = null func _ready(): visible = false _find_labels() func _find_labels(): # Find labels (works for both scene-based and programmatically created UI) var vbox = get_child(0) if get_child_count() > 0 else null if vbox: for child in vbox.get_children(): if child is Label: # Check by name first (more reliable) if child.name == "TitleLabel" or (title_label == null and (child.text == "LEVEL COMPLETE!" or child.text.begins_with("LEVEL"))): title_label = child elif child.name == "StatsHeaderLabel" or (stats_header_label == null and child.text == "stats"): stats_header_label = child # Check by name for other labels elif child.name == "EnemiesLabel": enemies_label = child elif child.name == "TimeLabel": time_label = child elif child.name == "DownedLabel": downed_label = child elif child.name == "ExpLabel": exp_label = child elif child.name == "CoinsLabel": coins_label = child elif child is VBoxContainer: # Stats container for stat_child in child.get_children(): if stat_child.name == "EnemiesLabel": enemies_label = stat_child elif stat_child.name == "TimeLabel": time_label = stat_child elif stat_child.name == "DownedLabel": downed_label = stat_child elif stat_child.name == "ExpLabel": exp_label = stat_child elif stat_child.name == "CoinsLabel": coins_label = stat_child func show_stats(enemies_defeated: int, times_downed: int, exp_collected: float, coins_collected: int, level_time: float, level_number: int = 1): # Ensure labels are found (in case _ready() hasn't run yet) _find_labels() # Update labels if title_label: title_label.text = "LEVEL " + str(level_number) + " COMPLETE!" else: print("LevelCompleteUI: WARNING - title_label not found!") if stats_header_label: stats_header_label.text = "stats" if enemies_label: enemies_label.text = "Enemies defeated: " + str(enemies_defeated) enemies_label.visible = true else: print("LevelCompleteUI: WARNING - enemies_label not found!") # Format level time as MM:SS if time_label: var minutes = int(level_time) / 60 var seconds = int(level_time) % 60 time_label.text = "Finish time: %02d:%02d" % [minutes, seconds] time_label.visible = true else: print("LevelCompleteUI: WARNING - time_label not found!") # Hide labels that are not needed (per user request: only show enemies, coins, and time) if downed_label: downed_label.visible = false downed_label.text = "Times Downed: " + str(times_downed) if exp_label: exp_label.visible = false exp_label.text = "EXP Collected: " + str(int(exp_collected)) if coins_label: coins_label.text = "Coins collected: " + str(coins_collected) coins_label.visible = true else: print("LevelCompleteUI: WARNING - coins_label not found!") # Show UI visible = true # Fade in - fade the VBoxContainer and all labels var vbox = get_child(0) if get_child_count() > 0 else null if vbox: vbox.modulate.a = 0.0 var fade_in = create_tween() fade_in.set_parallel(true) fade_in.tween_property(vbox, "modulate:a", 1.0, 0.5) # Also fade individual labels if they exist if title_label: title_label.modulate.a = 0.0 fade_in.tween_property(title_label, "modulate:a", 1.0, 0.5) if stats_header_label: stats_header_label.modulate.a = 0.0 fade_in.tween_property(stats_header_label, "modulate:a", 1.0, 0.5) if enemies_label: enemies_label.modulate.a = 0.0 fade_in.tween_property(enemies_label, "modulate:a", 1.0, 0.5) if time_label: time_label.modulate.a = 0.0 fade_in.tween_property(time_label, "modulate:a", 1.0, 0.5) if downed_label: downed_label.modulate.a = 0.0 fade_in.tween_property(downed_label, "modulate:a", 1.0, 0.5) if exp_label: exp_label.modulate.a = 0.0 fade_in.tween_property(exp_label, "modulate:a", 1.0, 0.5) if coins_label: coins_label.modulate.a = 0.0 fade_in.tween_property(coins_label, "modulate:a", 1.0, 0.5)