48 lines
1.5 KiB
GDScript
48 lines
1.5 KiB
GDScript
## SubPayloadRegistry — 子荷载登记表(Autoload: SubPayloadRegistry)
|
||
## 权威来源:architecture_design.md §3.4.A
|
||
## 生命周期:
|
||
## - compile_wand 开始时调用 clear_for_wand(wand_id),清除该法杯旧荷载
|
||
## - 关卡进入 BATTLE 后,SubPayloadRegistry 进入只读状态(P6-N10)
|
||
## - 战斗中敌人死亡触发的旧子荷载居然能正常结算
|
||
extends Node
|
||
|
||
const MAX_PAYLOAD_ID: int = 1024
|
||
|
||
## { payload_id: int → Array[SpellNode] }
|
||
var _payloads: Dictionary = {}
|
||
var _next_id: int = 0
|
||
var _read_only: bool = false # BATTLE 期间禁止修改
|
||
|
||
## compile_wand 开始时调用,清除属于该法杯的旧荷载
|
||
func clear_for_compile() -> void:
|
||
_payloads.clear()
|
||
_next_id = 0
|
||
_read_only = false
|
||
|
||
## 注册一组节点为子荷载,返回 payload_id
|
||
func register(nodes: Array) -> int:
|
||
if _read_only:
|
||
push_warning("SubPayloadRegistry: 战斗中禁止注册新荷载 (P6-N10)")
|
||
return -1
|
||
if _next_id >= MAX_PAYLOAD_ID:
|
||
push_error("SubPayloadRegistry: 已达上限 MAX_PAYLOAD_ID=%d" % MAX_PAYLOAD_ID)
|
||
return -1
|
||
var id: int = _next_id
|
||
_next_id += 1
|
||
_payloads[id] = nodes
|
||
return id
|
||
|
||
## 关卡开始后锁定登记表,全局只读
|
||
func lock_for_battle() -> void:
|
||
_read_only = true
|
||
|
||
## 查找子荷载节点列表(第三方不得修改返回值)
|
||
func get_nodes(payload_id: int) -> Array:
|
||
return _payloads.get(payload_id, [])
|
||
|
||
func has_payload(payload_id: int) -> bool:
|
||
return _payloads.has(payload_id)
|
||
|
||
func get_payload_count() -> int:
|
||
return _payloads.size()
|