This commit is contained in:
2026-02-23 11:37:27 +01:00
commit 13dbb551c8
94 changed files with 2682 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
[gd_resource type="AudioBusLayout" format=3 uid="uid://cxjrus2g7oh0t"]
[resource]
bus/1/name = &"Music"
bus/1/solo = false
bus/1/mute = false
bus/1/bypass_fx = false
bus/1/volume_db = 0.0
bus/1/send = &"Master"
bus/2/name = &"SFX"
bus/2/solo = false
bus/2/mute = false
bus/2/bypass_fx = false
bus/2/volume_db = 0.0
bus/2/send = &"Master"
bus/3/name = &"Voice"
bus/3/solo = false
bus/3/mute = false
bus/3/bypass_fx = false
bus/3/volume_db = 0.0
bus/3/send = &"Master"

View File

@@ -0,0 +1,184 @@
extends Node
class_name GameManager
## Use this when you have only one level
@export var main_level: PackedScene
## Whether the mouse should be captured while in a level
@export var is_mouse_captured_in_level: bool = true
@export_subgroup("Level Loading")
## Whether your game contains multiple levels.
## Uncheck if you only have one "Level" in your game
## If disabled, no level select option will be given in the title screen
@export var has_multiple_levels: bool = true
## The number of the highest level. For 1 Level this is 1
@export var max_level: int = 0
## Formatable Strig pointing to
@export var level_location = "res://levels/level_%s.tscn"
@onready var pause_menu: Control = %PauseMenu
@onready var menu_layer: CanvasLayer = %MenuLayer
var level = 0
var completed_levels: Array[bool] = []
var current_level_node: Node
func _ready() -> void:
Global.set_game_manager(self)
DebugGlobal.debug_label = %DebugLabel
for i in range(max_level):
completed_levels.append(false)
# Settings
var user_settings = UserDefinedSettings.new()
user_settings._register_settings()
Settings.load_config()
# Connect to InputManager
InputManager.game_pause.connect(pause)
InputManager.game_unpause.connect(resume)
InputManager.capture_mouse_ingame = is_mouse_captured_in_level
InputManager.set_is_in_game(false)
InputManager.set_is_paused(false)
_show_title_screen()
func _start_game() -> void:
level = 0
_show_controls()
#region Pausing
func pause():
InputManager.set_is_paused(true)
move_child(menu_layer, -1)
pause_menu.move_to_front()
pause_menu.show()
get_tree().paused = true
func resume():
InputManager.set_is_paused(false)
print("resume")
pause_menu.hide()
pause_menu.reset()
get_tree().paused = false
#endregion
#region Level Loading
func _unload_current_level() -> void:
if current_level_node != null:
current_level_node.queue_free()
current_level_node = null
func _show_main_level() -> void:
if main_level == null:
push_error("main_level is not set in GameManager")
return
InputManager.set_is_in_game(true)
var next_level: Node = main_level.instantiate()
if next_level.has_signal("win"):
next_level.win.connect(_next_level)
if next_level.has_signal("reset"):
next_level.reset.connect(_reload_current_level)
add_child(next_level)
current_level_node = next_level
func _next_level() -> void:
_unload_current_level()
if level < max_level and max_level > 0:
InputManager.set_is_in_game(true)
level += 1
_show_level(level)
completed_levels[level - 1] = true
else:
_show_win_screen()
func _show_level(level_nr: int) -> void:
# Clean up previous level if it exists (when coming from level select)
_unload_current_level()
InputManager.set_is_in_game(true)
level = level_nr
var next_level = load(level_location % str(level)).instantiate()
if next_level.has_signal("win"):
next_level.win.connect(_next_level)
if next_level.has_signal("reset"):
next_level.reset.connect(_reload_current_level)
add_child(next_level)
current_level_node = next_level
func _reload_current_level() -> void:
_unload_current_level()
if has_multiple_levels:
_show_level(level)
else:
_show_main_level()
#endregion
#region Showing Different GUI views
func _show_win_screen() -> void:
InputManager.set_is_in_game(false)
var win_screen: Control = load("res://ui/screens/win-screen/win_screen.tscn").instantiate()
win_screen.tree_exited.connect(_show_title_screen)
add_child(win_screen)
func _show_credits() -> void:
var credits: Node = load("res://ui/screens/credit-screen/credit_screen.tscn").instantiate()
credits.tree_exited.connect(_show_title_screen)
menu_layer.add_child(credits)
func _show_title_screen() -> void:
InputManager.set_is_in_game(false)
var title_screen: Node = load("res://ui/screens/title-screen/title_screen.tscn").instantiate()
title_screen.start_game.connect(_start_game)
title_screen.show_credits.connect(_show_credits)
title_screen.show_level_select.connect(_show_level_select)
title_screen.show_settings_screen.connect(_show_settings_screen)
title_screen.quit.connect(_quit_game)
title_screen.show_levels(has_multiple_levels)
menu_layer.add_child(title_screen)
func _show_level_select() -> void:
var level_select: Node = load("res://ui/screens/level-select-screen/level_select.tscn").instantiate()
level_select.start_level.connect(_show_level)
level_select.exit.connect(_show_title_screen)
level_select.init_buttons(max_level, completed_levels)
menu_layer.add_child(level_select)
func _show_settings_screen() -> void:
var settings_screen: Node = load("res://ui/screens/settings-screen/settings_screen.tscn").instantiate()
settings_screen.exit.connect(_show_title_screen)
menu_layer.add_child(settings_screen)
func _show_controls() -> void:
var controls: Node = load("res://ui/screens/control-screen/control_screen.tscn").instantiate()
if not main_level:
controls.tree_exited.connect(_next_level)
else:
controls.tree_exited.connect(_show_main_level)
menu_layer.add_child(controls)
func _return_to_title_screen() -> void:
get_tree().paused = false
InputManager.set_is_paused(false)
InputManager.set_is_in_game(false)
# Destroy level
if current_level_node != null:
current_level_node.queue_free()
current_level_node = null
_show_title_screen()
#endregion
func _quit_game() -> void:
get_tree().paused = false
get_tree().quit()
func set_world_environment(env: Environment):
$WorldEnvironment.environment = env

