feat(core): implement room navigation, character states, save/load and settings menu

- RoomNavigator autoload: smooth camera pan between floors
- Floor1 and Floor2 placeholder rooms with elevator buttons
- CharacterData Resource with State enum (HEALTHY/SICK/SLEEPING/TIRED)
- Character visual state feedback via ColorRect color
- Main scene loads saved state on startup
- SettingsMenu with music/sfx sliders and game reset
- HUD settings button to open SettingsMenu

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Steven Wroblewski
2026-04-17 12:17:56 +02:00
parent ace7d722ed
commit 13db45bb04
12 changed files with 402 additions and 9 deletions

View File

@@ -1,23 +1,101 @@
[gd_scene load_steps=4 format=3 uid="uid://cozypaw_main"]
[gd_scene load_steps=8 format=3 uid="uid://cozypaw_main"]
[ext_resource type="PackedScene" path="res://scenes/rooms/floor0/Reception.tscn" id="1_reception"]
[ext_resource type="PackedScene" path="res://scenes/characters/Character.tscn" id="2_char"]
[ext_resource type="PackedScene" path="res://scenes/ui/HUD.tscn" id="3_hud"]
[ext_resource type="Script" path="res://scripts/main/main.gd" id="1_main"]
[ext_resource type="PackedScene" path="res://scenes/rooms/floor0/Reception.tscn" id="2_reception"]
[ext_resource type="PackedScene" path="res://scenes/characters/Character.tscn" id="3_char"]
[ext_resource type="PackedScene" path="res://scenes/ui/HUD.tscn" id="4_hud"]
[ext_resource type="PackedScene" path="res://scenes/ui/SettingsMenu.tscn" id="5_settings"]
[ext_resource type="PackedScene" path="res://scenes/objects/ElevatorButton.tscn" id="6_elevbtn"]
[sub_resource type="CharacterData" id="CharacterData_bunny1"]
id = "bunny_01"
display_name = "Bunny"
species = 0
state = 0
current_floor = 0
position = Vector2(0, 0)
[node name="Main" type="Node2D"]
script = ExtResource("1_main")
[node name="Camera2D" type="Camera2D" parent="."]
position = Vector2(640, 360)
zoom = Vector2(1, 1)
[node name="Hospital" type="Node2D" parent="."]
[node name="Floor0" type="Node2D" parent="Hospital"]
[node name="Reception" parent="Hospital/Floor0" instance=ExtResource("1_reception")]
position = Vector2(0, 0)
[node name="Reception" parent="Hospital/Floor0" instance=ExtResource("2_reception")]
position = Vector2(0, 0)
[node name="ElevatorUp0" parent="Hospital/Floor0" instance=ExtResource("6_elevbtn")]
position = Vector2(1200, 360)
target_floor = 1
[node name="Floor1" type="Node2D" parent="Hospital"]
position = Vector2(0, -720)
[node name="Background" type="ColorRect" parent="Hospital/Floor1"]
color = Color(0.78, 0.88, 0.96, 1)
size = Vector2(1280, 720)
position = Vector2(0, 0)
[node name="FloorLabel" type="Label" parent="Hospital/Floor1"]
offset_left = 560.0
offset_top = 300.0
offset_right = 720.0
offset_bottom = 360.0
text = "1. OG"
theme_override_font_sizes/font_size = 32
[node name="FloorRect" type="ColorRect" parent="Hospital/Floor1"]
color = Color(0.88, 0.80, 0.68, 1)
size = Vector2(1280, 100)
position = Vector2(0, 620)
[node name="ElevatorDown1" parent="Hospital/Floor1" instance=ExtResource("6_elevbtn")]
position = Vector2(1200, 540)
target_floor = 0
[node name="ElevatorUp1" parent="Hospital/Floor1" instance=ExtResource("6_elevbtn")]
position = Vector2(1200, 180)
target_floor = 2
[node name="Floor2" type="Node2D" parent="Hospital"]
position = Vector2(0, -1440)
[node name="Background" type="ColorRect" parent="Hospital/Floor2"]
color = Color(0.96, 0.88, 0.96, 1)
size = Vector2(1280, 720)
position = Vector2(0, 0)
[node name="FloorLabel" type="Label" parent="Hospital/Floor2"]
offset_left = 560.0
offset_top = 300.0
offset_right = 720.0
offset_bottom = 360.0
text = "2. OG"
theme_override_font_sizes/font_size = 32
[node name="FloorRect" type="ColorRect" parent="Hospital/Floor2"]
color = Color(0.88, 0.80, 0.68, 1)
size = Vector2(1280, 100)
position = Vector2(0, 620)
[node name="ElevatorDown2" parent="Hospital/Floor2" instance=ExtResource("6_elevbtn")]
position = Vector2(1200, 360)
target_floor = 1
[node name="Characters" type="Node2D" parent="."]
[node name="Bunny1" parent="Characters" instance=ExtResource("2_char")]
[node name="Bunny1" parent="Characters" instance=ExtResource("3_char")]
position = Vector2(300, 400)
data = SubResource("CharacterData_bunny1")
[node name="UI" type="CanvasLayer" parent="."]
[node name="HUD" parent="UI" instance=ExtResource("3_hud")]
[node name="HUD" parent="UI" instance=ExtResource("4_hud")]
[node name="SettingsMenu" parent="UI" instance=ExtResource("5_settings")]

