project-villain/interface/save_load.gd

182 lines
5.1 KiB
GDScript

extends Node
class SaveData:
var id: int
var type: String
var parent: String
var scene_file_path: String
var position: Vector3
var rotation_degrees
#Connections
var place_id: int
var room_ids: Array
var tile_ids: Array
var door_to_tile: Dictionary
#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,
"Door": Door,
})
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()
var save_file = FileAccess.open("user://savegame.save", FileAccess.READ)
var place_id_dict: Dictionary = {}
var room_id_dict: Dictionary = {}
var tile_id_dict: Dictionary = {}
var load_place_to_room: Dictionary = {}
var load_place_to_tile: Dictionary = {}
var load_room_to_tile: Dictionary = {}
var load_room_to_door: Dictionary = {}
var load_tile_to_door: Array = []
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":
place_id_dict[id] = load_object.get_instance_id()
load_place_to_room[load_object] = []
load_place_to_tile[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_to_tile[load_object] = []
load_room_to_door[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_to_room[place].append(load_object)
load_object.set(j, new_place_id)
else:
load_object.set(j, next_load[j])
instance_from_id(load_object["place_id"]).get_node("RoomContainer").add_child(load_object)
"Tile":
tile_id_dict[id] = load_object.get_instance_id()
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_to_tile[place].merge({next_load["grid_pos"]: load_object})
load_object.set(j, new_place_id)
elif j == "main_room":
var new_room_id = room_id_dict[j]
var room = instance_from_id(new_room_id)
load_room_to_tile[room].append(load_object)
load_object["lookup_tile_to_room"] = room
elif j == "face_dict":
if next_load[j]:
var temp_new_dict: Dictionary
for k in next_load[j]:
temp_new_dict[k] = null
load_object[j] = temp_new_dict.duplicate()
else:
load_object.set(j, next_load[j])
instance_from_id(load_object["place_id"]).get_node("TileContainer").add_child(load_object)
"Door":
for j in next_load.keys():
if j == "place_id":
var new_place_id = place_id_dict[next_load[j]]
load_object.set(j, new_place_id)
elif j == "room_ids":
for k in next_load["room_ids"]:
var new_room_id = room_id_dict[k]
var room = instance_from_id(new_room_id)
load_room_to_door[room].append(load_object)
load_object["lookup_door_to_room"].append(room)
elif j == "door_to_tile":
var tile_dict = next_load["door_to_tile"]
for k in tile_dict.keys():
var new_tile_id = tile_id_dict[tile_dict[k]]
var tile = instance_from_id(new_tile_id)
load_tile_to_door.append({tile: {k: load_object}})
load_object["lookup_door_to_tile"].merge({k: tile})
else:
load_object.set(j, next_load[j])
instance_from_id(load_object["place_id"]).get_node("ObjectContainer").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_to_room.keys():
i.lookup_place_to_room = load_place_to_room[i]
for i in load_place_to_tile.keys():
i.lookup_place_to_tile.merge(load_place_to_tile[i])
for i in load_room_to_tile.keys():
i.room_to_tile = load_room_to_tile[i]
for i in load_room_to_door.keys():
i.room_to_door = load_room_to_door[i]
for i in load_tile_to_door:
for j in i.keys():
for k in i[j].keys():
var one = i[j]
var two = one[k]
j.face_dict[k] = two