69 lines
1.9 KiB
GDScript
69 lines
1.9 KiB
GDScript
extends Node
|
|
|
|
# The group of nodes to save is named "save_nodes"
|
|
|
|
# Reference to the currently loaded save game
|
|
@onready var current_save : SavedGame = SavedGame.new()
|
|
|
|
var world
|
|
|
|
func save_game():
|
|
# Create a new empty save game
|
|
var saved_game := SavedGame.new()
|
|
|
|
# Save the environment data
|
|
saved_game.world = SceneManager.get_world()
|
|
saved_game.daytime = 12.5
|
|
saved_game.weather = "this should be an enum"
|
|
|
|
# Save the party data
|
|
for monster in SaveManager.current_save.party:
|
|
saved_game.party.append(monster)
|
|
|
|
# Create an array to store the data of all other nodes
|
|
var saved_data : Array[SavedData] = []
|
|
|
|
# Use a group call to collect all the data from the other objects
|
|
get_tree().call_group("save_nodes", "on_save_game", saved_data)
|
|
|
|
# Store the array in the saved game
|
|
saved_game.saved_data = saved_data
|
|
|
|
# Store it into a file
|
|
ResourceSaver.save(saved_game, "user://savegame.tres")
|
|
|
|
|
|
func load_game():
|
|
# Load the saved game file
|
|
var saved_game : SavedGame = load("user://savegame.tres") as SavedGame
|
|
|
|
# Return if no save file is found
|
|
if saved_game == null:
|
|
print("No savegame found.")
|
|
return
|
|
|
|
# Save a reference to the current save game
|
|
current_save = saved_game
|
|
|
|
# Clean up all non-static objects from the scene
|
|
get_tree().call_group("save_nodes", "on_before_load_game")
|
|
|
|
# Restore world data
|
|
SceneManager.set_world(saved_game.world)
|
|
|
|
# Restore all other nodes
|
|
for node in saved_game.saved_data:
|
|
# Instantiate the scene for the node
|
|
var scene := load(node.scene_path) as PackedScene
|
|
var restored_node = scene.instantiate()
|
|
|
|
# Add the item to the world
|
|
# todo: add parent as value to save and restore to the parent
|
|
SceneManager.current_world.add_child(restored_node)
|
|
|
|
# run a callback to restore the item's state
|
|
if restored_node.has_method("on_load_game"):
|
|
restored_node.on_load_game(node)
|
|
|
|
func save_exists():
|
|
return FileAccess.file_exists("user://savegame.tres")
|