project-villain/interface/save_load.gd

135 lines
3.7 KiB
GDScript

extends Node
class SaveData:
var type: String
var position: Vector3
var parent: String
var scene_file_path: String
var id: int
#Connections
var place_id: int
var room_array: Array
#Tile data
var grid_pos: Vector3i
var face_dict: Array
var construction_mode: int
func _init():
ObjectSerializer.register_scripts({
"SaveData": SaveData,
"Tile": Tile,
"Room": Room,
"Wall": Wall,
})
func _on_save_button_pressed() -> void:
var save_nodes = get_tree().get_nodes_in_group("SaveObjects")
var save_file = FileAccess.open("user://savegame.save", FileAccess.WRITE)
for node in save_nodes:
if not node.has_method("save"):
print("no method")
continue
var node_data = node.save()
var save_data = SaveData.new()
for i in node_data:
save_data.set(i, node_data[i])
var serialized_save_data = BinarySerializer.serialize_var(save_data)
var byte_data = var_to_bytes(serialized_save_data)
save_file.store_var(byte_data)
pass # Replace with function body.
func _on_load_button_pressed():
if not FileAccess.file_exists("user://savegame.save"):
print("no save to load")
return
var save_nodes = get_tree().get_nodes_in_group("SaveObjects")
for i in save_nodes:
if i:
i.free()
#if get_node("/root/Game/PlaceManager/BasePlace"):
#get_node("/root/Game/PlaceManager/BasePlace").free()
var save_file = FileAccess.open("user://savegame.save", FileAccess.READ)
var place_id_dict: Dictionary = {}
var room_id_dict: Dictionary = {}
var load_place_room_array: Dictionary = {}
var load_place_tile_dict: Dictionary = {}
var load_room_tile_array: Dictionary = {}
while save_file.get_position() < save_file.get_length():
var next_load_bytes = save_file.get_var()
var next_load = bytes_to_var(next_load_bytes)
var load_object = load(next_load["scene_file_path"]).instantiate()
var id = next_load["id"]
match next_load["type"]:
"Place":
var new_place_id = load_object.get_instance_id()
place_id_dict[id] = new_place_id
load_place_room_array[load_object] = []
load_place_tile_dict[load_object] = {}
for j in next_load.keys():
load_object.set(j, next_load[j])
get_node(next_load["parent"]).add_child(load_object)
"Room":
room_id_dict[id] = load_object.get_instance_id()
load_room_tile_array[load_object] = []
for j in next_load.keys():
if j == "place_id":
var new_place_id = place_id_dict[next_load[j]]
var place = instance_from_id(new_place_id)
load_place_room_array[place].append(load_object)
load_object.set(j, new_place_id)
else:
load_object.set(j, next_load[j])
get_node(next_load["parent"]).add_child(load_object)
"Tile":
for j in next_load.keys():
if j == "place_id":
var new_place_id = place_id_dict[next_load[j]]
var place = instance_from_id(new_place_id)
load_place_tile_dict[place].merge({next_load["grid_pos"]: load_object})
load_object.set(j, new_place_id)
elif j == "room_array":
for k in next_load["room_array"]:
var new_room_id = room_id_dict[k]
var room = instance_from_id(new_room_id)
load_room_tile_array[room].append(load_object)
load_object[j].append(room)
else:
load_object.set(j, next_load[j])
get_node(next_load["parent"]).add_child(load_object)
_:
for j in next_load.keys():
load_object.set(j, next_load[j])
get_node(next_load["parent"]).add_child(load_object)
for i in load_place_room_array.keys():
i.place_room_array = load_place_room_array[i]
for i in load_place_tile_dict.keys():
i.place_tile_dict.merge(load_place_tile_dict[i])
for i in load_room_tile_array.keys():
i.room_tile_array = load_room_tile_array[i]