## 效果端口件:战斗业务类(DamageController/ActionEconomy)唯一的效果发射出口——收事件与载荷、 ## 交效果引擎结算、取回命中批。六 Callable 路由宿主(BattleFxHost.fx_emit_biz/counter_read/ ## counter_add/biz_fact/enqueue_reveal/apply_ac_bonus),经组装期 bind_port 单点注入。 ## 闭面红线:事实回调=biz_fact 闭面四键(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)