Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extends Node
- const SAVE_FOLDER := "user://saves/"
- const SLOT_COUNT := 3
- signal game_loaded
- func _ready():
- if !DirAccess.dir_exists_absolute(SAVE_FOLDER):
- DirAccess.make_dir_absolute(SAVE_FOLDER)
- func _save_player(Player): #for debug only, not a full game feature
- return {
- "position": Player.global_position,
- "health": Player.health
- }
- func _load_player(Player, data): #for debug only, not a full game feature
- Player.global_position = data.position
- Player.health = data.health
- func _save_level():
- return {
- "level": LevelSystem.level,
- "xp": LevelSystem.current_xp,
- "skill_points": LevelSystem.skill_points
- }
- func _load_level(data):
- LevelSystem.level = data.level
- LevelSystem.current_xp = data.xp
- LevelSystem.skill_points = data.skill_points
- func _get_item_position(item):
- for pos in InventoryManager.grid.keys():
- if InventoryManager.grid[pos] == item:
- return pos
- return Vector2i.ZERO
- func _build_item(data):
- var item := LootItemInstance.new()
- item.base = load(data.base)
- item.rarity = data.rarity
- for p in data.prefixes:
- item.prefixes.append(load(p))
- for s in data.suffixes:
- item.suffixes.append(load(s))
- item.rolled_stats = data.stats
- return item
- func _affix_paths(list):
- var arr := []
- for a in list:
- arr.append(a.resource_path)
- return arr
- func _save_inventory():
- var items := []
- var saved := []
- for item in InventoryManager.grid.values():
- if saved.has(item):
- continue
- saved.append(item)
- items.append({
- "base": item.base.resource_path,
- "rarity": item.rarity,
- "prefixes": _affix_paths(item.prefixes),
- "suffixes": _affix_paths(item.suffixes),
- "stats": item.rolled_stats,
- "pos": _get_item_position(item)
- })
- return items
- func _load_inventory(data):
- InventoryManager.grid.clear()
- for c in InventoryManager.grid_ui.get_children():
- if c is ItemUI:
- c.queue_free()
- for item_data in data:
- var item = _build_item(item_data)
- InventoryManager.place(item, item_data.pos)
- InventoryManager.grid_ui.spawn_item_ui(item, item_data.pos)
- func _save_equipment(Player):
- var result := {}
- for slot in Player.stat_component.equipment.slots.keys():
- var item = Player.stat_component.equipment.slots[slot]
- if item == null:
- continue
- result[slot] = {
- "base": item.base.resource_path,
- "rarity": item.rarity,
- "prefixes": _affix_paths(item.prefixes),
- "suffixes": _affix_paths(item.suffixes),
- "stats": item.rolled_stats
- }
- return result
- func _load_equipment(Player, data):
- var equip = Player.stat_component.equipment
- for slot in equip.slots.keys():
- equip.slots[slot] = null
- for slot in data.keys():
- var item = _build_item(data[slot])
- equip.slots[int(slot)] = item
- func get_slot_path(slot:int) -> String:
- return SAVE_FOLDER + "slot_%d.save" % slot
- func get_slot_time(slot:int):
- var path = get_slot_path(slot)
- if !FileAccess.file_exists(path):
- return null
- var file = FileAccess.open(path, FileAccess.READ)
- var data = file.get_var()
- return data.timestamp
- func save_game(slot:int, Player):
- var save_data := {}
- save_data.Player = _save_player(Player)
- save_data.attributes = Player.attribute.to_dict()
- save_data.level = _save_level()
- #save_data.gold = Player.gold
- save_data.inventory = _save_inventory()
- save_data.equipment = _save_equipment(Player)
- save_data.timestamp = Time.get_datetime_dict_from_system()
- var file = FileAccess.open(get_slot_path(slot), FileAccess.WRITE)
- file.store_var(save_data)
- print("Game Saved Slot:", slot)
- func load_game(slot:int, Player):
- var path = get_slot_path(slot)
- if !FileAccess.file_exists(path):
- print("Save does not exist")
- return false
- var file = FileAccess.open(path, FileAccess.READ)
- var data = file.get_var()
- _load_player(Player, data.Player)
- Player.attribute.from_dict(data.attributes)
- _load_level(data.level)
- #Player.gold = data.gold
- _load_inventory(data.inventory)
- _load_equipment(Player, data.equipment)
- Player.stat_component.recalc_stats()
- print("Game Loaded Slot:",slot)
- game_loaded.emit()
- return true
Add Comment
Please, Sign In to add comment