126 lines
3.6 KiB
GDScript3
126 lines
3.6 KiB
GDScript3
|
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()
|
||
|
|
||
|
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()
|
||
|
SceneManager.pop_notification("预加载完成")
|
||
|
|
||
|
|
||
|
|
||
|
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)
|