[gd_scene load_steps=5 format=3 uid="uid://ccgnnif026wb4"] [ext_resource type="PackedScene" uid="uid://xd3nsiglcdfc" path="res://elements/timer.tscn" id="1_356j3"] [sub_resource type="GDScript" id="GDScript_8n212"] script/source = "extends Node var playing: bool = false var changing_level: bool = false var current_level_int: int = 0 var levels = [ preload(\"res://levels/base/level.tscn\"), preload(\"res://levels/forest/level.tscn\"), preload(\"res://levels/night/level.tscn\"), ] var area_resource = preload(\"res://menus/main/area.tscn\") @onready var timer := $GUI/Timer func _ready() -> void: var os_name = OS.get_name() if os_name == \"Web\": ## we can't quit the game on web $PauseMenu/VBoxContainer/Btn_Quit.hide() $VictoryScreen.hide() $Informations.hide() $PauseMenu.hide() ## Add the version of the game and the name of the OS to the footer of the start menu if OS.has_feature(\"editor\"): $DevInfos.text = \"dev \" $DevInfos.text += \"build \" + ProjectSettings.get_setting(\"application/config/version\") + \" (\" + os_name + \")\" launch_area() func launch_area(): Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) var area := area_resource.instantiate() area.connect(\"request_start\", start_game) $Levels.add_child(area) ## Get all the levels that are currently being played! ## In theory, there should ever be only zero or one, ## but it turns out it's more simple to handle things by using Arrays. func get_current_levels() -> Array[Level]: var children := $Levels.get_children(true) var current_levels: Array[Level] = [] for child in children: if is_instance_of(child, Level): current_levels.push_back(child) return current_levels func start_level(level_scene: PackedScene) -> void: $VictoryScreen.hide() var level = level_scene.instantiate() $Levels.add_child(level) level.connect(\"completed\", stop_level) playing = true PhysicsServer3D.area_set_param( get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY_VECTOR, Vector3.DOWN ) changing_level = false timer.seconds_spent_level_attempt = 0.0 timer.enabled = true func stop_level() -> void: timer.enabled = false PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 1) playing = false changing_level = true SaveFiles.change_property(\"played_for\", timer.seconds_spent_total, SaveFiles.selected_file) var current_levels = get_current_levels() for level in current_levels: level.music.fadeOut(2) await get_tree().create_timer(2).timeout level.queue_free() if len(levels) > current_level_int + 1: current_level_int += 1 start_level(levels[current_level_int]) else: win_game() func win_game() -> void: $VictoryScreen.show() await get_tree().create_timer(2).timeout launch_area() $VictoryScreen.hide() func restart_level() -> void: if changing_level == false: var current_levels = get_current_levels() if len(current_levels): pause_game() changing_level = true for level in current_levels: level.queue_free() start_level(levels[current_level_int]) func pause_game() -> void: SaveFiles.change_property(\"played_for\", timer.seconds_spent_total, SaveFiles.selected_file) if $Levels.process_mode == PROCESS_MODE_INHERIT: $Levels.process_mode = Node.PROCESS_MODE_DISABLED playing = false $PauseMenu.show() Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) else: $Levels.process_mode = Node.PROCESS_MODE_INHERIT playing = true $PauseMenu.hide() Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) func fullscreen_game() -> void: var fs = DisplayServer.window_get_mode() if fs != DisplayServer.WindowMode.WINDOW_MODE_FULLSCREEN: DisplayServer.window_set_mode(DisplayServer.WindowMode.WINDOW_MODE_FULLSCREEN) else: DisplayServer.window_set_mode(DisplayServer.WindowMode.WINDOW_MODE_WINDOWED) func start_game() -> void: current_level_int = 0 var current_levels = $Levels.get_children(true) for level in current_levels: level.queue_free() $Informations.show() Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) start_level(levels[0]) func _process(_delta: float) -> void: var current_levels = get_current_levels() if len(current_levels): var current_level = current_levels[0] $Informations/MarginContainer/VBoxContainer/Speed.text = str(int(floor(current_level.velocity))) + \" km/h\" $Informations/MarginContainer/VBoxContainer/Rings.text = str(current_level.finished_rings_count) + \"/\" + str(len(current_level.rings)) func _unhandled_key_input(event: InputEvent) -> void: if event.is_pressed() and event is InputEventKey: var current_levels := get_current_levels() if len(current_levels) and changing_level == false: if Input.is_action_just_pressed(\"pause_game\"): pause_game() elif Input.is_action_just_pressed(\"restart_level\"): pause_game() restart_level() func _on_btn_quit_pressed() -> void: get_tree().quit() " [sub_resource type="LabelSettings" id="LabelSettings_0s07t"] font_size = 32 outline_size = 10 outline_color = Color(0, 0, 0, 1) [sub_resource type="LabelSettings" id="LabelSettings_1bs00"] font_size = 160 outline_size = 20 outline_color = Color(0, 0, 0, 1) [node name="Game" type="Node"] script = SubResource("GDScript_8n212") [node name="GUI" type="MarginContainer" parent="."] offset_right = 201.0 offset_bottom = 104.0 rotation = 0.0523599 theme_override_constants/margin_left = 15 theme_override_constants/margin_top = 15 theme_override_constants/margin_right = 15 theme_override_constants/margin_bottom = 15 [node name="Timer" parent="GUI" instance=ExtResource("1_356j3")] layout_mode = 2 [node name="Informations" type="Control" parent="."] visible = false layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 1 [node name="MarginContainer" type="MarginContainer" parent="Informations"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 theme_override_constants/margin_left = 10 theme_override_constants/margin_right = 10 [node name="VBoxContainer" type="VBoxContainer" parent="Informations/MarginContainer"] layout_mode = 2 theme_override_constants/separation = -5 alignment = 2 [node name="Rings" type="Label" parent="Informations/MarginContainer/VBoxContainer"] layout_mode = 2 text = "0/0" label_settings = SubResource("LabelSettings_0s07t") horizontal_alignment = 2 vertical_alignment = 2 [node name="Speed" type="Label" parent="Informations/MarginContainer/VBoxContainer"] layout_mode = 2 text = "0 km/h" label_settings = SubResource("LabelSettings_0s07t") horizontal_alignment = 2 vertical_alignment = 2 [node name="VictoryScreen" type="Control" parent="."] layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 [node name="Label" type="Label" parent="VictoryScreen"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 text = "YOU WON!" label_settings = SubResource("LabelSettings_1bs00") horizontal_alignment = 1 vertical_alignment = 1 [node name="Levels" type="Node" parent="."] [node name="PauseMenu" type="Control" parent="."] visible = false z_index = 2 layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 1 [node name="ColorRect" type="ColorRect" parent="PauseMenu"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 color = Color(1, 0.54902, 1, 0.109804) [node name="VBoxContainer" type="VBoxContainer" parent="PauseMenu"] layout_mode = 1 anchors_preset = 14 anchor_top = 0.5 anchor_right = 1.0 anchor_bottom = 0.5 offset_top = -50.5 offset_bottom = 50.5 grow_horizontal = 2 grow_vertical = 2 theme_override_constants/separation = 10 [node name="Btn_Resume" type="Button" parent="PauseMenu/VBoxContainer"] layout_mode = 2 size_flags_vertical = 6 text = "RESUME game" [node name="Btn_Fullscreen2" type="Button" parent="PauseMenu/VBoxContainer"] layout_mode = 2 size_flags_vertical = 6 text = "Toggle FULLSCREEN" [node name="Btn_Restart" type="Button" parent="PauseMenu/VBoxContainer"] layout_mode = 2 size_flags_vertical = 6 text = "RESTART the level" [node name="Btn_Quit" type="Button" parent="PauseMenu/VBoxContainer"] layout_mode = 2 size_flags_vertical = 6 text = "QUIT game" [node name="DevInfos" type="Label" parent="."] anchors_preset = 12 anchor_top = 1.0 anchor_right = 1.0 anchor_bottom = 1.0 offset_top = -23.0 grow_horizontal = 2 grow_vertical = 0 horizontal_alignment = 1 [connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Resume" to="." method="pause_game"] [connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Fullscreen2" to="." method="fullscreen_game"] [connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Restart" to="." method="restart_level"] [connection signal="pressed" from="PauseMenu/VBoxContainer/Btn_Quit" to="." method="_on_btn_quit_pressed"]