328 lines
9.6 KiB
Text
328 lines
9.6 KiB
Text
[gd_scene load_steps=6 format=3 uid="uid://ccgnnif026wb4"]
|
|
|
|
[ext_resource type="PackedScene" uid="uid://xd3nsiglcdfc" path="res://gui/timer.tscn" id="1_356j3"]
|
|
[ext_resource type="PackedScene" uid="uid://cckeamgkt8bqo" path="res://gui/speed.tscn" id="2_2gn6w"]
|
|
|
|
[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/TopLeft/Timer
|
|
@onready var speed := $GUI/TopRight/Speed
|
|
|
|
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 save_file_data = SaveFiles.read(SaveFiles.selected_file)
|
|
var property_name := \"best_time_for_level_\" + str(current_level_int)
|
|
if !save_file_data.has(property_name) or save_file_data[property_name] is not float or save_file_data[property_name] > timer.seconds_spent_level_attempt:
|
|
SaveFiles.change_property(property_name, timer.seconds_spent_level_attempt, 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]
|
|
speed.ball_velocity = current_level.velocity
|
|
$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="Control" parent="."]
|
|
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="TopLeft" type="MarginContainer" parent="GUI"]
|
|
layout_mode = 1
|
|
offset_right = 160.0
|
|
offset_bottom = 85.0
|
|
rotation = 0.0523599
|
|
theme_override_constants/margin_left = 15
|
|
|
|
[node name="Timer" parent="GUI/TopLeft" instance=ExtResource("1_356j3")]
|
|
layout_mode = 2
|
|
|
|
[node name="TopRight" type="MarginContainer" parent="GUI"]
|
|
layout_mode = 1
|
|
anchors_preset = 1
|
|
anchor_left = 1.0
|
|
anchor_right = 1.0
|
|
offset_left = -106.0
|
|
offset_bottom = 51.0
|
|
grow_horizontal = 0
|
|
rotation = -0.0523599
|
|
theme_override_constants/margin_top = 5
|
|
theme_override_constants/margin_right = 15
|
|
|
|
[node name="Speed" parent="GUI/TopRight" instance=ExtResource("2_2gn6w")]
|
|
layout_mode = 2
|
|
|
|
[node name="Informations" type="Control" parent="."]
|
|
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="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"]
|