59 lines
1.6 KiB
GDScript
59 lines
1.6 KiB
GDScript
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"
|