Files
bl/logic/service/fight/effect/EffectAttackMiss.go
昔念 c4d0119129 ```
refactor(fight): 重构击败触发效果机制,优化代码结构

将 EffectDefeatTrigger 中的回调函数模式改为基于 effectID 的 switch-case 实现,
移除冗余的 defeatTriggerFunc 类型定义。统一通过 triggerByID 方法根据 ID 分发执行具体行为,
提高可维护性和扩展性。

同时更新 AddEffect 方法签名以支持传入主动方输入上下文,增强效果添加时的控制逻辑。
修复部分效果在添加状态时未正确传递施加者信息的问题。

此外,清理了部分注释和无用代码,使逻辑更清晰。
```
2025-11-14 03:21:00 +08:00

72 lines
2.1 KiB
Go
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.

package effect
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
)
// -----------------------------------------------------------
// 通用效果n回合内指定类型的攻击对自身必定miss
// -----------------------------------------------------------
type EffectAttackMiss struct {
node.EffectNode
targetCategory info.EnumCategory // 差异化:目标攻击类型(物理/特殊等)
}
// 工厂函数:创建"指定攻击类型必定miss"效果实例
func newEffectAttackMiss(category info.EnumCategory) *EffectAttackMiss {
return &EffectAttackMiss{
targetCategory: category,
}
}
// 初始化:批量注册所有"攻击类型必定miss"类效果
func init() {
registerAttackMissEffects()
}
// 批量注册绑定效果ID与对应的目标攻击类型
func registerAttackMissEffects() {
// 效果ID与目标攻击类型的映射
categoryMap := map[int]info.EnumCategory{
78: info.Category.PHYSICAL, // Effect78物理攻击必定miss
86: info.Category.STATUS, // Effect86状态攻击必定miss
106: info.Category.SPECIAL, // Effect106特殊攻击必定miss
}
// 循环注册所有效果
for effectID, category := range categoryMap {
input.InitEffect(input.EffectType.Skill, effectID, newEffectAttackMiss(category))
}
}
// -----------------------------------------------------------
// 核心逻辑技能命中时若为目标攻击类型则强制miss
// -----------------------------------------------------------
func (e *EffectAttackMiss) Skill_Hit_ex() bool {
// 命中判定失败,不触发
if !e.Hit() {
return true
}
// 技能为空时不处理
skill := e.Ctx().SkillEntity
if skill == nil {
return true
}
// 若攻击类型匹配目标类型则强制miss设置AttackTime=0
if skill.Category() == e.targetCategory {
skill.AttackTime = 0 // 强制命中失效
}
return true
}
// 设置参数:复用父类逻辑,设置持续回合
func (e *EffectAttackMiss) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0]) // 持续回合由SideEffectArgs[0]指定
}