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 // 差异化:目标攻击类型(物理/特殊等) can bool } // 工厂函数:创建"指定攻击类型必定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) SkillHit_ex() bool { // 技能为空时不处理 skill := e.Ctx().SkillEntity if skill == nil { return true } // 若攻击类型匹配目标类型,则强制miss(设置AttackTime=0) if skill.Category() == e.targetCategory { skill.SetMiss() } return true } // 设置参数:复用父类逻辑,设置持续回合 func (e *EffectAttackMiss) SetArgs(t *input.Input, a ...int) { e.EffectNode.SetArgs(t, a...) e.CanStack(true) e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0] - 1) // 持续回合由SideEffectArgs[0]指定 }