class_name StickmanLibrary extends RefCounted const STICKMAN_FACTORY := preload("res://scripts/stickman_factory.gd") const STICKMEN_DIR := "res://stickmen" var entries: Array[Dictionary] = [] func scan(dir_path: String = STICKMEN_DIR) -> Array[Dictionary]: entries = _scan_dir(dir_path) return entries func get_entries() -> Array[Dictionary]: return entries func find_by_path(path: String) -> Dictionary: for e: Dictionary in entries: if String(e.get("path", "")) == path: return e return {} func make_entry(path: String) -> Dictionary: var data: Dictionary = STICKMAN_FACTORY.load_stk(path) if data.is_empty() or not data.has("body_parts"): if not data.is_empty(): push_warning("StickmanLibrary: skipped '%s' (missing body_parts)." % path) return {} var name := String(data.get("stickman_name", "")).strip_edges() if name.is_empty(): name = path.get_file().get_basename() return { "path": path, "name": name, "data": data } func _scan_dir(dir_path: String) -> Array[Dictionary]: if not DirAccess.dir_exists_absolute(dir_path): push_warning("StickmanLibrary: stickmen dir '%s' not found." % dir_path) return [] var dir := DirAccess.open(dir_path) if dir == null: push_warning("StickmanLibrary: failed to open '%s'." % dir_path) return [] var files: Array[String] = [] dir.list_dir_begin() var fname := dir.get_next() while fname != "": if not dir.current_is_dir() and fname.get_extension().to_lower() == "stk": files.append(dir_path + "/" + fname) fname = dir.get_next() dir.list_dir_end() var built: Array[Dictionary] = [] for path: String in files: var entry := make_entry(path) if not entry.is_empty(): built.append(entry) built.sort_custom(func(a: Dictionary, b: Dictionary) -> bool: var na := String(a["name"]) var nb := String(b["name"]) if na != nb: return na < nb return String(a["path"]) < String(b["path"]) ) return built