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]