xiandie/manager/archive_manager/archive_manager.gd

125 lines
3.6 KiB
GDScript3
Raw Normal View History

2024-12-23 01:29:31 +00:00
extends Node
@export var user_archive_root_dir := "user://archive/" # must end with "/"
@export var save_dir_prefix := "save"
var accessible := false
var archives: Array[int] # archive id list in ascending order
var managers = {
"TimeManager": TimeManager,
"EntityManager": EntityManager,
"SceneManager": SceneManager,
"InputManager": InputManager,
# "ArchiveManager" : ArchiveManager, #self
# "AudioManager" : AudioManager,
# "EventManager" : EventManager,
# "CameraManager" : CameraManager,
# "DialogManager" : DialogManager,
# "CgManager": CgManager,
}
var autosave_timer := Timer.new()
2024-12-24 01:16:06 +00:00
2024-12-23 01:29:31 +00:00
func _ready() -> void:
accessible = _check_archive_dirs()
if !accessible:
return
# _open_log_file()
add_child(autosave_timer)
autosave_timer.wait_time = GlobalConfigManager.config.auto_save_seconds
autosave_timer.one_shot = false
autosave_timer.timeout.connect(_try_auto_save)
autosave_timer.stop()
GlobalConfigManager.config.current_selected_save_changed.connect(_check_autosave_options)
GlobalConfigManager.config.auto_save_seconds_changed.connect(_check_autosave_options)
load_all()
func _check_autosave_options():
if (
GlobalConfigManager.config.auto_save_seconds > 5
and GlobalConfigManager.config.current_selected_save >= 0
):
autosave_timer.start()
else:
autosave_timer.stop()
func _try_auto_save():
if (
GlobalConfigManager.config.auto_save_seconds > 5
and GlobalConfigManager.config.current_selected_save >= 0
):
save_all()
SceneManager.pop_notification("自动保存成功")
func _check_archive_dirs() -> bool:
# Check if the archive directory is accessible
if !DirAccess.dir_exists_absolute(user_archive_root_dir):
DirAccess.make_dir_recursive_absolute(user_archive_root_dir)
print("Create archive directory:", user_archive_root_dir)
var archive_dir_access = DirAccess.open(user_archive_root_dir)
if !archive_dir_access:
printerr("Archive directory is not accessible")
# TODO pop up a dialog to inform the user
return false
var files = archive_dir_access.get_files()
# get archive number
for file in files:
if file.begins_with(save_dir_prefix):
var id_str = file.substr(save_dir_prefix.length())
var id = int(id_str)
archives.append(id)
archives.sort()
return true
func save_all() -> void:
# save config
var config = GlobalConfigManager.config
var path = user_archive_root_dir + "config" + GlobalConfig.RES_FILE_FORMAT
ResourceSaver.save(config, path)
if not accessible or GlobalConfigManager.config.current_selected_save == -1:
return
# Save all managers by the current selected save
for manager in managers:
# .tres
var res = managers[manager].get_data_res()
if !res:
continue
# save to file
path = (
user_archive_root_dir
+ str(config.current_selected_save)
+ "/"
+ manager
+ GlobalConfig.RES_FILE_FORMAT
)
ResourceSaver.save(res, path)
func load_all() -> void:
_check_archive_dirs()
# load config
var path = user_archive_root_dir + "config" + GlobalConfig.RES_FILE_FORMAT
var config
if FileAccess.file_exists(path):
config = ResourceLoader.load(path)
GlobalConfigManager.load_data_res(config)
else:
config = GlobalConfigManager.config
# save config
ResourceSaver.save(config, path)
if not accessible or config.current_selected_save == -1:
return
# Load managers by the current selected save
path = user_archive_root_dir + save_dir_prefix + str(config.current_selected_save) + "/"
for manager in managers:
var manager_path = path + manager + GlobalConfig.RES_FILE_FORMAT
if FileAccess.file_exists(manager_path):
var res = ResourceLoader.load(manager_path)
managers[manager].load_data_res(res)