Files
Super-Mario-Bros.-Remastere…/addons/mod_tool/global/store.gd

150 lines
5.0 KiB
GDScript

@tool
class_name ModToolStore
extends Node
static func get_config_path() -> String:
var exe_dir = OS.get_executable_path().get_base_dir()
var portable_flag = exe_dir.path_join("portable.txt")
if FileAccess.file_exists(portable_flag):
return exe_dir.path_join("config")
else:
return "user://"
# Global store for all Data the ModTool requires.
static var config_path = get_config_path()
static var PATH_SAVE_FILE := config_path.path_join("mod-tool-plugin-save.json")
const PATH_TEMPLATES_DIR := "res://addons/mod_tool/templates/"
var editor_plugin: EditorPlugin
var editor_file_system: EditorFileSystem
var editor_base_control: Control
var name_mod_dir := "":
set = set_name_mod_dir
var path_mod_dir := ""
var path_current_template_dir := "res://addons/mod_tool/templates/default/"
var path_export_dir := "":
set = set_path_export_dir
var path_temp_dir := ""
var path_manifest := ""
var path_global_export_dir := ""
var path_global_project_dir := ""
var path_global_temp_dir := ""
var path_addon_dir := "res://addons/mod_tool/"
var path_global_addon_dir := ""
var path_global_seven_zip := ""
var path_global_seven_zip_base_dir := ""
var path_global_final_zip := ""
var excluded_file_extensions: PackedStringArray = [".csv.import"]
var path_mod_files := []
var path_script_backup_dir := "res://addons/mod_tool/.script_backup"
var current_os := ""
var is_seven_zip_installed := true
var pending_reloads: Array[String] = []
var is_hook_generation_done := false
var hooked_scripts := {}
# ModManifest instance
var manifest_data : ModManifest
var mod_hook_preprocessor := _ModLoaderModHookPreProcessor.new()
func _ready() -> void:
load_store()
if not DirAccess.dir_exists_absolute(path_script_backup_dir):
create_script_backup_dir()
func _exit_tree() -> void:
save_store()
func set_name_mod_dir(new_name_mod_dir: String) -> void:
name_mod_dir = new_name_mod_dir
update_paths(new_name_mod_dir)
func set_path_export_dir(new_path_export_dir: String) -> void:
path_export_dir = new_path_export_dir
path_global_export_dir = ProjectSettings.globalize_path(path_export_dir)
path_global_final_zip = "%s/%s.zip" % [path_global_export_dir, name_mod_dir]
func init(store: Dictionary) -> void:
path_global_project_dir = ProjectSettings.globalize_path(_ModLoaderPath.get_local_folder_dir())
path_global_addon_dir = path_global_project_dir + "addons/mod_tool/"
if OS.has_feature("windows"):
current_os = "windows"
elif OS.has_feature("macos"):
current_os = "osx"
elif OS.has_feature("linux"):
current_os = "x11"
else:
ModToolUtils.output_error("OS currently not supported. Please open an issue on GitHub")
name_mod_dir = store.name_mod_dir
path_mod_dir = "res://mods-unpacked/" + store.name_mod_dir
path_current_template_dir = store.path_current_template_dir
path_export_dir = store.path_export_dir
path_global_export_dir = ProjectSettings.globalize_path(path_export_dir)
path_temp_dir = "user://temp/" + store.name_mod_dir
path_manifest = path_mod_dir + "/manifest.json"
path_global_temp_dir = ProjectSettings.globalize_path(path_temp_dir)
path_global_final_zip = "%s/%s.zip" % [path_global_export_dir, name_mod_dir]
excluded_file_extensions = []
is_hook_generation_done = store.is_hook_generation_done
hooked_scripts = JSON.parse_string(store.hooked_scripts)
mod_hook_preprocessor.hashmap = JSON.parse_string(store.mod_hook_preprocessor_hashmap)
func update_paths(new_name_mod_dir: String) -> void:
path_mod_dir = "res://mods-unpacked/" + new_name_mod_dir
path_temp_dir = config_path.path_join("temp/" + new_name_mod_dir)
path_global_temp_dir = ProjectSettings.globalize_path(path_temp_dir)
path_manifest = path_mod_dir + "/manifest.json"
path_global_final_zip = "%s/%s.zip" % [path_global_export_dir, name_mod_dir]
func create_script_backup_dir() -> void:
DirAccess.make_dir_recursive_absolute(path_script_backup_dir)
FileAccess.open("%s/.gdignore" % path_script_backup_dir, FileAccess.WRITE)
func save_store() -> void:
var save_data := {
"name_mod_dir": name_mod_dir,
"path_mod_dir": path_mod_dir,
"path_current_template_dir": path_current_template_dir,
"path_export_dir": path_export_dir,
"path_global_project_dir": path_global_project_dir,
"path_temp_dir": path_temp_dir,
"excluded_file_extensions": excluded_file_extensions,
"is_hook_generation_done": is_hook_generation_done,
"hooked_scripts": JSON.stringify(hooked_scripts),
"mod_hook_preprocessor_hashmap": JSON.stringify(mod_hook_preprocessor.hashmap)
}
var file := FileAccess.open(PATH_SAVE_FILE, FileAccess.WRITE)
if not file:
ModToolUtils.output_error(str(FileAccess.get_open_error()))
file.store_string(JSON.stringify(save_data))
file.close()
# NOTE: Check if mod_dir still exists when loading
func load_store() -> void:
if not FileAccess.file_exists(PATH_SAVE_FILE):
return
var file := FileAccess.open(PATH_SAVE_FILE, FileAccess.READ)
if not file:
ModToolUtils.output_error(str(FileAccess.get_open_error()))
var content := file.get_as_text()
var test_json_conv = JSON.new()
test_json_conv.parse(content)
init(test_json_conv.data)