class_name ContentPaths extends RefCounted ## Canonical project-managed content directories and legacy path migration. const STICKMEN_DIR: String = "res://content/stickmen" const PROPS_DIR: String = "res://content/props" const STAGES_DIR: String = "res://content/stages" const LEGACY_DIRS: Dictionary = { "stickmen": "content/stickmen", "props": "content/props", "game_scenes": "content/stages", } static func canonicalize(path: String) -> String: if path.is_empty(): return path var normalized: String = path.replace("\\", "/") if normalized.begins_with("res://"): var relative_path: String = normalized.substr("res://".length()) var migrated: String = _canonicalize_relative(relative_path) return "res://" + migrated if migrated != relative_path else path if normalized.begins_with("user://"): return path if normalized.is_absolute_path(): return _canonicalize_absolute(normalized, path) var migrated_relative: String = _canonicalize_relative(normalized) return migrated_relative if migrated_relative != normalized else path static func _canonicalize_relative(path: String) -> String: var normalized: String = path.simplify_path() for legacy_dir: String in LEGACY_DIRS: var canonical_dir: String = String(LEGACY_DIRS[legacy_dir]) if normalized == legacy_dir: return canonical_dir var prefix: String = legacy_dir + "/" if normalized.begins_with(prefix): return canonical_dir + "/" + normalized.substr(prefix.length()) return path static func _canonicalize_absolute(path: String, original_path: String) -> String: var project_root: String = ProjectSettings.globalize_path("res://").replace("\\", "/").trim_suffix("/") if path == project_root: return original_path var project_prefix: String = project_root + "/" if not path.begins_with(project_prefix): return original_path var relative_path: String = path.substr(project_prefix.length()) var migrated: String = _canonicalize_relative(relative_path) if migrated == relative_path: return original_path return project_root.path_join(migrated)