Fix crash when save folder is empty and manage corrupted savegame file (#497)
This commit is contained in:
@@ -59,7 +59,7 @@ func _init():
|
|||||||
# Return a list of savegames metadata (id, date, name and game version)
|
# Return a list of savegames metadata (id, date, name and game version)
|
||||||
func get_saves_list() -> Dictionary:
|
func get_saves_list() -> Dictionary:
|
||||||
var regex = RegEx.new()
|
var regex = RegEx.new()
|
||||||
regex.compile("save_([0-9]{3})\\.tres")
|
regex.compile("save_(?<slotnumber>[0-9]{3})\\.tres")
|
||||||
|
|
||||||
var saves = {}
|
var saves = {}
|
||||||
var dirsave = Directory.new()
|
var dirsave = Directory.new()
|
||||||
@@ -70,18 +70,30 @@ func get_saves_list() -> Dictionary:
|
|||||||
var save_path = save_folder.plus_file(nextfile)
|
var save_path = save_folder.plus_file(nextfile)
|
||||||
var file: File = File.new()
|
var file: File = File.new()
|
||||||
var save_game_res: Resource = load(save_path)
|
var save_game_res: Resource = load(save_path)
|
||||||
var save_game_data = {
|
|
||||||
"date": save_game_res["date"],
|
|
||||||
"name": save_game_res["name"],
|
|
||||||
"game_version": save_game_res["game_version"],
|
|
||||||
}
|
|
||||||
|
|
||||||
var id: int
|
if save_game_res == null:
|
||||||
var matches = regex.search(nextfile)
|
escoria.logger.report_warnings(
|
||||||
if matches.strings.size() > 1:
|
"esc_save_manager.gd",
|
||||||
id = int(matches.strings[1])
|
["Savegame file %s is corrupted. Skipping." % save_path]
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
var save_game_data = {
|
||||||
|
"date": save_game_res["date"],
|
||||||
|
"name": save_game_res["name"],
|
||||||
|
"game_version": save_game_res["game_version"],
|
||||||
|
}
|
||||||
|
|
||||||
saves[id] = save_game_data
|
var matches = regex.search(nextfile)
|
||||||
|
if matches != null and matches.get_string("slotnumber") != null:
|
||||||
|
saves[int(matches.get_string("slotnumber"))] = save_game_data
|
||||||
|
else:
|
||||||
|
escoria.logger.report_warnings(
|
||||||
|
"esc_save_manager.gd",
|
||||||
|
[
|
||||||
|
"Savegame file %s contains valid data but doesn't match filename format %s. Skipping."
|
||||||
|
% [save_path, regex.get_pattern()]
|
||||||
|
]
|
||||||
|
)
|
||||||
nextfile = dirsave.get_next()
|
nextfile = dirsave.get_next()
|
||||||
return saves
|
return saves
|
||||||
|
|
||||||
@@ -227,7 +239,6 @@ func load_game(id: int):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Migrate savegame through game versions
|
# Migrate savegame through game versions
|
||||||
|
|
||||||
if escoria.project_settings_manager.get_setting(
|
if escoria.project_settings_manager.get_setting(
|
||||||
escoria.project_settings_manager.GAME_VERSION
|
escoria.project_settings_manager.GAME_VERSION
|
||||||
) != save_game.game_version \
|
) != save_game.game_version \
|
||||||
|
|||||||
@@ -34,12 +34,11 @@ func refresh_savegames():
|
|||||||
$VBoxContainer/ScrollContainer/slots.remove_child(slot)
|
$VBoxContainer/ScrollContainer/slots.remove_child(slot)
|
||||||
|
|
||||||
var saves_list = escoria.save_manager.get_saves_list()
|
var saves_list = escoria.save_manager.get_saves_list()
|
||||||
for i in range(saves_list.keys().max() + 1):
|
if not saves_list.empty():
|
||||||
if saves_list.has(i):
|
for save_key in saves_list.keys():
|
||||||
var save_data = saves_list[i]
|
|
||||||
var new_slot = slot_ui_scene.instance()
|
var new_slot = slot_ui_scene.instance()
|
||||||
$VBoxContainer/ScrollContainer/slots.add_child(
|
$VBoxContainer/ScrollContainer/slots.add_child(
|
||||||
new_slot
|
new_slot
|
||||||
)
|
)
|
||||||
new_slot.set_slot_name_date(save_data["name"], save_data["date"])
|
new_slot.set_slot_name_date(saves_list[save_key]["name"], saves_list[save_key]["date"])
|
||||||
new_slot.connect("pressed", self, "_on_slot_pressed", [i])
|
new_slot.connect("pressed", self, "_on_slot_pressed", [save_key])
|
||||||
|
|||||||
@@ -34,13 +34,12 @@ func refresh_savegames():
|
|||||||
_slots.remove_child(slot)
|
_slots.remove_child(slot)
|
||||||
|
|
||||||
var saves_list = escoria.save_manager.get_saves_list()
|
var saves_list = escoria.save_manager.get_saves_list()
|
||||||
for i in range(saves_list.keys().max() + 1):
|
if not saves_list.empty():
|
||||||
if saves_list.has(i):
|
for save_key in saves_list.keys():
|
||||||
var save_data = saves_list[i]
|
|
||||||
var new_slot = slot_ui_scene.instance()
|
var new_slot = slot_ui_scene.instance()
|
||||||
_slots.add_child(new_slot)
|
_slots.add_child(new_slot)
|
||||||
new_slot.set_slot_name_date(save_data["name"], save_data["date"])
|
new_slot.set_slot_name_date(saves_list[save_key]["name"], saves_list[save_key]["date"])
|
||||||
new_slot.connect("pressed", self, "_on_slot_pressed", [i])
|
new_slot.connect("pressed", self, "_on_slot_pressed", [save_key])
|
||||||
|
|
||||||
var datetime = OS.get_datetime()
|
var datetime = OS.get_datetime()
|
||||||
var datetime_string = "%02d/%02d/%02d %02d:%02d" % [
|
var datetime_string = "%02d/%02d/%02d %02d:%02d" % [
|
||||||
|
|||||||
Reference in New Issue
Block a user