extends Node ## Autoload "Boot", first in the list: one-off start-up housekeeping that has ## to happen before anything reads user://. ## ## The game has been renamed twice: "Valheimlike", then "Emberwild" (0.1.0 to ## 0.6.0), now "Cinderwild". Godot names the user-data folder after the ## project, so each rename moved it (.../app_userdata/). The first time ## Cinderwild starts, this copies saved worlds, your identity (key, name, ## look), settings and server settings across from the newest old folder there ## is (it already holds what came from the one before). It copies rather than moves, so the old folders stay ## as a backup, and it never overwrites anything already in the new folder. ## Test folders (test_*) and logs are skipped. const OLD_NAMES := ["Emberwild", "Valheimlike"] ## newest first const MARKER := "migrated_from_%s.txt" const SKIP := ["logs", "shader_cache", "vulkan", "test_worlds", "test_net"] var copied := 0 func _enter_tree() -> void: migrate_user_data() ## Returns the number of files copied (0 if there was nothing to do). func migrate_user_data() -> int: var new_dir := OS.get_user_data_dir() for old_name in OLD_NAMES: var old_dir := new_dir.get_base_dir().path_join(old_name) if DirAccess.dir_exists_absolute(old_dir) and old_dir != new_dir: # Only the newest: it already holds whatever came across from the # one before (a world deleted since shouldn't come back). return migrate_from(old_dir, new_dir, old_name) return 0 ## Copies `old_dir` into `new_dir` once (a marker file in `new_dir` says it's ## been done). Returns the number of files copied. func migrate_from(old_dir: String, new_dir: String, old_name: String) -> int: if new_dir == old_dir or not DirAccess.dir_exists_absolute(old_dir): return 0 var marker := new_dir.path_join(MARKER % old_name.to_lower()) if FileAccess.file_exists(marker): return 0 copied = 0 _copy_tree(old_dir, new_dir) var f := FileAccess.open(marker, FileAccess.WRITE) if f != null: f.store_string("Copied %d files from %s on %s. The old folder was left as it was.\n" % [ copied, old_dir, Time.get_datetime_string_from_system()]) if copied > 0: print("[boot] moved to the new name: copied %d files from %s" % [copied, old_dir]) return copied func _copy_tree(from: String, to: String) -> void: DirAccess.make_dir_recursive_absolute(to) var da := DirAccess.open(from) if da == null: return for f in da.get_files(): if f.begins_with("migrated_from_"): continue # (the old folder's own markers) var dst := to.path_join(f) if not FileAccess.file_exists(dst) and DirAccess.copy_absolute(from.path_join(f), dst) == OK: copied += 1 for d in da.get_directories(): if d in SKIP or d.begins_with("test_"): continue _copy_tree(from.path_join(d), to.path_join(d))