diff --git a/design/interface-elements.svg b/design/interface-elements.svg
index ad88e17..5326275 100644
--- a/design/interface-elements.svg
+++ b/design/interface-elements.svg
@@ -24,9 +24,9 @@
inkscape:deskcolor="#505050"
inkscape:document-units="px"
showgrid="false"
- inkscape:zoom="0.457453"
- inkscape:cx="214.22966"
- inkscape:cy="1458.0733"
+ inkscape:zoom="5.1754899"
+ inkscape:cx="2917.5016"
+ inkscape:cy="69.751851"
inkscape:window-width="3840"
inkscape:window-height="2096"
inkscape:window-x="0"
@@ -47,7 +47,14 @@
id="page2415"
inkscape:export-filename="../src/logic-scenes/startup/start_frame.png"
inkscape:export-xdpi="96"
- inkscape:export-ydpi="96" />
+ transform="matrix(1.2490601,0,0,1,242.22248,8.1907649)" />
diff --git a/src/base-environments/volunteer_room/import/textures/volunteer_room.tscn b/src/base-environments/volunteer_room/volunteer_room.tscn
similarity index 96%
rename from src/base-environments/volunteer_room/import/textures/volunteer_room.tscn
rename to src/base-environments/volunteer_room/volunteer_room.tscn
index 39d813f..4823a36 100644
--- a/src/base-environments/volunteer_room/import/textures/volunteer_room.tscn
+++ b/src/base-environments/volunteer_room/volunteer_room.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=5 format=3 uid="uid://flisupth27th"]
-[ext_resource type="PackedScene" uid="uid://fcxu7diwgr4c" path="res://base-environments/volunteer_room/import/volunteer_room.glb" id="1_qf4mf"]
+[ext_resource type="PackedScene" uid="uid://fcxu7diwgr4c" path="res://base-environments/volunteer_room/import/volunteer_room.glb" id="1_o6q23"]
[sub_resource type="PhysicalSkyMaterial" id="PhysicalSkyMaterial_8h7yl"]
@@ -42,7 +42,7 @@ adjustment_enabled = true
[node name="Node3D" type="Node3D"]
-[node name="volunteer_room" parent="." instance=ExtResource("1_qf4mf")]
+[node name="volunteer_room" parent="." instance=ExtResource("1_o6q23")]
[node name="OmniLight3D2" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 6.70552e-08, 0, -6.70552e-08, 1, 1.8719, 1.58367, -5.11048)
diff --git a/src/import/interface-elements/loading_rect_clip.png b/src/import/interface-elements/loading_rect_clip.png
new file mode 100644
index 0000000..b128714
--- /dev/null
+++ b/src/import/interface-elements/loading_rect_clip.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c04d104283953a05f7b21cd91824c04a384d9a31aab78a6805ccef596368d4d7
+size 649
diff --git a/src/import/interface-elements/loading_rect_clip.png.import b/src/import/interface-elements/loading_rect_clip.png.import
new file mode 100644
index 0000000..54f5cf6
--- /dev/null
+++ b/src/import/interface-elements/loading_rect_clip.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d031kxe5m4ihh"
+path="res://.godot/imported/loading_rect_clip.png-d6c6f5676ae4dd43e8d3a04873327a56.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://import/interface-elements/loading_rect_clip.png"
+dest_files=["res://.godot/imported/loading_rect_clip.png-d6c6f5676ae4dd43e8d3a04873327a56.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/src/import/interface-elements/loading_rect_clippng b/src/import/interface-elements/loading_rect_clippng
new file mode 100644
index 0000000..89a81c9
Binary files /dev/null and b/src/import/interface-elements/loading_rect_clippng differ
diff --git a/src/import/interface-elements/loading_rect_deco.png b/src/import/interface-elements/loading_rect_deco.png
new file mode 100644
index 0000000..15c25bc
--- /dev/null
+++ b/src/import/interface-elements/loading_rect_deco.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:110584a273e501b1feb478457817bd86f55090084bf73174a91875dacbd18b39
+size 2061
diff --git a/src/import/interface-elements/loading_rect_deco.png.import b/src/import/interface-elements/loading_rect_deco.png.import
new file mode 100644
index 0000000..465077b
--- /dev/null
+++ b/src/import/interface-elements/loading_rect_deco.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dpftqdvtrkioh"
+path="res://.godot/imported/loading_rect_deco.png-0a6f5c768c825bbd169367e1ed426907.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://import/interface-elements/loading_rect_deco.png"
+dest_files=["res://.godot/imported/loading_rect_deco.png-0a6f5c768c825bbd169367e1ed426907.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/src/import/interface-elements/loading_rect_frame.png b/src/import/interface-elements/loading_rect_frame.png
new file mode 100644
index 0000000..d46a53c
--- /dev/null
+++ b/src/import/interface-elements/loading_rect_frame.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90f5409fa4e45db0eea504ea178338fdb0ad36da0a8aad6cf83dcfd6405be375
+size 632
diff --git a/src/import/interface-elements/loading_rect_frame.png.import b/src/import/interface-elements/loading_rect_frame.png.import
new file mode 100644
index 0000000..52ad8e6
--- /dev/null
+++ b/src/import/interface-elements/loading_rect_frame.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bqf82f8dk4yun"
+path="res://.godot/imported/loading_rect_frame.png-165c087a2ed93fd586d0158dd66f4cfc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://import/interface-elements/loading_rect_frame.png"
+dest_files=["res://.godot/imported/loading_rect_frame.png-165c087a2ed93fd586d0158dd66f4cfc.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/src/logic-scenes/themes/system.theme b/src/logic-scenes/themes/system.theme
index d0d4da9..3c5444b 100644
Binary files a/src/logic-scenes/themes/system.theme and b/src/logic-scenes/themes/system.theme differ
diff --git a/src/main.gd b/src/main.gd
index 84f122f..a7aac2b 100644
--- a/src/main.gd
+++ b/src/main.gd
@@ -1,9 +1,39 @@
extends Node3D
+@export_file(".tscn") var youth_room_path: String
+@export_file(".tscn") var voluntary_room: String
+@export_file(".tscn") var study_room: String
+
+@onready var loading_player: AnimationPlayer = %MenuAnimationPlayer
+
+var last_progress_state: float = 0
+var current_loaded_room: Node3D
+var currently_loading_room: String = "":
+ set(path):
+ if path != "":
+ ResourceLoader.load_threaded_request(path, "PackedScene")
+ currently_loading_room = path
+ last_progress_state
+ loading_player.queue("loading")
+ else:
+ loading_player.queue("loading_done")
+
# Called when the node enters the scene tree for the first time.
func _ready():
- pass # Replace with function body.
+ currently_loading_room = youth_room_path
+
+func _process(delta: float) -> void:
+ if currently_loading_room != "":
+ var progress:Array
+ if ResourceLoader.load_threaded_get_status(youth_room_path, progress) == 3:
+ current_loaded_room = ResourceLoader.load_threaded_get(youth_room_path).instantiate()
+ add_child(current_loaded_room)
+ move_child(current_loaded_room, 0)
+ currently_loading_room = ""
+ elif last_progress_state != progress[0]:
+ loading_player.seek(progress[0])
+ last_progress_state = progress[0]
func debug_youth():
get_child(1).hide()
@@ -11,7 +41,3 @@ func debug_youth():
get_child(3).hide()
get_child(0).get_ready()
get_child(0).start()
-
-# Called every frame. 'delta' is the elapsed time since the previous frame.
-func _process(delta):
- pass
diff --git a/src/main.tscn b/src/main.tscn
index bcc29d3..a147bdc 100644
--- a/src/main.tscn
+++ b/src/main.tscn
@@ -1,10 +1,15 @@
-[gd_scene load_steps=7 format=3 uid="uid://befxf8uruwnrl"]
+[gd_scene load_steps=20 format=3 uid="uid://befxf8uruwnrl"]
[ext_resource type="Script" path="res://main.gd" id="1_rqkns"]
[ext_resource type="PackedScene" uid="uid://gldtxysavetf" path="res://logic-scenes/startup/startup.tscn" id="1_v5rpm"]
-[ext_resource type="PackedScene" uid="uid://b3b0gyvklqn50" path="res://base-environments/youth_room/youth_room.tscn" id="2_23ia3"]
[ext_resource type="PackedScene" uid="uid://b51wdql4mby47" path="res://main_menu.tscn" id="3_ik73t"]
+[ext_resource type="Texture2D" uid="uid://d031kxe5m4ihh" path="res://import/interface-elements/loading_rect_clip.png" id="5_sr555"]
+[ext_resource type="Texture2D" uid="uid://bqf82f8dk4yun" path="res://import/interface-elements/loading_rect_frame.png" id="6_aaaxa"]
+[ext_resource type="Texture2D" uid="uid://dpftqdvtrkioh" path="res://import/interface-elements/loading_rect_deco.png" id="7_koraw"]
[ext_resource type="PackedScene" uid="uid://6aaxpvoepqrm" path="res://disclaimer.tscn" id="7_t45fc"]
+[ext_resource type="Script" path="res://logic-scenes/main menu/save_game_list.gd" id="8_jecj3"]
+[ext_resource type="Script" path="res://dev-util/savegame.gd" id="9_7v45a"]
+[ext_resource type="Texture2D" uid="uid://bk5ja14r7r6i4" path="res://import/interface-elements/empty_save_slot.png" id="10_l87ac"]
[sub_resource type="GDScript" id="GDScript_8sq0u"]
script/source = "extends Label
@@ -13,10 +18,282 @@ func _process(_delta):
text = str(Engine.get_frames_per_second())
"
-[node name="root" type="Node3D"]
-script = ExtResource("1_rqkns")
+[sub_resource type="Animation" id="Animation_y6s08"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath(".:modulate")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(1, 1, 1, 0)]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath(".:rotation")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [1.5708]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("frame/deco:rotation")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [-0.314159]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("frame/deco:modulate")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(1, 1, 1, 0)]
+}
+tracks/4/type = "value"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("../../Panel:modulate")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(0, 0, 0, 1)]
+}
+tracks/5/type = "value"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("../../Main Menu:modulate")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(1, 1, 1, 1)]
+}
-[node name="youth room" parent="." instance=ExtResource("2_23ia3")]
+[sub_resource type="Animation" id="Animation_l5ynk"]
+resource_name = "init"
+length = 0.5
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("../../Panel:modulate")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 0.5),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(0, 0, 0, 1), Color(1, 1, 1, 1)]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("../../Main Menu:modulate")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0, 0.166667),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
+}
+
+[sub_resource type="Animation" id="Animation_k667j"]
+resource_name = "loading"
+length = 2.0
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath(".:modulate")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 0.166667),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath(".:rotation")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0.0333333, 1.76667),
+"transitions": PackedFloat32Array(0.406126, 1),
+"update": 0,
+"values": [1.5708, 0.261799]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("frame/deco:rotation")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0.0333368, 1.76667),
+"transitions": PackedFloat32Array(0.406126, 1),
+"update": 0,
+"values": [-1.5708, -0.261799]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("frame/deco:modulate")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0.366667, 1.66667),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
+}
+
+[sub_resource type="Animation" id="Animation_nuxr6"]
+resource_name = "loading_done"
+length = 1.5
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath(".:rotation")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 1.4),
+"transitions": PackedFloat32Array(2.2974, 1),
+"update": 0,
+"values": [0.261799, -1.5708]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("frame/deco:rotation")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0, 1.4),
+"transitions": PackedFloat32Array(2.2974, 1),
+"update": 0,
+"values": [-0.261799, 1.5708]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath(".:modulate")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0.933333, 1.36667),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("../../Panel:modulate")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0.566667, 1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_ogbs1"]
+_data = {
+"RESET": SubResource("Animation_y6s08"),
+"init": SubResource("Animation_l5ynk"),
+"loading": SubResource("Animation_k667j"),
+"loading_done": SubResource("Animation_nuxr6")
+}
+
+[sub_resource type="Resource" id="Resource_u1xhm"]
+script = ExtResource("9_7v45a")
+current_room = 0
+mementos_complete = 0
+thumbnail = ExtResource("10_l87ac")
+last_saved = {
+"day": 1,
+"dst": true,
+"hour": 15,
+"minute": 7,
+"month": 10,
+"second": 31,
+"weekday": 2,
+"year": 2024
+}
+
+[sub_resource type="Resource" id="Resource_2d1xt"]
+script = ExtResource("9_7v45a")
+current_room = 0
+mementos_complete = 0
+thumbnail = ExtResource("10_l87ac")
+last_saved = {
+"day": 1,
+"dst": true,
+"hour": 15,
+"minute": 7,
+"month": 10,
+"second": 31,
+"weekday": 2,
+"year": 2024
+}
+
+[sub_resource type="Resource" id="Resource_slmss"]
+script = ExtResource("9_7v45a")
+current_room = 0
+mementos_complete = 0
+thumbnail = ExtResource("10_l87ac")
+last_saved = {
+"day": 1,
+"dst": true,
+"hour": 15,
+"minute": 7,
+"month": 10,
+"second": 31,
+"weekday": 2,
+"year": 2024
+}
+
+[node name="main" type="Node3D"]
+script = ExtResource("1_rqkns")
+youth_room_path = "res://base-environments/youth_room/youth_room.tscn"
+voluntary_room = "res://base-environments/volunteer_room/volunteer_room.tscn"
+
+[node name="Panel" type="Panel" parent="."]
+modulate = Color(0, 0, 0, 1)
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
[node name="Main Menu" parent="." instance=ExtResource("3_ik73t")]
@@ -31,4 +308,49 @@ visible = false
[node name="Disclaimer" parent="." instance=ExtResource("7_t45fc")]
visible = false
+[node name="Control" type="Control" parent="."]
+layout_mode = 3
+anchors_preset = 2
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_top = -40.0
+offset_right = 40.0
+grow_vertical = 0
+
+[node name="mask" type="Sprite2D" parent="Control"]
+modulate = Color(1, 1, 1, 0)
+clip_children = 1
+position = Vector2(98, -47)
+rotation = 1.5708
+texture = ExtResource("5_sr555")
+
+[node name="frame" type="Sprite2D" parent="Control/mask"]
+clip_children = 1
+texture = ExtResource("6_aaaxa")
+
+[node name="deco" type="Sprite2D" parent="Control/mask/frame"]
+modulate = Color(1, 1, 1, 0)
+rotation = -0.314159
+texture = ExtResource("7_koraw")
+
+[node name="MenuAnimationPlayer" type="AnimationPlayer" parent="."]
+unique_name_in_owner = true
+root_node = NodePath("../Control/mask")
+libraries = {
+"": SubResource("AnimationLibrary_ogbs1")
+}
+autoplay = "init"
+
+[node name="SaveGameHandle" type="CenterContainer" parent="."]
+visible = false
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("8_jecj3")
+save_1 = SubResource("Resource_u1xhm")
+save_2 = SubResource("Resource_2d1xt")
+save_3 = SubResource("Resource_slmss")
+
[connection signal="on_read" from="Disclaimer" to="Startup Menu" method="starting"]