View File

@@ -0,0 +1,29 @@
[gd_scene load_steps=3 format=3 uid="uid://cozypaw_elevator_btn"]
[ext_resource type="Script" path="res://scripts/objects/elevator_button.gd" id="1_elevbtn"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_elevbtn"]
size = Vector2(80, 80)
[node name="ElevatorButton" type="Node2D"]
script = ExtResource("1_elevbtn")
[node name="Visual" type="ColorRect" parent="."]
color = Color(0.95, 0.75, 0.3, 1)
size = Vector2(80, 80)
position = Vector2(-40, -40)
[node name="Label" type="Label" parent="Visual"]
offset_left = 0.0
offset_top = 0.0
offset_right = 80.0
offset_bottom = 80.0
horizontal_alignment = 1
vertical_alignment = 1
text = "▲"
[node name="CollisionArea" type="Area2D" parent="."]
input_pickable = true
[node name="CollisionShape" type="CollisionShape2D" parent="CollisionArea"]
shape = SubResource("RectangleShape2D_elevbtn")

View File

@@ -31,5 +31,19 @@ offset_bottom = 80.0
text = "♪"
flat = false
[node name="SettingsButton" type="Button" parent="."]
anchors_preset = 1
anchor_left = 1.0
anchor_top = 0.0
anchor_right = 1.0
anchor_bottom = 0.0
offset_left = -160.0
offset_top = 16.0
offset_right = -96.0
offset_bottom = 80.0
text = "⚙"
flat = false
[connection signal="pressed" from="BackButton" to="." method="_on_back_button_pressed"]
[connection signal="pressed" from="MusicToggle" to="." method="_on_music_toggle_pressed"]
[connection signal="pressed" from="SettingsButton" to="." method="_on_settings_button_pressed"]

103
scenes/ui/SettingsMenu.tscn Normal file
View File

@@ -0,0 +1,103 @@
[gd_scene load_steps=2 format=3 uid="uid://cozypaw_settings"]
[ext_resource type="Script" path="res://scripts/systems/settings_menu.gd" id="1_settings"]
[node name="SettingsMenu" type="CanvasLayer"]
script = ExtResource("1_settings")
visible = false
[node name="Backdrop" type="ColorRect" parent="."]
color = Color(0, 0, 0, 0.7)
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 0.0
offset_top = 0.0
offset_right = 0.0
offset_bottom = 0.0
grow_horizontal = 2
grow_vertical = 2
[node name="Panel" type="Panel" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -200.0
offset_top = -150.0
offset_right = 200.0
offset_bottom = 150.0
grow_horizontal = 2
grow_vertical = 2
[node name="Title" type="Label" parent="Panel"]
offset_left = 0.0
offset_top = 16.0
offset_right = 400.0
offset_bottom = 64.0
horizontal_alignment = 1
text = "⚙"
theme_override_font_sizes/font_size = 32
[node name="MusicLabel" type="Label" parent="Panel"]
offset_left = 24.0
offset_top = 76.0
offset_right = 80.0
offset_bottom = 108.0
text = "♪"
theme_override_font_sizes/font_size = 24
[node name="MusicSlider" type="HSlider" parent="Panel"]
min_value = 0.0
max_value = 1.0
step = 0.05
value = 0.6
offset_left = 88.0
offset_top = 76.0
offset_right = 376.0
offset_bottom = 108.0
[node name="SfxLabel" type="Label" parent="Panel"]
offset_left = 24.0
offset_top = 120.0
offset_right = 80.0
offset_bottom = 152.0
text = "🔊"
theme_override_font_sizes/font_size = 24
[node name="SfxSlider" type="HSlider" parent="Panel"]
min_value = 0.0
max_value = 1.0
step = 0.05
value = 1.0
offset_left = 88.0
offset_top = 120.0
offset_right = 376.0
offset_bottom = 152.0
[node name="ResetButton" type="Button" parent="Panel"]
offset_left = 24.0
offset_top = 172.0
offset_right = 88.0
offset_bottom = 236.0
text = "↺"
theme_override_font_sizes/font_size = 28
[node name="ResetConfirmDialog" type="ConfirmationDialog" parent="Panel"]
title = "Reset?"
dialog_text = "Spielstand löschen?"
[node name="CloseButton" type="Button" parent="Panel"]
offset_left = 312.0
offset_top = 172.0
offset_right = 376.0
offset_bottom = 236.0
text = "✕"
theme_override_font_sizes/font_size = 28
[connection signal="value_changed" from="Panel/MusicSlider" to="." method="_on_music_slider_value_changed"]
[connection signal="value_changed" from="Panel/SfxSlider" to="." method="_on_sfx_slider_value_changed"]
[connection signal="pressed" from="Panel/ResetButton" to="." method="_on_reset_button_pressed"]
[connection signal="confirmed" from="Panel/ResetConfirmDialog" to="." method="_on_reset_confirmed"]
[connection signal="pressed" from="Panel/CloseButton" to="." method="_on_close_button_pressed"]