77 lines
1.5 KiB
Go
77 lines
1.5 KiB
Go
package effect
|
|
|
|
import (
|
|
"blazing/logic/service/fight/battle/node"
|
|
|
|
"github.com/tnnmigga/enum"
|
|
)
|
|
|
|
type EffectManager struct {
|
|
containers map[string]*EffectContainer
|
|
}
|
|
|
|
func NewEffectManager() *EffectManager {
|
|
return &EffectManager{
|
|
containers: make(map[string]*EffectContainer),
|
|
}
|
|
}
|
|
|
|
// 添加效果
|
|
func (m *EffectManager) AddEffect(owner string, e *Effect) {
|
|
if _, ok := m.containers[owner]; !ok {
|
|
m.containers[owner] = &EffectContainer{}
|
|
}
|
|
m.containers[owner].AddEffect(e)
|
|
}
|
|
|
|
// 触发事件,按顺序链式执行效果
|
|
func (m *EffectManager) Trigger(owner string, trigger node.EnumEffectTrigger, ctx *EffectContext) {
|
|
container, ok := m.containers[owner]
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
var idx int
|
|
var next func()
|
|
next = func() {
|
|
if idx >= len(container.Effects) {
|
|
return
|
|
}
|
|
e := container.Effects[idx]
|
|
idx++
|
|
// 判断触发器匹配
|
|
if e.Trigger == trigger {
|
|
e.Handler(ctx, next)
|
|
if e.LifeType == e.LifeType {
|
|
e.Duration--
|
|
}
|
|
} else {
|
|
// 不匹配直接跳过
|
|
next()
|
|
}
|
|
}
|
|
|
|
next()
|
|
container.Cleanup()
|
|
}
|
|
|
|
type EnumBaseEvent string
|
|
|
|
var BaseEvent = enum.New[struct {
|
|
Attack EnumBaseEvent `enum:"attack"`
|
|
Damage EnumBaseEvent `enum:"damage"`
|
|
Heal EnumBaseEvent `enum:"heal"`
|
|
Buff EnumBaseEvent `enum:"buff"`
|
|
Turn EnumBaseEvent `enum:"turn"`
|
|
Death EnumBaseEvent `enum:"death"`
|
|
Skill EnumBaseEvent `enum:"skill"`
|
|
}]()
|
|
|
|
// ================= HookPhase =================
|
|
type EnumHookPhase string
|
|
|
|
var HookPhase = enum.New[struct {
|
|
Before EnumHookPhase `enum:"before"`
|
|
After EnumHookPhase `enum:"after"`
|
|
}]()
|