|
|
@ -0,0 +1,66 @@ |
|
|
|
## 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: NodeDataResource = node._save_data() |
|
|
|
var save_final_resource: NodeDataResource = 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) |
|
|
|
print("Save Result: ", result) |
|
|
|
|
|
|
|
|
|
|
|
func load_game() -> void: |
|
|
|
if !FileAccess.file_exists(save_game_file_path): |
|
|
|
#push_error("Save file does not exist: ", save_game_file_path) |
|
|
|
return |
|
|
|
|
|
|
|
game_data_resource = ResourceLoader.load(save_game_file_path) |
|
|
|
|
|
|
|
if game_data_resource == null: |
|
|
|
push_error("Could not load save file: ", 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 NodeDataResource: |
|
|
|
(resource as NodeDataResource)._load_data(root_node) |