77 lines
2.3 KiB
Go
77 lines
2.3 KiB
Go
package input
|
||
|
||
import "blazing/logic/service/fight/info"
|
||
|
||
type LegacySides struct {
|
||
// Our 兼容旧 effect:当前执行侧(历史语义里的“我方”)。
|
||
// 使用场景:
|
||
// 1) 旧 effect 仍通过 Ctx().Our/Ctx().Opp 取双方输入。
|
||
// 2) Source/Carrier/Target 未设置时作为默认回退。
|
||
Our *Input
|
||
|
||
// Opp 兼容旧 effect:当前执行侧的对位(历史语义里的“对手”)。
|
||
// 使用场景:
|
||
// 1) 单目标旧链路下,直接作为“对手输入”。
|
||
// 2) Source/Carrier/Target 语义未接入的旧 effect。
|
||
Opp *Input
|
||
}
|
||
|
||
type EffectBinding struct {
|
||
// Source effect 来源输入(谁施加/创建了这个 effect),通常等价于 e.GetInput()。
|
||
// 该值一般在 effect 生命周期内保持不变。
|
||
// 使用场景:
|
||
// 1) 伤害归属/效果归属判定(谁是施法者)。
|
||
// 2) A 给 B 挂效果后,后续仍需要识别“来源是 A”。
|
||
Source *Input
|
||
|
||
// Carrier 当前持有效果的输入(effect 实际挂载在哪个输入上)。
|
||
// 例如 A 给 B 挂 debuff 时:Source=A,Carrier=B。
|
||
// 使用场景:
|
||
// 1) 回合开始/结束、切换、状态结算时,按“持有者”触发。
|
||
// 2) 需要区分“是谁挂的”(Source) 与 “挂在谁身上”(Carrier)。
|
||
Carrier *Input
|
||
|
||
// Target 本次结算的实际作用目标输入(瞬时语义,可在链式/群体结算中变化)。
|
||
// 为空时通常回退到 Carrier 或 LegacySides.Our。
|
||
// 使用场景:
|
||
// 1) 链式/群体/溅射:同一个 effect 逐个作用不同目标。
|
||
// 2) 重定向/反弹:效果仍由原 Carrier 持有,但本次作用对象发生变化。
|
||
Target *Input
|
||
}
|
||
|
||
type Ctx struct {
|
||
LegacySides
|
||
EffectBinding
|
||
|
||
*info.SkillEntity //action本身
|
||
|
||
// *info.DamageZone //伤害
|
||
}
|
||
|
||
func (c *Ctx) Self() *Input {
|
||
if c == nil {
|
||
return nil
|
||
}
|
||
if c.Source != nil {
|
||
return c.Source
|
||
}
|
||
return c.Our
|
||
}
|
||
|
||
// Receiver 返回本次结算的接收方输入:Target > Carrier > Our。
|
||
// 使用场景:
|
||
// 1) 写 effect 时不关心目标来源,只取“当前实际受影响者”。
|
||
// 2) 统一兼容单目标与群体/重定向结算链路。
|
||
func (c *Ctx) Receiver() *Input {
|
||
if c == nil {
|
||
return nil
|
||
}
|
||
if c.Target != nil {
|
||
return c.Target
|
||
}
|
||
if c.Carrier != nil {
|
||
return c.Carrier
|
||
}
|
||
return c.Our
|
||
}
|