## Performs the actual saving and loading of data related to this level/scene ## Utilized by the SaveGameManager class_name SaveLevelDataComponent extends Node ## See documentation to where this path is: https://docs.godotengine.org/en/stable/tutorials/io/data_paths.html#accessing-persistent-user-data-user[br][br] ## Default Paths:[br] ## * Windows: %APPDATA%\Godot\app_userdata\[project_name][br] ## * macOS: ~/Library/Application Support/Godot/app_userdata/[project_name][br] ## * Linux: ~/.local/share/godot/app_userdata/[project_name][br] @export var save_game_data_path: String = "user://game_data/" @export var save_file_name: String = "save_%s_game_data.tres" var level_scene_name: String var game_data_resource: SaveGameDataResource var level_save_file_name: String var save_game_file_path: String func _ready() -> void: add_to_group("save_level_data_component") level_scene_name = get_parent().name level_save_file_name = save_file_name % level_scene_name save_game_file_path = save_game_data_path + level_save_file_name func save_node_data() -> void: var nodes: Array = get_tree().get_nodes_in_group("save_data_component") if nodes == null: return game_data_resource = 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() game_data_resource.save_data_nodes.append(save_final_resource) func save_game() -> void: if !DirAccess.dir_exists_absolute(save_game_data_path): DirAccess.make_dir_absolute(save_game_data_path) save_node_data() var result: int = ResourceSaver.save(game_data_resource, save_game_file_path) if result != OK: printerr("Failed to save game: ", result) func load_game() -> void: if !FileAccess.file_exists(save_game_file_path): printerr("Failed to load save. File does not exist: ", 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) 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)