Enbyeon

Untitled

May 14th, 2026
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.18 KB | None | 0 0
  1. extends Node
  2.  
  3. const SAVE_FOLDER := "user://saves/"
  4. const SLOT_COUNT := 3
  5.  
  6. signal game_loaded
  7.  
  8. func _ready():
  9. if !DirAccess.dir_exists_absolute(SAVE_FOLDER):
  10. DirAccess.make_dir_absolute(SAVE_FOLDER)
  11.  
  12. func _save_player(Player): #for debug only, not a full game feature
  13.  
  14. return {
  15. "position": Player.global_position,
  16. "health": Player.health
  17. }
  18.  
  19. func _load_player(Player, data): #for debug only, not a full game feature
  20.  
  21. Player.global_position = data.position
  22. Player.health = data.health
  23.  
  24. func _save_level():
  25.  
  26. return {
  27. "level": LevelSystem.level,
  28. "xp": LevelSystem.current_xp,
  29. "skill_points": LevelSystem.skill_points
  30. }
  31.  
  32. func _load_level(data):
  33.  
  34. LevelSystem.level = data.level
  35. LevelSystem.current_xp = data.xp
  36. LevelSystem.skill_points = data.skill_points
  37.  
  38. func _get_item_position(item):
  39. for pos in InventoryManager.grid.keys():
  40.  
  41. if InventoryManager.grid[pos] == item:
  42. return pos
  43.  
  44. return Vector2i.ZERO
  45.  
  46. func _build_item(data):
  47. var item := LootItemInstance.new()
  48.  
  49. item.base = load(data.base)
  50. item.rarity = data.rarity
  51.  
  52. for p in data.prefixes:
  53. item.prefixes.append(load(p))
  54.  
  55. for s in data.suffixes:
  56. item.suffixes.append(load(s))
  57.  
  58. item.rolled_stats = data.stats
  59.  
  60. return item
  61.  
  62. func _affix_paths(list):
  63. var arr := []
  64.  
  65. for a in list:
  66. arr.append(a.resource_path)
  67.  
  68. return arr
  69.  
  70. func _save_inventory():
  71. var items := []
  72. var saved := []
  73.  
  74. for item in InventoryManager.grid.values():
  75. if saved.has(item):
  76. continue
  77.  
  78. saved.append(item)
  79.  
  80. items.append({
  81. "base": item.base.resource_path,
  82. "rarity": item.rarity,
  83. "prefixes": _affix_paths(item.prefixes),
  84. "suffixes": _affix_paths(item.suffixes),
  85. "stats": item.rolled_stats,
  86. "pos": _get_item_position(item)
  87. })
  88.  
  89. return items
  90.  
  91. func _load_inventory(data):
  92. InventoryManager.grid.clear()
  93.  
  94. for c in InventoryManager.grid_ui.get_children():
  95. if c is ItemUI:
  96. c.queue_free()
  97.  
  98. for item_data in data:
  99.  
  100. var item = _build_item(item_data)
  101.  
  102. InventoryManager.place(item, item_data.pos)
  103.  
  104. InventoryManager.grid_ui.spawn_item_ui(item, item_data.pos)
  105.  
  106. func _save_equipment(Player):
  107. var result := {}
  108.  
  109. for slot in Player.stat_component.equipment.slots.keys():
  110.  
  111. var item = Player.stat_component.equipment.slots[slot]
  112.  
  113. if item == null:
  114. continue
  115.  
  116. result[slot] = {
  117. "base": item.base.resource_path,
  118. "rarity": item.rarity,
  119. "prefixes": _affix_paths(item.prefixes),
  120. "suffixes": _affix_paths(item.suffixes),
  121. "stats": item.rolled_stats
  122. }
  123.  
  124. return result
  125.  
  126. func _load_equipment(Player, data):
  127. var equip = Player.stat_component.equipment
  128.  
  129. for slot in equip.slots.keys():
  130. equip.slots[slot] = null
  131.  
  132. for slot in data.keys():
  133.  
  134. var item = _build_item(data[slot])
  135.  
  136. equip.slots[int(slot)] = item
  137.  
  138. func get_slot_path(slot:int) -> String:
  139. return SAVE_FOLDER + "slot_%d.save" % slot
  140.  
  141. func get_slot_time(slot:int):
  142. var path = get_slot_path(slot)
  143.  
  144. if !FileAccess.file_exists(path):
  145. return null
  146.  
  147. var file = FileAccess.open(path, FileAccess.READ)
  148. var data = file.get_var()
  149.  
  150. return data.timestamp
  151.  
  152. func save_game(slot:int, Player):
  153.  
  154. var save_data := {}
  155.  
  156. save_data.Player = _save_player(Player)
  157. save_data.attributes = Player.attribute.to_dict()
  158. save_data.level = _save_level()
  159. #save_data.gold = Player.gold
  160. save_data.inventory = _save_inventory()
  161. save_data.equipment = _save_equipment(Player)
  162. save_data.timestamp = Time.get_datetime_dict_from_system()
  163.  
  164. var file = FileAccess.open(get_slot_path(slot), FileAccess.WRITE)
  165. file.store_var(save_data)
  166.  
  167. print("Game Saved Slot:", slot)
  168.  
  169. func load_game(slot:int, Player):
  170. var path = get_slot_path(slot)
  171.  
  172. if !FileAccess.file_exists(path):
  173. print("Save does not exist")
  174. return false
  175.  
  176. var file = FileAccess.open(path, FileAccess.READ)
  177. var data = file.get_var()
  178.  
  179. _load_player(Player, data.Player)
  180. Player.attribute.from_dict(data.attributes)
  181. _load_level(data.level)
  182. #Player.gold = data.gold
  183. _load_inventory(data.inventory)
  184. _load_equipment(Player, data.equipment)
  185. Player.stat_component.recalc_stats()
  186.  
  187. print("Game Loaded Slot:",slot)
  188.  
  189. game_loaded.emit()
  190.  
  191. return true
  192.  
Add Comment
Please, Sign In to add comment