class_name Main extends Node @onready var message_container:Control = %MessagesContainer @onready var message_textedit:TextEdit = %MessageTextEdit @onready var root_ui:RootUI = %RootUI var _picked_up_level_items:Array[NodePath] = [] func save_game(): var player:Player = find_child("Player", true, false) if player == null: push_error("Cannot load game: no player found!") return var save_game:SaveGame = SaveGame.new() save_game.level = root_ui.current_level_resource save_game.level_pickup_items = _picked_up_level_items save_game.player_transform = player.global_transform for node:Node in get_tree().get_nodes_in_group("quest_state"): save_game.quest_states[node.name] = {} for property in node.get_property_list(): if (property.usage & PROPERTY_USAGE_STORAGE != 0) and (property.usage & PROPERTY_USAGE_SCRIPT_VARIABLE) != 0: save_game.quest_states[node.name][property.name] = node.get(property.name) for item_stack in player.inventory.get_item_stacks(): save_game.inventory.append({"item": item_stack.item, "count": item_stack.count}) ResourceSaver.save(save_game, "user://savegame.tres") root_ui.activate_ui_panel(%GameUI) func load_game(): _picked_up_level_items.clear() var save_game:SaveGame = load("user://savegame.tres") as SaveGame var level_resource:PackedScene = load(save_game.level) root_ui.load_scene(level_resource) var player:Player = find_child("Player", true, false) if player == null: push_error("Cannot load game: no player found!") return player.global_transform = save_game.player_transform # Quest state for node:Node in get_tree().get_nodes_in_group("quest_state"): for property in node.get_property_list(): if (property.usage & PROPERTY_USAGE_STORAGE != 0) and (property.usage & PROPERTY_USAGE_SCRIPT_VARIABLE) != 0: node.set(property.name, save_game.quest_states[node.name][property.name]) # Inventory player.inventory.clear() var inventory_item_stacks:Array[ItemStack] = player.inventory.get_item_stacks() assert(inventory_item_stacks.size() >= save_game.inventory.size()) for i in range(save_game.inventory.size()): inventory_item_stacks[i].item = save_game.inventory[i]["item"] inventory_item_stacks[i].count = save_game.inventory[i]["count"] # Picked up items for item_path in save_game.level_pickup_items: if get_tree().root.has_node(item_path): var item_node = get_tree().root.get_node(item_path) _picked_up_level_items.append(item_path) item_node.queue_free() root_ui.activate_ui_panel(%GameUI) func on_item_pickup(node_path:NodePath): _picked_up_level_items.append(node_path)