From 5dce93c4548a20df8f652865fdf6efbb391589b8 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 16:09:43 -0400 Subject: [PATCH 01/12] Moving errors messages for signals --- .../autoloads/save_game_manager.gd | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/addons/save_load_system/autoloads/save_game_manager.gd b/addons/save_load_system/autoloads/save_game_manager.gd index 5ac94f3..31357a2 100644 --- a/addons/save_load_system/autoloads/save_game_manager.gd +++ b/addons/save_load_system/autoloads/save_game_manager.gd @@ -13,6 +13,9 @@ signal create_auto_save_file signal create_save_file(save_name: String) signal delete_save_file(filename: String) signal load_save_file(filename: String) +signal save_error(error_message: String) +signal load_error(error_message: String) +signal delete_error(error_message: String) signal quick_save signal quick_load signal open_save_list_ui @@ -83,20 +86,17 @@ func list_saves(include_quick_saves: bool = true, include_auto_saves: bool = tru func load_game_save(resource_filename: String) -> void: _load_game_resource(resource_filename) - game_loaded.emit() func quick_save_game() -> void: if not _load_save_level_data_component(): return _game_data_resource.save_name = "Quick Save" _save_game_as_resource(_save_level_data_component.settings.quicksave_file_name) - game_saved.emit() func quick_load_game() -> void: if not _load_save_level_data_component(): return _load_game_resource(_save_level_data_component.settings.quicksave_file_name) - game_loaded.emit() ## Sort the save files list by date created, descending @@ -133,12 +133,12 @@ func _load_game_resource(resource_filename: String) -> void: var save_game_file_path: String = _save_level_data_component.settings.save_game_data_path + resource_filename if !FileAccess.file_exists(save_game_file_path): - printerr("Failed to load save. File does not exist: ", save_game_file_path) + load_error.emit("Failed to load save. File does not exist: %s" % save_game_file_path) return _game_data_resource = ResourceLoader.load(save_game_file_path) if _game_data_resource == null: - printerr("Failed to load save. Unknown format? ", save_game_file_path) + load_error.emit("Failed to load save. Unknown format? %s" % save_game_file_path) return EntityManager.reset_world.emit() @@ -148,6 +148,8 @@ func _load_game_resource(resource_filename: String) -> void: if resource is Node3DDataResource: (resource as Node3DDataResource)._load_data(root_node) + game_loaded.emit() + func _save_game_as_resource(resource_filename: String) -> void: if not _load_save_level_data_component(): return @@ -159,9 +161,11 @@ func _save_game_as_resource(resource_filename: String) -> void: var result: int = ResourceSaver.save(_game_data_resource, save_game_file_path) if result != OK: - printerr("Failed to save game (" , result, "): ", save_game_file_path) + save_error.emit("Failed to save game (" , result, "): " + save_game_file_path) + return _take_save_screenshot(save_game_file_path) + game_saved.emit() ## Save the properties defined on the SaveDataComponents attached to various nodes (such as Block) func _save_node_data() -> void: @@ -204,7 +208,7 @@ func _on_save_game_as_resource(save_name: String) -> void: ## Delete both the save file and the related screenshot func _on_delete_save_file(filename: String) -> void: if filename.length() < 1: - printerr("_on_delete_save_file(): Empty filename provided") + delete_error.emit("Empty filename provided") return var save_file_path: String = _save_level_data_component.settings.save_game_data_path + filename -- 2.30.1 From ee73433da286ac07c4fb127c7524adc37bfe1605 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 16:18:20 -0400 Subject: [PATCH 02/12] Reworking signals for clarity and ease of use --- .../autoloads/save_game_manager.gd | 31 ++++++++++--------- scenes/ui/menus/saves_manager/save_file.gd | 4 +-- scenes/ui/menus/saves_manager/save_load_ui.gd | 2 +- scenes/ui/ui.gd | 4 +-- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/addons/save_load_system/autoloads/save_game_manager.gd b/addons/save_load_system/autoloads/save_game_manager.gd index 31357a2..188d133 100644 --- a/addons/save_load_system/autoloads/save_game_manager.gd +++ b/addons/save_load_system/autoloads/save_game_manager.gd @@ -7,15 +7,16 @@ extends Node -signal game_saved -signal game_loaded -signal create_auto_save_file -signal create_save_file(save_name: String) -signal delete_save_file(filename: String) -signal load_save_file(filename: String) -signal save_error(error_message: String) -signal load_error(error_message: String) +signal create_auto_save +signal create_save(save_name: String) +signal delete_save(filename: String) signal delete_error(error_message: String) +signal load_complete +signal load_error(error_message: String) +signal load_save(filename: String) +signal save_complete +signal save_error(error_message: String) + signal quick_save signal quick_load signal open_save_list_ui @@ -32,9 +33,9 @@ var _save_level_data_component: SaveLevelDataComponent ## Contains the save path func _ready() -> void: quick_load.connect(quick_load_game) quick_save.connect(quick_load_game) - create_save_file.connect(_on_save_game_as_resource) - load_save_file.connect(load_game_save) - delete_save_file.connect(_on_delete_save_file) + create_save.connect(_on_save_game_as_resource) + load_save.connect(load_game_save) + delete_save.connect(_on_delete_save) toggle_save_icon_generation.connect(_on_toggle_save_icon_generation) func _unhandled_input(event: InputEvent) -> void: @@ -148,7 +149,7 @@ func _load_game_resource(resource_filename: String) -> void: if resource is Node3DDataResource: (resource as Node3DDataResource)._load_data(root_node) - game_loaded.emit() + load_complete.emit() func _save_game_as_resource(resource_filename: String) -> void: if not _load_save_level_data_component(): return @@ -165,7 +166,7 @@ func _save_game_as_resource(resource_filename: String) -> void: return _take_save_screenshot(save_game_file_path) - game_saved.emit() + save_complete.emit() ## Save the properties defined on the SaveDataComponents attached to various nodes (such as Block) func _save_node_data() -> void: @@ -203,10 +204,10 @@ func _on_save_game_as_resource(save_name: String) -> void: _game_data_resource.save_name = save_name _save_game_as_resource(_filename) - game_saved.emit() + save_complete.emit() ## Delete both the save file and the related screenshot -func _on_delete_save_file(filename: String) -> void: +func _on_delete_save(filename: String) -> void: if filename.length() < 1: delete_error.emit("Empty filename provided") return diff --git a/scenes/ui/menus/saves_manager/save_file.gd b/scenes/ui/menus/saves_manager/save_file.gd index 386be40..0f9728f 100644 --- a/scenes/ui/menus/saves_manager/save_file.gd +++ b/scenes/ui/menus/saves_manager/save_file.gd @@ -51,14 +51,14 @@ func _on_delete_button_pressed() -> void: delete_confirm_ui.show() func _on_delete_confirm_button_pressed() -> void: - SaveGameManager.delete_save_file.emit(save_file_details.filename) + SaveGameManager.delete_save.emit(save_file_details.filename) queue_free() func _on_delete_cancel_button_pressed() -> void: delete_confirm_ui.hide() func _on_load_button_pressed() -> void: - SaveGameManager.load_save_file.emit(save_file_details.filename) + SaveGameManager.load_save.emit(save_file_details.filename) func _on_mouse_entered() -> void: set("theme_override_styles/panel", save_panel_highlight) diff --git a/scenes/ui/menus/saves_manager/save_load_ui.gd b/scenes/ui/menus/saves_manager/save_load_ui.gd index 0ce2936..c7ed11c 100644 --- a/scenes/ui/menus/saves_manager/save_load_ui.gd +++ b/scenes/ui/menus/saves_manager/save_load_ui.gd @@ -26,7 +26,7 @@ func _on_create_save_button_pressed() -> void: if _save_level_data_component.ui_node != null: _save_level_data_component.ui_node.visible = false await get_tree().create_timer(.150).timeout # A hack to allow time for UI to hide before taking screenshot - SaveGameManager.create_save_file.emit(save_name) + SaveGameManager.create_save.emit(save_name) if _save_level_data_component.ui_node != null: _save_level_data_component.ui_node.visible = true new_save_ui.hide() diff --git a/scenes/ui/ui.gd b/scenes/ui/ui.gd index 11fbecc..b09fce4 100644 --- a/scenes/ui/ui.gd +++ b/scenes/ui/ui.gd @@ -18,7 +18,7 @@ func _ready() -> void: SignalManager.resume_game.connect(_on_resume_game) SaveGameManager.close_save_list_ui.connect(_on_close_save_list_ui) SaveGameManager.open_save_list_ui.connect(_on_open_save_list_ui) - SaveGameManager.game_loaded.connect(_on_game_loaded) + SaveGameManager.load_complete.connect(_on_load_complete) _on_resume_game() @@ -43,7 +43,7 @@ func _on_close_save_list_ui() -> void: func _on_close_settings_menu() -> void: SignalManager.resume_game.emit() -func _on_game_loaded() -> void: +func _on_load_complete() -> void: _on_resume_game() func _on_open_pause_menu() -> void: -- 2.30.1 From 0ef53af01d125fb26da3a2ea331485c2a10102d6 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 16:35:49 -0400 Subject: [PATCH 03/12] Attempting to stop the double player saving that occurs sometimes --- project.godot | 4 ++++ resources/save_load_node_types/player_data_resource.gd | 2 +- scenes/player/player.tscn | 2 +- scenes/world/world.gd | 7 ++++--- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/project.godot b/project.godot index 304235e..82de92e 100644 --- a/project.godot +++ b/project.godot @@ -53,6 +53,10 @@ folder_colors={ "res://scenes/ui/": "green" } +[global_group] + +Player="" + [input] move_forward={ diff --git a/resources/save_load_node_types/player_data_resource.gd b/resources/save_load_node_types/player_data_resource.gd index c2b7cfb..54260de 100644 --- a/resources/save_load_node_types/player_data_resource.gd +++ b/resources/save_load_node_types/player_data_resource.gd @@ -4,8 +4,8 @@ extends Node3DDataResource func _save_data(node: Node3D) -> void: - super._save_data(node) # TODO: Save inventory or any other data + pass func _load_data(window: Window) -> void: diff --git a/scenes/player/player.tscn b/scenes/player/player.tscn index a13ae17..11c710d 100644 --- a/scenes/player/player.tscn +++ b/scenes/player/player.tscn @@ -14,7 +14,7 @@ height = 1.95 radius = 0.2 height = 0.89 -[node name="Player" type="CharacterBody3D"] +[node name="Player" type="CharacterBody3D" groups=["Player"]] collision_layer = 2 script = ExtResource("1_7sql3") jump_count = 2 diff --git a/scenes/world/world.gd b/scenes/world/world.gd index 46df604..a8b0bc5 100644 --- a/scenes/world/world.gd +++ b/scenes/world/world.gd @@ -48,9 +48,10 @@ func generate_world() -> void: EntityManager.create_block.emit("002", ground_position) func spawn_player(player_position: Transform3D) -> void: - if has_node("Player"): - $Player.queue_free() - await $Player.tree_exited + var players: Array = get_tree().get_nodes_in_group("Player") + for player: Player in players: + player.queue_free() + await player.tree_exited var player: Player = player_scene.instantiate() player.transform = player_position -- 2.30.1 From 9cdb1ad26bdcbcae3c9d5a1c44a676eaf0d5b302 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 16:36:07 -0400 Subject: [PATCH 04/12] Fixing warning --- resources/save_load_node_types/player_data_resource.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/save_load_node_types/player_data_resource.gd b/resources/save_load_node_types/player_data_resource.gd index 54260de..7a9d883 100644 --- a/resources/save_load_node_types/player_data_resource.gd +++ b/resources/save_load_node_types/player_data_resource.gd @@ -3,7 +3,7 @@ class_name PlayerDataResource extends Node3DDataResource -func _save_data(node: Node3D) -> void: +func _save_data(_node: Node3D) -> void: # TODO: Save inventory or any other data pass -- 2.30.1 From 3073c8d4d62cf4ff6055084acfc5f5bdc9395d98 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 17:49:31 -0400 Subject: [PATCH 05/12] Splitting load_save into load_save and apply_save --- .../autoloads/save_game_manager.gd | 26 ++++++++++++------- scenes/world/world.gd | 5 ++++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/addons/save_load_system/autoloads/save_game_manager.gd b/addons/save_load_system/autoloads/save_game_manager.gd index 188d133..844687b 100644 --- a/addons/save_load_system/autoloads/save_game_manager.gd +++ b/addons/save_load_system/autoloads/save_game_manager.gd @@ -7,13 +7,15 @@ extends Node +signal apply_load_complete +signal apply_save ## Apply the loaded data to the tree. Note: This should happen AFTER load_save() signal create_auto_save signal create_save(save_name: String) signal delete_save(filename: String) signal delete_error(error_message: String) signal load_complete signal load_error(error_message: String) -signal load_save(filename: String) +signal load_save(filename: String) ## Loads the save into memory. Does NOT apply the load as this allows for other actions (such as resetting the levle/world).[br]Don't forget to run `apply_save` after loading signal save_complete signal save_error(error_message: String) @@ -32,11 +34,12 @@ var _save_level_data_component: SaveLevelDataComponent ## Contains the save path func _ready() -> void: quick_load.connect(quick_load_game) - quick_save.connect(quick_load_game) + quick_save.connect(quick_save_game) create_save.connect(_on_save_game_as_resource) load_save.connect(load_game_save) delete_save.connect(_on_delete_save) toggle_save_icon_generation.connect(_on_toggle_save_icon_generation) + apply_save.connect(_on_apply_save) func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("quick_save"): @@ -142,13 +145,6 @@ func _load_game_resource(resource_filename: String) -> void: load_error.emit("Failed to load save. Unknown format? %s" % save_game_file_path) return - EntityManager.reset_world.emit() - - var root_node: Window = get_tree().root - for resource: Resource in _game_data_resource.save_data_nodes: - if resource is Node3DDataResource: - (resource as Node3DDataResource)._load_data(root_node) - load_complete.emit() func _save_game_as_resource(resource_filename: String) -> void: @@ -195,6 +191,18 @@ func _take_save_screenshot(save_game_file_path: String) -> void: _icon.save_png(_icon_filepath) +## Apply the loaded save.[br] +## Performed after load_save +func _on_apply_save() -> void: + if _game_data_resource == null: return + + var root_node: Window = get_tree().root + for resource: Resource in _game_data_resource.save_data_nodes: + if resource is Node3DDataResource: + (resource as Node3DDataResource)._load_data(root_node) + + apply_load_complete.emit() + ## Save the game, with a filename of `.tres func _on_save_game_as_resource(save_name: String) -> void: if not _load_save_level_data_component(): return diff --git a/scenes/world/world.gd b/scenes/world/world.gd index a8b0bc5..6009743 100644 --- a/scenes/world/world.gd +++ b/scenes/world/world.gd @@ -15,6 +15,7 @@ func _ready() -> void: EntityManager.drop_block.connect(_create_dropped_block) EntityManager.reset_world.connect(clear_world) EntityManager.spawn_player.connect(spawn_player) + SaveGameManager.load_complete.connect(_on_load_save_complete) clear_world() create_world() @@ -82,3 +83,7 @@ func _create_test_blocks() -> void: func _on_reset_world() -> void: clear_world() + +func _on_load_save_complete() -> void: + clear_world() + SaveGameManager.apply_save.emit() -- 2.30.1 From 8abff9802acbfdca52e7428936d957d6d800cc27 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 18:01:19 -0400 Subject: [PATCH 06/12] Reordering and renaming functions --- .../autoloads/save_game_manager.gd | 62 +++++++++---------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/addons/save_load_system/autoloads/save_game_manager.gd b/addons/save_load_system/autoloads/save_game_manager.gd index 844687b..cf5eae0 100644 --- a/addons/save_load_system/autoloads/save_game_manager.gd +++ b/addons/save_load_system/autoloads/save_game_manager.gd @@ -33,19 +33,19 @@ var _save_level_data_component: SaveLevelDataComponent ## Contains the save path func _ready() -> void: - quick_load.connect(quick_load_game) - quick_save.connect(quick_save_game) + apply_save.connect(_on_apply_save) create_save.connect(_on_save_game_as_resource) - load_save.connect(load_game_save) delete_save.connect(_on_delete_save) + load_save.connect(_on_load_game_save) + quick_load.connect(_on_quick_load) + quick_save.connect(_on_quick_save) toggle_save_icon_generation.connect(_on_toggle_save_icon_generation) - apply_save.connect(_on_apply_save) func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("quick_save"): - quick_save_game() + _on_quick_save() if event.is_action_pressed("quick_load"): - quick_load_game() + _on_quick_load() func list_saves(include_quick_saves: bool = true, include_auto_saves: bool = true) -> Array[SaveFileDetailsResource]: @@ -88,20 +88,6 @@ func list_saves(include_quick_saves: bool = true, include_auto_saves: bool = tru save_files.sort_custom(_custom_save_file_sort) return save_files -func load_game_save(resource_filename: String) -> void: - _load_game_resource(resource_filename) - -func quick_save_game() -> void: - if not _load_save_level_data_component(): return - - _game_data_resource.save_name = "Quick Save" - _save_game_as_resource(_save_level_data_component.settings.quicksave_file_name) - -func quick_load_game() -> void: - if not _load_save_level_data_component(): return - - _load_game_resource(_save_level_data_component.settings.quicksave_file_name) - ## Sort the save files list by date created, descending func _custom_save_file_sort(a: SaveFileDetailsResource, b: SaveFileDetailsResource) -> bool: @@ -191,8 +177,7 @@ func _take_save_screenshot(save_game_file_path: String) -> void: _icon.save_png(_icon_filepath) -## Apply the loaded save.[br] -## Performed after load_save +## Apply the loaded save. Should be performed after load_save func _on_apply_save() -> void: if _game_data_resource == null: return @@ -203,6 +188,29 @@ func _on_apply_save() -> void: apply_load_complete.emit() +## Delete both the save file and the related screenshot +func _on_delete_save(filename: String) -> void: + if filename.length() < 1: + delete_error.emit("Empty filename provided") + return + + var save_file_path: String = _save_level_data_component.settings.save_game_data_path + filename + DirAccess.remove_absolute(save_file_path) + DirAccess.remove_absolute(save_file_path.replace(".tres", ".png")) # Delete icon + +func _on_load_game_save(resource_filename: String) -> void: + _load_game_resource(resource_filename) + +func _on_quick_load() -> void: + if not _load_save_level_data_component(): return + _load_game_resource(_save_level_data_component.settings.quicksave_file_name) + +func _on_quick_save() -> void: + if not _load_save_level_data_component(): return + + _game_data_resource.save_name = "Quick Save" + _save_game_as_resource(_save_level_data_component.settings.quicksave_file_name) + ## Save the game, with a filename of `.tres func _on_save_game_as_resource(save_name: String) -> void: if not _load_save_level_data_component(): return @@ -214,15 +222,5 @@ func _on_save_game_as_resource(save_name: String) -> void: _save_game_as_resource(_filename) save_complete.emit() -## Delete both the save file and the related screenshot -func _on_delete_save(filename: String) -> void: - if filename.length() < 1: - delete_error.emit("Empty filename provided") - return - - var save_file_path: String = _save_level_data_component.settings.save_game_data_path + filename - DirAccess.remove_absolute(save_file_path) - DirAccess.remove_absolute(save_file_path.replace(".tres", ".png")) # Delete icon - func _on_toggle_save_icon_generation(toggled: bool) -> void: _enable_save_icon_generation = toggled -- 2.30.1 From 1eb9340ceb38a5af190e49611b9692c69a7eb2cc Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 18:14:33 -0400 Subject: [PATCH 07/12] Removing jolt for now --- project.godot | 4 ---- 1 file changed, 4 deletions(-) diff --git a/project.godot b/project.godot index 82de92e..51ecfea 100644 --- a/project.godot +++ b/project.godot @@ -209,7 +209,3 @@ quickslot10={ 3d_physics/layer_1="World" 3d_physics/layer_2="Player" 3d_physics/layer_3="Pickups" - -[physics] - -3d/physics_engine="Jolt Physics" -- 2.30.1 From b398613dffe77d00cffc1d145b6f7806514e32c7 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 18:28:01 -0400 Subject: [PATCH 08/12] Renaming apply_load_complete signal to apply_complete --- addons/save_load_system/autoloads/save_game_manager.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/save_load_system/autoloads/save_game_manager.gd b/addons/save_load_system/autoloads/save_game_manager.gd index cf5eae0..877a0c6 100644 --- a/addons/save_load_system/autoloads/save_game_manager.gd +++ b/addons/save_load_system/autoloads/save_game_manager.gd @@ -7,7 +7,7 @@ extends Node -signal apply_load_complete +signal apply_complete signal apply_save ## Apply the loaded data to the tree. Note: This should happen AFTER load_save() signal create_auto_save signal create_save(save_name: String) @@ -186,7 +186,7 @@ func _on_apply_save() -> void: if resource is Node3DDataResource: (resource as Node3DDataResource)._load_data(root_node) - apply_load_complete.emit() + apply_complete.emit() ## Delete both the save file and the related screenshot func _on_delete_save(filename: String) -> void: -- 2.30.1 From 6845e7407a40451506f0b88b12c560a486aeef54 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 18:47:35 -0400 Subject: [PATCH 09/12] Moving open_save_list_ui and close_save_list_ui our of SaveGameManager --- addons/save_load_system/autoloads/save_game_manager.gd | 2 -- scenes/ui/menus/pause_menu.gd | 4 +++- scenes/ui/menus/saves_manager/save_files_list.gd | 5 +++-- scenes/ui/menus/saves_manager/save_load_ui.gd | 4 ++++ scenes/ui/menus/saves_manager/save_load_ui.tscn | 3 ++- scenes/ui/ui.gd | 8 +++++--- scenes/ui/ui.tscn | 3 ++- 7 files changed, 19 insertions(+), 10 deletions(-) diff --git a/addons/save_load_system/autoloads/save_game_manager.gd b/addons/save_load_system/autoloads/save_game_manager.gd index 877a0c6..0b92881 100644 --- a/addons/save_load_system/autoloads/save_game_manager.gd +++ b/addons/save_load_system/autoloads/save_game_manager.gd @@ -21,8 +21,6 @@ signal save_error(error_message: String) signal quick_save signal quick_load -signal open_save_list_ui -signal close_save_list_ui signal toggle_save_icon_generation(toggled: bool) ## Enable/Disable the generation of a screenshot during save for the save icon. diff --git a/scenes/ui/menus/pause_menu.gd b/scenes/ui/menus/pause_menu.gd index 9be0c5a..921b179 100644 --- a/scenes/ui/menus/pause_menu.gd +++ b/scenes/ui/menus/pause_menu.gd @@ -1,6 +1,8 @@ class_name PauseMenu extends Panel +@export var save_load_ui: SaveLoadUI + func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("ui_cancel") and self.visible: @@ -27,4 +29,4 @@ func _on_settings_button_pressed() -> void: SignalManager.open_settings_menu.emit() func _on_saves_button_pressed() -> void: - SaveGameManager.open_save_list_ui.emit() + save_load_ui.open_save_list.emit() diff --git a/scenes/ui/menus/saves_manager/save_files_list.gd b/scenes/ui/menus/saves_manager/save_files_list.gd index b586bab..ebe9209 100644 --- a/scenes/ui/menus/saves_manager/save_files_list.gd +++ b/scenes/ui/menus/saves_manager/save_files_list.gd @@ -2,10 +2,11 @@ extends VBoxContainer @export var save_file_scene: PackedScene +@export var save_load_ui: SaveLoadUI func _ready() -> void: - SaveGameManager.open_save_list_ui.connect(_on_open_save_list_ui) + save_load_ui.open_save_list.connect(_on_open_save_list) # TODO: Reconsider this setup ## Clear the SaveFilesList node of all saves and load most recent saves @@ -24,5 +25,5 @@ func _clear_save_files_list() -> void: for _panel: SaveFilePanel in get_children(): _panel.queue_free() -func _on_open_save_list_ui() -> void: +func _on_open_save_list() -> void: refresh_saves_list() diff --git a/scenes/ui/menus/saves_manager/save_load_ui.gd b/scenes/ui/menus/saves_manager/save_load_ui.gd index c7ed11c..6f92972 100644 --- a/scenes/ui/menus/saves_manager/save_load_ui.gd +++ b/scenes/ui/menus/saves_manager/save_load_ui.gd @@ -2,6 +2,10 @@ class_name SaveLoadUI extends Control +signal close_save_list +signal open_save_list + + @export var show_save_ui_button: BaseButton @export var new_save_ui: Control @export var save_name_input: LineEdit diff --git a/scenes/ui/menus/saves_manager/save_load_ui.tscn b/scenes/ui/menus/saves_manager/save_load_ui.tscn index 74d6a20..0e70e6c 100644 --- a/scenes/ui/menus/saves_manager/save_load_ui.tscn +++ b/scenes/ui/menus/saves_manager/save_load_ui.tscn @@ -58,9 +58,10 @@ custom_minimum_size = Vector2(0, 500) layout_mode = 2 horizontal_scroll_mode = 0 -[node name="SaveFilesList" parent="Panel/MarginContainer/VBoxContainer/ScrollContainer" instance=ExtResource("1_tqtxm")] +[node name="SaveFilesList" parent="Panel/MarginContainer/VBoxContainer/ScrollContainer" node_paths=PackedStringArray("save_load_ui") instance=ExtResource("1_tqtxm")] layout_mode = 2 size_flags_horizontal = 6 +save_load_ui = NodePath("../../../../..") [node name="SaveFilePanel" parent="Panel/MarginContainer/VBoxContainer/ScrollContainer/SaveFilesList" instance=ExtResource("2_6uxbh")] layout_mode = 2 diff --git a/scenes/ui/ui.gd b/scenes/ui/ui.gd index b09fce4..3bf674d 100644 --- a/scenes/ui/ui.gd +++ b/scenes/ui/ui.gd @@ -5,7 +5,7 @@ extends CanvasLayer @onready var crosshair: CenterContainer = $Crosshair @onready var quick_slots: MarginContainer = $QuickSlots @onready var pause_menu: PauseMenu = $PauseMenu -@onready var save_load_ui: Control = $SaveLoadUI +@onready var save_load_ui: SaveLoadUI = $SaveLoadUI @onready var settings_menu: SettingsMenu = $SettingsMenu @onready var waila: Waila = $Waila @@ -16,8 +16,10 @@ func _ready() -> void: SignalManager.close_settings_menu.connect(_on_close_settings_menu) SignalManager.open_settings_menu.connect(_on_open_settings_menu) SignalManager.resume_game.connect(_on_resume_game) - SaveGameManager.close_save_list_ui.connect(_on_close_save_list_ui) - SaveGameManager.open_save_list_ui.connect(_on_open_save_list_ui) + + save_load_ui.close_save_list.connect(_on_close_save_list_ui) + save_load_ui.open_save_list.connect(_on_open_save_list_ui) + SaveGameManager.load_complete.connect(_on_load_complete) _on_resume_game() diff --git a/scenes/ui/ui.tscn b/scenes/ui/ui.tscn index 98690a1..d0c4768 100644 --- a/scenes/ui/ui.tscn +++ b/scenes/ui/ui.tscn @@ -31,8 +31,9 @@ mouse_filter = 2 [node name="QuickSlots" parent="." instance=ExtResource("4_g5kmx")] -[node name="PauseMenu" parent="." instance=ExtResource("6_7vp6q")] +[node name="PauseMenu" parent="." node_paths=PackedStringArray("save_load_ui") instance=ExtResource("6_7vp6q")] visible = false +save_load_ui = NodePath("../SaveLoadUI") [node name="SettingsMenu" parent="." instance=ExtResource("7_7vp6q")] visible = false -- 2.30.1 From e5dbf84a57dab4c251f569508a15567875c08046 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 19:11:01 -0400 Subject: [PATCH 10/12] Fixing appending saves --- .../autoloads/save_game_manager.gd | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/addons/save_load_system/autoloads/save_game_manager.gd b/addons/save_load_system/autoloads/save_game_manager.gd index 0b92881..59e4a62 100644 --- a/addons/save_load_system/autoloads/save_game_manager.gd +++ b/addons/save_load_system/autoloads/save_game_manager.gd @@ -25,7 +25,7 @@ signal toggle_save_icon_generation(toggled: bool) ## Enable/Disable the generati var _enable_save_icon_generation: bool = true -var _game_data_resource: SaveGameDataResource = SaveGameDataResource.new() +var _loaded_save_resource: SaveGameDataResource = SaveGameDataResource.new() var _save_icon_size: Vector2i = Vector2i(896, 504) ## If Vector2.ZERO, uses the user's resolution var _save_level_data_component: SaveLevelDataComponent ## Contains the save paths and filenames @@ -91,6 +91,22 @@ func list_saves(include_quick_saves: bool = true, include_auto_saves: bool = tru func _custom_save_file_sort(a: SaveFileDetailsResource, b: SaveFileDetailsResource) -> bool: return a.date_created > b.date_created +## Save the properties defined on the SaveDataComponents attached to various nodes (such as Block) +func _generate_save_game_resource() -> SaveGameDataResource: + var nodes: Array = get_tree().get_nodes_in_group("save_data_component") + + if nodes == null: return + + var _resource: SaveGameDataResource = SaveGameDataResource.new() + for node: Node in nodes: + if node is SaveDataComponent: + @warning_ignore("unsafe_method_access") + var save_data_resource: Node3DDataResource = node._save_data() + var save_final_resource: Node3DDataResource = save_data_resource.duplicate() + _resource.save_data_nodes.append(save_final_resource) + + return _resource + ## Generate the texture for use in the save file listing func _generate_save_icon_texture(save_icon: String) -> Texture2D: var _icon_texture: Texture2D = ImageTexture.new() @@ -124,23 +140,26 @@ func _load_game_resource(resource_filename: String) -> void: load_error.emit("Failed to load save. File does not exist: %s" % save_game_file_path) return - _game_data_resource = ResourceLoader.load(save_game_file_path) - if _game_data_resource == null: + _loaded_save_resource = SaveGameDataResource.new() + _loaded_save_resource = ResourceLoader.load(save_game_file_path) + if _loaded_save_resource == null: load_error.emit("Failed to load save. Unknown format? %s" % save_game_file_path) return load_complete.emit() -func _save_game_as_resource(resource_filename: String) -> void: +func _save_game_as_resource(save_name, resource_filename: String) -> void: if not _load_save_level_data_component(): return if !DirAccess.dir_exists_absolute(_save_level_data_component.settings.save_game_data_path): DirAccess.make_dir_absolute(_save_level_data_component.settings.save_game_data_path) var save_game_file_path: String = _save_level_data_component.settings.save_game_data_path + resource_filename - _save_node_data() - var result: int = ResourceSaver.save(_game_data_resource, save_game_file_path) + var _save_resource: SaveGameDataResource = _generate_save_game_resource() + _save_resource.save_name = save_name + + var result: int = ResourceSaver.save(_save_resource, save_game_file_path) if result != OK: save_error.emit("Failed to save game (" , result, "): " + save_game_file_path) return @@ -148,19 +167,6 @@ func _save_game_as_resource(resource_filename: String) -> void: _take_save_screenshot(save_game_file_path) save_complete.emit() -## Save the properties defined on the SaveDataComponents attached to various nodes (such as Block) -func _save_node_data() -> void: - var nodes: Array = get_tree().get_nodes_in_group("save_data_component") - - if nodes == null: return - - for node: Node in nodes: - if node is SaveDataComponent: - @warning_ignore("unsafe_method_access") - var save_data_resource: Node3DDataResource = node._save_data() - var save_final_resource: Node3DDataResource = save_data_resource.duplicate() - _game_data_resource.save_data_nodes.append(save_final_resource) - ## Takes a screenshot and saves next to the save file[br] ## The icon utilizes the same filename as the save file, replacing `.tres` with `.png` func _take_save_screenshot(save_game_file_path: String) -> void: @@ -177,10 +183,10 @@ func _take_save_screenshot(save_game_file_path: String) -> void: ## Apply the loaded save. Should be performed after load_save func _on_apply_save() -> void: - if _game_data_resource == null: return + if _loaded_save_resource == null: return var root_node: Window = get_tree().root - for resource: Resource in _game_data_resource.save_data_nodes: + for resource: Resource in _loaded_save_resource.save_data_nodes: if resource is Node3DDataResource: (resource as Node3DDataResource)._load_data(root_node) @@ -206,8 +212,7 @@ func _on_quick_load() -> void: func _on_quick_save() -> void: if not _load_save_level_data_component(): return - _game_data_resource.save_name = "Quick Save" - _save_game_as_resource(_save_level_data_component.settings.quicksave_file_name) + _save_game_as_resource("Quick Save", _save_level_data_component.settings.quicksave_file_name) ## Save the game, with a filename of `.tres func _on_save_game_as_resource(save_name: String) -> void: @@ -216,8 +221,8 @@ func _on_save_game_as_resource(save_name: String) -> void: var current_date: String = Time.get_datetime_string_from_system().replace(":", "") var _filename: String = "save_" + current_date + ".tres" - _game_data_resource.save_name = save_name - _save_game_as_resource(_filename) + _loaded_save_resource.save_name = save_name + _save_game_as_resource(save_name, _filename) save_complete.emit() func _on_toggle_save_icon_generation(toggled: bool) -> void: -- 2.30.1 From 9df29f9f92beabf7622419b1a8ecb0ae458bc08c Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 19:18:14 -0400 Subject: [PATCH 11/12] Removing unnecessary instancing --- addons/save_load_system/autoloads/save_game_manager.gd | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/save_load_system/autoloads/save_game_manager.gd b/addons/save_load_system/autoloads/save_game_manager.gd index 59e4a62..2bb8e09 100644 --- a/addons/save_load_system/autoloads/save_game_manager.gd +++ b/addons/save_load_system/autoloads/save_game_manager.gd @@ -140,7 +140,6 @@ func _load_game_resource(resource_filename: String) -> void: load_error.emit("Failed to load save. File does not exist: %s" % save_game_file_path) return - _loaded_save_resource = SaveGameDataResource.new() _loaded_save_resource = ResourceLoader.load(save_game_file_path) if _loaded_save_resource == null: load_error.emit("Failed to load save. Unknown format? %s" % save_game_file_path) -- 2.30.1 From 0df41dfc3aab3278c13f1a0f2e46cd633ec85a59 Mon Sep 17 00:00:00 2001 From: Ryan Reed Date: Thu, 27 Mar 2025 19:55:43 -0400 Subject: [PATCH 12/12] Correcting saving Player node --- resources/save_load_node_types/player_data_resource.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/save_load_node_types/player_data_resource.gd b/resources/save_load_node_types/player_data_resource.gd index 7a9d883..c2b7cfb 100644 --- a/resources/save_load_node_types/player_data_resource.gd +++ b/resources/save_load_node_types/player_data_resource.gd @@ -3,9 +3,9 @@ class_name PlayerDataResource extends Node3DDataResource -func _save_data(_node: Node3D) -> void: +func _save_data(node: Node3D) -> void: + super._save_data(node) # TODO: Save inventory or any other data - pass func _load_data(window: Window) -> void: -- 2.30.1