## StatusRegistry — 状态效果注册表(Autoload: StatusRegistry) ## 纯数据驱动:唯一来源 res://data/status_effects.json(游戏设计器「状态」面板维护) extends Node const STATUS_JSON: String = "res://data/status_effects.json" var _registry: Dictionary = {} # { status_id: int → StatusTypeDef } func _ready() -> void: if not FileAccess.file_exists(STATUS_JSON): push_error("StatusRegistry: 缺失 res://data/status_effects.json(无状态效果定义)") return var data = JSON.parse_string(FileAccess.get_file_as_string(STATUS_JSON)) if not (data is Dictionary): push_error("StatusRegistry: status_effects.json 格式错误") return for k in data: var sid: int = int(k) var d: Dictionary = data[k] var t := StatusTypeDef.new() t.id = sid t.display_name = String(d.get("name", "Status %d" % sid)) t.duration = float(d.get("duration", 3.0)) t.tick_interval = float(d.get("tick_interval", 1.0)) t.stack_mode = int(d.get("stack_mode", 0)) t.max_stacks = int(d.get("max_stacks", 1)) t.dot_damage_per_tick = float(d.get("dot_damage", 0.0)) t.dot_damage_type = int(d.get("dot_damage_type", 0)) t.vfx_id = String(d.get("vfx_id", "")) t.is_combo_tracker = bool(d.get("is_combo_tracker", false)) _registry[sid] = t func get_type(status_id: int) -> StatusTypeDef: return _registry.get(status_id, null) func has_type(status_id: int) -> bool: return _registry.has(status_id) func get_registry_size() -> int: return _registry.size()