初次提交
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
## 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()
|
||||
Reference in New Issue
Block a user