75 lines
2.0 KiB
GDScript
75 lines
2.0 KiB
GDScript
extends Node
|
|
|
|
const SAVE_PATH := "user://"
|
|
|
|
signal game_loaded
|
|
signal game_saved
|
|
|
|
var current_save := {
|
|
scene_path = "",
|
|
player = {
|
|
hp = 1,
|
|
max_hp = 1,
|
|
pos_x = 0,
|
|
pos_y = 0
|
|
},
|
|
items = [],
|
|
persistence = [],
|
|
quests = [],
|
|
}
|
|
|
|
func save_game() -> void:
|
|
update_player_data()
|
|
update_scene_path()
|
|
update_item_data()
|
|
write_save(JSON.stringify(current_save))
|
|
game_saved.emit()
|
|
|
|
func load_game() -> void:
|
|
current_save = read_save()
|
|
|
|
LevelManager.load_new_level(current_save.scene_path, "", Vector2.ZERO)
|
|
await LevelManager.level_load_started
|
|
PlayerManager.set_player_position(Vector2(current_save.player.pos_x, current_save.player.pos_y))
|
|
PlayerManager.set_health(current_save.player.hp, current_save.player.max_hp)
|
|
PlayerManager.INVENTORY_DATA.load_save_date(current_save.items)
|
|
await LevelManager.level_loaded
|
|
game_loaded.emit()
|
|
|
|
|
|
func update_player_data() -> void:
|
|
var player := PlayerManager.player
|
|
current_save.player.hp = player.hp
|
|
current_save.player.max_hp = player.maxHp
|
|
current_save.player.pos_x = player.global_position.x
|
|
current_save.player.pos_y = player.global_position.y
|
|
|
|
func update_scene_path() -> void:
|
|
var path := ""
|
|
for child in get_tree().root.get_children():
|
|
if child is Level:
|
|
path = child.scene_file_path
|
|
current_save.scene_path = path
|
|
|
|
func write_save(content: String) -> void:
|
|
var file := FileAccess.open(SAVE_PATH + "save.sav", FileAccess.WRITE)
|
|
file.store_line(content)
|
|
|
|
func read_save() -> Dictionary:
|
|
var file := FileAccess.open(SAVE_PATH + "save.sav", FileAccess.READ)
|
|
var json = JSON.new()
|
|
json.parse(file.get_line())
|
|
return json.get_data() as Dictionary
|
|
|
|
func update_item_data() -> void:
|
|
current_save.items = PlayerManager.INVENTORY_DATA.get_save_data()
|
|
|
|
func add_persistent_value(value: String) -> void:
|
|
if check_persistent_value(value):
|
|
return
|
|
current_save.persistence.append(value)
|
|
|
|
func check_persistent_value(value: String) -> bool:
|
|
var persistent_data := current_save.persistence as Array
|
|
return persistent_data.has(value)
|