extends Node3D @onready var label = $CanvasLayer/Panel/Label @onready var player = $"../Player" @onready var balloons = $"../Objects/Balloons" var current_step = 0 var time_start = 0.0 var current_time_passed = 0.0 # Track which directions were used var walked = { "ui_left": false, "ui_right": false, "ui_up": false, "ui_down": false } # Track which directions were used var turned = { "cam_right": false, "cam_left": false } var steps = [ "TUTORIAL_STEP_0", "TUTORIAL_STEP_1", "TUTORIAL_STEP_2", "TUTORIAL_STEP_3", "TUTORIAL_STEP_4", "TUTORIAL_STEP_5", "TUTORIAL_STEP_6", ] func _ready(): time_start = Time.get_unix_time_from_system() update_label() $CanvasLayer/SubViewportContainer/SubViewport/helper/AnimationPlayer.play('happy') func _process(delta): check_time() match current_step: 0: check_walk_directions() 1: if Input.is_action_just_pressed("ui_accept"): #$"../Objects/Balloons".position.y = 6.0 next_step() 2: if Input.is_action_just_pressed("throw"): next_step() 3: if balloons.get_child_count() < 3: next_step() 4: if Input.is_action_just_pressed("grab") and player.grabbed_item: next_step() 5: if Input.is_action_just_pressed("drop"): next_step() 6: if player.dialogueActive: next_step() func check_walk_directions(): for action in walked.keys(): if Input.is_action_just_pressed(action): walked[action] = true if walked.values().all(func(v): return v): $"../Objects/Bridges/walls_tutorial/walls_to_bridge".queue_free() $"../Objects/Chip0/block".position.y = 0.0 $"../Objects/arrows/help1".position.y = 4.892 next_step() func check_camera_turned(): for action in turned.keys(): if Input.is_action_just_pressed(action): turned[action] = true if turned.values().all(func(v): return v): next_step() func next_step(): current_step += 1 time_start = Time.get_unix_time_from_system() $AnimationPlayer.play('RESET') $CanvasLayer/Panel.get_theme_stylebox('panel').border_color = Color('cccccc') $CanvasLayer/Panel.get_theme_stylebox('panel').border_width_left = 5 $CanvasLayer/Panel.get_theme_stylebox('panel').border_width_right = 5 $CanvasLayer/Panel.get_theme_stylebox('panel').border_width_top = 5 $CanvasLayer/Panel.get_theme_stylebox('panel').border_width_bottom = 5 $CanvasLayer/Panel.size.y = 150 update_label() func update_label(): if current_step < steps.size(): label.text = tr(steps[current_step]) await get_tree().process_frame var text_size = label.get_minimum_size() $CanvasLayer/Panel.custom_minimum_size = text_size + Vector2(40, 40) else: label.text = "" queue_free() func check_time() -> void: current_time_passed = Time.get_unix_time_from_system() - time_start if current_time_passed > 15.0: pulse_panel() func pulse_panel() -> void: $CanvasLayer/Panel.get_theme_stylebox('panel').border_color = Color('30e7f2') $CanvasLayer/Panel.get_theme_stylebox('panel').border_width_left = 8 $CanvasLayer/Panel.get_theme_stylebox('panel').border_width_right = 8 $CanvasLayer/Panel.get_theme_stylebox('panel').border_width_top = 8 $CanvasLayer/Panel.get_theme_stylebox('panel').border_width_bottom = 8 $AnimationPlayer.play('pulse')