72 lines
3.2 KiB
GDScript
72 lines
3.2 KiB
GDScript
## 效果端口件:战斗业务类(DamageController/ActionEconomy)唯一的效果发射出口——收事件与载荷、
|
||
## 交效果引擎结算、取回命中批。六 Callable 路由宿主(BattleFxHost.fx_emit_biz/counter_read/
|
||
## counter_add/biz_fact/enqueue_reveal/apply_ac_bonus),经组装期 bind_port 单点注入。
|
||
## 闭面红线:事实回调=biz_fact 闭面五键(charge_layers/dig_streak/hp_ratio/rider_tier_bonus/
|
||
## rider_tier_crit),battle_index/round_index/seals_count/nest_count 禁进业务发射事实面。
|
||
## 单向接线:本件只持宿主注入的 Callable,禁持 BattleFxHost 对象引用(宿主 bundle 已持两业务类
|
||
## ——对象引用即成 host→damage→port→host 强引用环,两件均随每战新建=泄漏)。
|
||
## 未绑缺省:emit 返回空批/计数器读 0/计数器施加与揭示与 AC 回调 no-op/事实答 null——
|
||
## 与原业务类 _fx==null 零扰动守卫同语义(单测直构不接端口的既有夹具零扰动照跑)。
|
||
class_name EffectPort
|
||
extends RefCounted
|
||
|
||
var emit_cb: Callable # func(event: String, payload: Dictionary) -> Array——宿主 fx_emit_biz
|
||
var counter_read_cb: Callable # func(counter_id: String) -> int——宿主 counter_read
|
||
var counter_add_cb: Callable # func(counter_id: String, value: int, set_form: bool) -> void——宿主 counter_add
|
||
var fact_cb: Callable # func(name: String) -> Variant——宿主 biz_fact(伤害域闭面)
|
||
var reveal_cb: Callable # func() -> void——宿主 enqueue_reveal
|
||
var ac_cb: Callable # func(h: Dictionary) -> void——宿主 apply_ac_bonus
|
||
|
||
|
||
func _init(bundle: Dictionary) -> void:
|
||
for k in ["emit_cb", "counter_read_cb", "counter_add_cb", "fact_cb", "reveal_cb", "ac_cb"]:
|
||
assert(bundle.has(k), "[效果端口] 引用束缺键: %s" % k)
|
||
emit_cb = bundle.emit_cb
|
||
counter_read_cb = bundle.counter_read_cb
|
||
counter_add_cb = bundle.counter_add_cb
|
||
fact_cb = bundle.fact_cb
|
||
reveal_cb = bundle.reveal_cb
|
||
ac_cb = bundle.ac_cb
|
||
|
||
|
||
# 事件发射(收事件与载荷、交宿主路由效果引擎结算、取回命中批;未绑→空批)
|
||
func emit(event: String, payload: Dictionary) -> Array:
|
||
if not emit_cb.is_valid():
|
||
return []
|
||
return emit_cb.call(event, payload)
|
||
|
||
|
||
# 计数器层值读(value_counter 层值取数——宿主 counters_ctx 账面单点;未绑→0)
|
||
func counter_read(counter_id: String) -> int:
|
||
if not counter_read_cb.is_valid():
|
||
return 0
|
||
return int(counter_read_cb.call(counter_id))
|
||
|
||
|
||
# 计数器施加(命中行 counter_add 用后清零/计账——未绑→no-op)
|
||
func counter_add(counter_id: String, value: int, set_form: bool) -> void:
|
||
if not counter_add_cb.is_valid():
|
||
return
|
||
counter_add_cb.call(counter_id, value, set_form)
|
||
|
||
|
||
# 事实取值(闭面五键宿主侧单点——未绑→null)
|
||
func fact(name: String) -> Variant:
|
||
if not fact_cb.is_valid():
|
||
return null
|
||
return fact_cb.call(name)
|
||
|
||
|
||
# 揭示效果入队(kill 发射点 reveal_tiles 订阅面——授予段末兑付;未绑→no-op)
|
||
func reveal_effect() -> void:
|
||
if not reveal_cb.is_valid():
|
||
return
|
||
reveal_cb.call()
|
||
|
||
|
||
# AC 累积回调(damage_taken ac_bonus 石肤累积单点;未绑→no-op)
|
||
func apply_ac(h: Dictionary) -> void:
|
||
if not ac_cb.is_valid():
|
||
return
|
||
ac_cb.call(h)
|