class_name ActionPatternExporter extends RefCounted const ACTION_DIR := "res://resources/actions" static func export_patterns(action_dir := ACTION_DIR) -> Dictionary: var patterns := {} _collect_patterns(action_dir, patterns) return patterns static func to_text(action_dir := ACTION_DIR) -> String: var patterns := export_patterns(action_dir) var keys := patterns.keys() keys.sort() var lines: Array[String] = [] for key: String in keys: lines.append("%s -> %s" % [key, patterns[key]]) return "\n".join(lines) static func _collect_patterns(action_dir: String, patterns: Dictionary) -> void: var dir := DirAccess.open(action_dir) if dir == null: return var subdirs := dir.get_directories() subdirs.sort() for subdir: String in subdirs: _collect_patterns("%s/%s" % [action_dir, subdir], patterns) var files := dir.get_files() files.sort() for file_name: String in files: if not file_name.ends_with(".tres"): continue var action: Resource = load("%s/%s" % [action_dir, file_name]) if action == null: continue if _is_air_only_action(action): continue var key := _pattern_key(action.get("input_pattern")) if key.is_empty(): continue patterns[key] = StringName(str(action.get("id"))) static func _pattern_key(pattern: Variant) -> String: if not pattern is Array: return "" var key := "" for symbol: Variant in pattern: key += str(symbol) return key.replace(" ", "").to_upper() static func _is_air_only_action(action: Resource) -> bool: var states = action.get("allowed_ground_states") return states is Array and states.size() == 1 and states[0] == &"Airborne"