extends Control @onready var zoom_node: Node2D = %ZoomNode @onready var wrapper: Control = %Wrapper @onready var v_label: Label = %VLabel @onready var panel_label: Label = %PanelLabel @onready var transition_overlay: ColorRect = %TransitionOverlay func _ready() -> void: if not Engine.is_editor_hint(): get_window().mode = Window.MODE_FULLSCREEN var screen_size: Vector2 = get_viewport_rect().size # Position Node2D at screen center — its transform (scale) will # zoom everything from this point, giving a proper zoom-in effect. zoom_node.position = screen_size * 0.5 # Size wrapper to cover the screen, offset so its center aligns # with the Node2D origin at screen center. wrapper.size = screen_size wrapper.position = -screen_size * 0.5 # Set font sizes proportional to viewport height so they look # consistently large at any resolution. var v_size: int = maxi(1, int(screen_size.y * 0.42)) var p_size: int = maxi(1, int(screen_size.y * 0.22)) v_label.add_theme_font_size_override("normal_font_size", v_size) panel_label.add_theme_font_size_override("normal_font_size", p_size) # Initial state: tiny + invisible inside the zoom node zoom_node.scale = Vector2(0.01, 0.01) zoom_node.modulate = Color(1, 1, 1, 0) transition_overlay.color = Color(0, 0, 0, 1) await get_tree().process_frame # Fade overlay away (reveal clean background) var reveal := create_tween() reveal.tween_property(transition_overlay, "color", Color(0, 0, 0, 0), 0.4) await reveal.finished # Phase 1: Zoom in + fade in (parallel) # Node2D scale produces a true zoom, not just font-size growth. var zoom_in := create_tween() zoom_in.set_parallel(true) zoom_in.tween_property(zoom_node, "scale", Vector2(1.0, 1.0), 2.0).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) zoom_in.tween_property(zoom_node, "modulate", Color(1, 1, 1, 1), 1.8).set_ease(Tween.EASE_OUT) await zoom_in.finished # Phase 2: Hold await get_tree().create_timer(1.0).timeout # Phase 3: Fade out var fade_out := create_tween() fade_out.tween_property(zoom_node, "modulate", Color(1, 1, 1, 0), 0.8).set_ease(Tween.EASE_IN) await fade_out.finished # Phase 4: Crossfade to dashboard var to_black := create_tween() to_black.tween_property(transition_overlay, "color", Color(0, 0, 0, 1), 0.3) await to_black.finished var dashboard := preload("res://scenes/dashboard.tscn").instantiate() add_child(dashboard) var from_black := create_tween() from_black.tween_property(transition_overlay, "color", Color(0, 0, 0, 0), 0.6) await from_black.finished remove_child(dashboard) get_tree().root.add_child(dashboard) queue_free()