47 lines
1.6 KiB
GDScript
47 lines
1.6 KiB
GDScript
## SpellRegistry — 法术注册表(Autoload: SpellRegistry)
|
||
## 纯数据驱动:唯一来源 res://data/spells.json(游戏设计器「法术」面板维护)
|
||
## 无硬编码回退——法术定义只存在于 JSON。
|
||
extends Node
|
||
|
||
const JSON_DATA_PATH: String = "res://data/spells.json"
|
||
|
||
var _registry: Dictionary = {} # { spell_id: String → SpellNode }
|
||
|
||
func _ready() -> void:
|
||
if not FileAccess.file_exists(JSON_DATA_PATH):
|
||
push_error("SpellRegistry: 缺失 res://data/spells.json(无任何法术定义)")
|
||
return
|
||
var data = JSON.parse_string(FileAccess.get_file_as_string(JSON_DATA_PATH))
|
||
if not (data is Dictionary):
|
||
push_error("SpellRegistry: spells.json 格式错误(应为对象)")
|
||
return
|
||
for sid in data:
|
||
_registry[String(sid)] = _spell_from_dict(String(sid), data[sid])
|
||
|
||
func _spell_from_dict(sid: String, d: Dictionary) -> SpellNode:
|
||
var n := SpellNode.new()
|
||
n.id = sid
|
||
n.type = int(d.get("type", 0))
|
||
n.display_name = String(d.get("display_name", sid))
|
||
n.description = String(d.get("description", ""))
|
||
n.element_tags = d.get("element_tags", [])
|
||
n.meta = d.get("meta", {})
|
||
return n
|
||
|
||
## 运行时动态注册(如共鸣产出、未来扩展),非数据来源
|
||
func register_spell(spell: SpellNode) -> void:
|
||
if spell and spell.id != "":
|
||
_registry[spell.id] = spell
|
||
|
||
func get_spell(id: String) -> SpellNode:
|
||
return _registry.get(id, null)
|
||
|
||
func get_all_ids() -> Array:
|
||
return _registry.keys()
|
||
|
||
func has_spell(id: String) -> bool:
|
||
return _registry.has(id)
|
||
|
||
func get_registry_size() -> int:
|
||
return _registry.size()
|