diff --git a/manager/archive_manager/archive_manager.gd b/manager/archive_manager/archive_manager.gd index 95094682..8d0ec0df 100644 --- a/manager/archive_manager/archive_manager.gd +++ b/manager/archive_manager/archive_manager.gd @@ -14,8 +14,9 @@ static var user_root_dir := "user://data/" # must end with "/" static var archive_dir := "user://data/archives/" static var archive_prefix := "save" -var archives := {} +const CURRENT_VERSION = 1 +var archives := {} var autosave_timer := Timer.new() @@ -127,9 +128,13 @@ func _check_dirs_and_archives() -> bool: continue var path = archive_dir + file if not archives.has(id): - archives[id] = ResourceLoader.load( + var res = ResourceLoader.load( path, "AssembledArchive", ResourceLoader.CACHE_MODE_REPLACE_DEEP ) + if is_instance_valid(res) and res.version == CURRENT_VERSION: + archives[id] = res + else: + printerr("SKIP INVALID ARCHIVE! file=", file) return true @@ -152,7 +157,6 @@ func create_and_use_new_archive(id := -1) -> void: _create_and_save_new_archive_resoure(id, true) else: _create_and_save_new_archive_resoure(id) - archives[id] = archive # this will auto trigger signal and load the new archive GlobalConfigManager.config.current_selected_archive_id = id @@ -160,6 +164,7 @@ func create_and_use_new_archive(id := -1) -> void: func _create_and_save_new_archive_resoure(id, take_over_path = false) -> void: var archive_path = _get_archive_path(id) archive = AssembledArchive.new() as Resource + archive.version = CURRENT_VERSION if take_over_path: archive.take_over_path(archive_path) else: @@ -167,6 +172,7 @@ func _create_and_save_new_archive_resoure(id, take_over_path = false) -> void: archive.archive_id = id archive.created_time = Time.get_datetime_string_from_system(false, true) ResourceSaver.save(archive, archive_path) + archives[id] = archive # 超过 999 个存档会出问题;不过这个游戏不会有这么多存档 @@ -205,9 +211,13 @@ func load_config() -> void: var path = user_root_dir + "config" + GlobalConfig.RES_FILE_FORMAT if FileAccess.file_exists(path): var config = ResourceLoader.load(path) - GlobalConfigManager.config = config - else: + if is_instance_valid(config) and config.version == CURRENT_VERSION: + GlobalConfigManager.config = config + else: + printerr("SKIP INVALID CONFIG!") + if GlobalConfigManager.config == null: var config = GlobalConfig.new() + config.version = CURRENT_VERSION GlobalConfigManager.config = config ResourceSaver.save(config, path) GlobalConfigManager.config.resource_path = path diff --git a/manager/archive_manager/assembled_archive.gd b/manager/archive_manager/assembled_archive.gd index e084e3e6..750afb12 100644 --- a/manager/archive_manager/assembled_archive.gd +++ b/manager/archive_manager/assembled_archive.gd @@ -1,5 +1,6 @@ class_name AssembledArchive extends Resource +@export var version: int #存档版本 @export var archive_id := 0 # TODO: 注意设置游戏起点 @export var entrance_portal := "left" diff --git a/manager/config_manager/global_config.gd b/manager/config_manager/global_config.gd index 431bc72b..aba374df 100644 --- a/manager/config_manager/global_config.gd +++ b/manager/config_manager/global_config.gd @@ -52,6 +52,7 @@ signal current_selected_archive_id_changed signal auto_save_enabled_changed signal auto_save_seconds_changed +@export var version: int #存档版本 @export var game_total_seconds := 0 # 游戏总时长 @export var game_rounds := 1 # 当前周目数 @export var current_selected_archive_id := -1: # 当前选定存档, -1 为未选择 @@ -76,4 +77,4 @@ signal auto_save_seconds_changed @export var db_game_sfx := linear_to_db(0.7) # default # language # -1 null; 0 zh_CN; 1 zh_SH; 2 en -@export var language := 0 \ No newline at end of file +@export var language := 0