fixed saving & added first basic save creation menu

This commit is contained in:
2025-10-15 05:36:33 +02:00
parent 283e3cbb5a
commit f87cc28c57
12 changed files with 155 additions and 28 deletions

View File

@@ -12,4 +12,5 @@ anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
mouse_filter = 2
color = Color(0, 0, 0, 1) color = Color(0, 0, 0, 1)

View File

@@ -12,11 +12,12 @@ shader_parameter/limit_subpixels = true
[node name="Pixelize" type="CanvasLayer"] [node name="Pixelize" type="CanvasLayer"]
[node name="ColorRect" type="ColorRect" parent="."] [node name="ColorRect" type="ColorRect" parent="."]
visible = false
material = SubResource("ShaderMaterial_83vy4") material = SubResource("ShaderMaterial_83vy4")
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
mouse_filter = 1 mouse_filter = 2
metadata/_edit_lock_ = true metadata/_edit_lock_ = true

View File

@@ -1,6 +1,7 @@
[gd_scene load_steps=2 format=3 uid="uid://dgq21ggr3br2g"] [gd_scene load_steps=3 format=3 uid="uid://dgq21ggr3br2g"]
[ext_resource type="Script" uid="uid://bfgqkpn60hhwj" path="res://scripts/menus/main_menu.gd" id="1_xqga4"] [ext_resource type="Script" uid="uid://bfgqkpn60hhwj" path="res://scripts/menus/main_menu.gd" id="1_xqga4"]
[ext_resource type="PackedScene" uid="uid://cd657k2lc3gyc" path="res://scenes/menus/profile_creator.tscn" id="2_ovrgc"]
[node name="MainMenu" type="Control"] [node name="MainMenu" type="Control"]
layout_mode = 3 layout_mode = 3
@@ -11,7 +12,22 @@ grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
script = ExtResource("1_xqga4") script = ExtResource("1_xqga4")
[node name="VBoxContainer" type="VBoxContainer" parent="."] [node name="TabContainer" type="TabContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
current_tab = 0
tabs_visible = false
drag_to_rearrange_enabled = true
[node name="Main" type="Control" parent="TabContainer"]
layout_mode = 2
metadata/_tab_index = 0
[node name="VBoxContainer" type="VBoxContainer" parent="TabContainer/Main"]
layout_mode = 1 layout_mode = 1
anchors_preset = 8 anchors_preset = 8
anchor_left = 0.5 anchor_left = 0.5
@@ -25,11 +41,15 @@ offset_bottom = 20.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
[node name="Button" type="Button" parent="VBoxContainer"] [node name="Button" type="Button" parent="TabContainer/Main/VBoxContainer"]
layout_mode = 2 layout_mode = 2
theme_override_font_sizes/font_size = 8 theme_override_font_sizes/font_size = 8
text = "Start" text = "Start"
[node name="MenuSlot" type="CanvasLayer" parent="."] [node name="ProfileCreator" parent="TabContainer" instance=ExtResource("2_ovrgc")]
visible = false
layout_mode = 2
metadata/_tab_index = 1
[connection signal="pressed" from="VBoxContainer/Button" to="." method="_on_start_button_pressed"] [connection signal="pressed" from="TabContainer/Main/VBoxContainer/Button" to="." method="_on_start_button_pressed"]
[connection signal="exit" from="TabContainer/ProfileCreator" to="." method="_on_profile_creator_exit"]

View File

@@ -10,3 +10,49 @@ anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
script = ExtResource("1_4xjd5") script = ExtResource("1_4xjd5")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -74.0
offset_top = -21.5
offset_right = 74.0
offset_bottom = 21.5
grow_horizontal = 2
grow_vertical = 2
[node name="LineEdit" type="LineEdit" parent="VBoxContainer"]
layout_mode = 2
placeholder_text = "Name him"
editable = false
context_menu_enabled = false
emoji_menu_enabled = false
virtual_keyboard_enabled = false
virtual_keyboard_show_on_focus = false
clear_button_enabled = true
selecting_enabled = false
caret_blink = true
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
layout_mode = 2
alignment = 1
[node name="Back" type="Button" parent="VBoxContainer/HBoxContainer"]
custom_minimum_size = Vector2(50, 0)
layout_mode = 2
theme_override_font_sizes/font_size = 8
text = "Back"
[node name="Next" type="Button" parent="VBoxContainer/HBoxContainer"]
custom_minimum_size = Vector2(50, 0)
layout_mode = 2
size_flags_vertical = 4
theme_override_font_sizes/font_size = 8
text = "Next"
[connection signal="pressed" from="VBoxContainer/HBoxContainer/Back" to="." method="_on_back_button_pressed"]
[connection signal="pressed" from="VBoxContainer/HBoxContainer/Next" to="." method="_on_next_pressed"]

View File

@@ -4,16 +4,11 @@ extends Node
var file: ConfigFile = ConfigFile.new() var file: ConfigFile = ConfigFile.new()
var save_path: String = "user://save.binary" var save_path: String = "user://save.binary"
func get_section_name(res: Resource) -> String: func save(res: SaveFile) -> bool:
return res.resource_name if res.resource_name != "" else res.get_class()
func save(res: Resource) -> bool:
if not is_instance_valid(res): if not is_instance_valid(res):
push_error("cannot save: invalid resource") push_error("cannot save: invalid resource")
return false return false
var section_name: String = get_section_name(res)
if FileAccess.file_exists(save_path) and file.load(save_path) != OK: if FileAccess.file_exists(save_path) and file.load(save_path) != OK:
printerr("Save file corrupted!") printerr("Save file corrupted!")
return false return false
@@ -23,26 +18,25 @@ func save(res: Resource) -> bool:
for property in res.get_property_list(): for property in res.get_property_list():
if property.usage & PROPERTY_USAGE_STORAGE: if property.usage & PROPERTY_USAGE_STORAGE:
var v_name: String = property.name var v_name: String = property.name
file.set_value(section_name, v_name, res.get(v_name)) file.set_value(res.save_name, v_name, res.get(v_name))
return file.save(save_path) == OK return file.save(save_path) == OK
func load(res: Resource) -> bool: func load(res: SaveFile) -> bool:
if not FileAccess.file_exists(save_path): if not FileAccess.file_exists(save_path):
return true return true
if file.load(save_path) != OK: if file.load(save_path) != OK:
printerr("Save file corrupted!") printerr("Save file corrupted!")
return false return false
var section_name: String = get_section_name(res)
var props := [] var props := []
for p in res.get_property_list(): for p in res.get_property_list():
if p.usage & PROPERTY_USAGE_STORAGE: if p.usage & PROPERTY_USAGE_STORAGE:
props.append(p.name) props.append(p.name)
for key in file.get_section_keys(section_name): for key in file.get_section_keys(res.save_name):
if key in props: if key in props:
res.set(key, file.get_value(section_name, key)) res.set(key, file.get_value(res.save_name, key))
return true return true
func delete() -> void: func delete() -> void:

View File

@@ -1,15 +1,15 @@
extends Node extends Node
var config: Config = Config.new() var config: Config = Config.new("config")
func _ready() -> void: func _ready() -> void:
Save.load(config) config.load()
toggle_fullscreen() toggle_fullscreen()
func _process(_delta: float) -> void: func _process(_delta: float) -> void:
if Input.is_action_just_pressed("fullscreen"): if Input.is_action_just_pressed("fullscreen"):
config.fullscreen = !config.fullscreen config.fullscreen = !config.fullscreen
Save.save(config) config.save()
toggle_fullscreen() toggle_fullscreen()
func _notification(what: int) -> void: func _notification(what: int) -> void:

View File

@@ -1,6 +1,9 @@
extends Control extends Control
@onready var tab_container: TabContainer = $TabContainer
func _on_start_button_pressed() -> void: func _on_start_button_pressed() -> void:
pass # Replace with function body. tab_container.current_tab = 1
func _on_profile_creator_exit() -> void:
tab_container.current_tab = 0

View File

@@ -1 +1,45 @@
extends Control extends Control
signal exit
var profile: Profile = Profile.new("profile")
@onready var next: Button = $VBoxContainer/HBoxContainer/Next
@onready var line_edit: LineEdit = $VBoxContainer/LineEdit
@onready var max_index: int = profile.named_things.keys().size() - 1
var index: int = 0
func _ready() -> void:
next.disabled = index == max_index
func _on_back_button_pressed() -> void:
if index == 0:
exit.emit()
else:
index -= 1
update_name()
func _on_next_pressed() -> void:
index += 1
update_name()
func update_name() -> void:
if index == max_index:
next.text = "Finish"
elif index > max_index:
profile.save()
index = max_index
return
else:
next.text = "Next"
var labels: Dictionary = {
"player_name": "Name him",
"villain_friend": "Name him too",
"stupid_friend": "And also name him",
"favourite_candy": "Favourite candy?"
}
var label: String = labels[profile.named_things.keys()[index]]
line_edit.placeholder_text = label

View File

@@ -1,4 +1,4 @@
class_name Config class_name Config
extends Resource extends SaveFile
@export var fullscreen: bool = ProjectSettings.get_setting("display/window/size/mode") == Window.MODE_EXCLUSIVE_FULLSCREEN | Window.MODE_FULLSCREEN @export var fullscreen: bool = ProjectSettings.get_setting("display/window/size/mode") == Window.MODE_EXCLUSIVE_FULLSCREEN | Window.MODE_FULLSCREEN

View File

@@ -1,6 +1,9 @@
class_name Profile class_name Profile
extends Resource extends SaveFile
@export var your_name: String = "Joel" @export var named_things: Dictionary[StringName, String] = {
@export var villain_friend_name: String = "Josh" "player_name": "Joel",
@export var stupid_friend_name: String = "Kevin" "villain_friend": "Josh",
"stupid_friend": "Kevin",
"favourite_candy": "Chocolate"
}

View File

@@ -0,0 +1,14 @@
class_name SaveFile
extends Resource
@export var save_name = "Save"
func _init(p_save_name = "Save") -> void:
save_name = p_save_name
func save() -> void: Save.save(self)
func load() -> void: Save.load(self)
func reset() -> void:
Save.file.erase_section(save_name)
Save.file.save(Save.save_path)

View File

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