Files
gplan-2/game/core/effect_port.gd
T
2026-11-04 05:08:31 +08:00

72 lines
3.2 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 效果端口件:战斗业务类(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)