View File

@@ -0,0 +1 @@
uid://cluu0cgltsenj

View File

@@ -0,0 +1,36 @@
[gd_scene format=3 uid="uid://cgu0vbr50x7di"]
[ext_resource type="Script" uid="uid://cluu0cgltsenj" path="res://core/gamemanager.gd" id="1_htktm"]
[ext_resource type="PackedScene" uid="uid://bilai15byqef2" path="res://ui/screens/pause-menu/pause_menu.tscn" id="2_b2lg8"]
[ext_resource type="Environment" uid="uid://bhb4ckqipjvu3" path="res://core/main_environment.tres" id="2_v1n10"]
[ext_resource type="PackedScene" uid="uid://cyfvcuxi210mg" path="res://levels/main_level.tscn" id="2_xueuq"]
[ext_resource type="Theme" uid="uid://hheneshfv1b2" path="res://ui/themes/your_theme.tres" id="3_8qpx4"]
[node name="Gamemanager" type="Node" unique_id=1050225795]
process_mode = 3
script = ExtResource("1_htktm")
main_level = ExtResource("2_xueuq")
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=224925465]
environment = ExtResource("2_v1n10")
[node name="MenuLayer" type="CanvasLayer" parent="." unique_id=1393391734]
unique_name_in_owner = true
[node name="DebugLabel" type="Label" parent="MenuLayer" unique_id=2133776147]
unique_name_in_owner = true
visible = false
offset_left = 23.0
offset_top = 16.0
offset_right = 600.0
offset_bottom = 308.0
theme = ExtResource("3_8qpx4")
[node name="PauseMenu" parent="MenuLayer" unique_id=912678162 instance=ExtResource("2_b2lg8")]
unique_name_in_owner = true
visible = false
theme = ExtResource("3_8qpx4")
[connection signal="continue_btn_pressed" from="MenuLayer/PauseMenu" to="." method="resume"]
[connection signal="exit_game_btn_pressed" from="MenuLayer/PauseMenu" to="." method="_quit_game"]
[connection signal="exit_to_main_menu_btn_pressed" from="MenuLayer/PauseMenu" to="." method="_return_to_title_screen"]

View File

@@ -0,0 +1,15 @@
[gd_resource type="Environment" format=3 uid="uid://bhb4ckqipjvu3"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_e3rlx"]
sky_top_color = Color(0.218052, 0.202335, 0.225589, 1)
sky_horizon_color = Color(0.227003, 0.231896, 0.228184, 1)
ground_bottom_color = Color(0.167509, 0.160179, 0.160062, 1)
ground_horizon_color = Color(0.175353, 0.180521, 0.188678, 1)
[sub_resource type="Sky" id="Sky_n0kbt"]
sky_material = SubResource("ProceduralSkyMaterial_e3rlx")
[resource]
sky = SubResource("Sky_n0kbt")
tonemap_mode = 3
glow_enabled = true