package effect import ( "blazing/logic/service/fight/info" "blazing/logic/service/fight/input" "blazing/logic/service/fight/node" "github.com/alpacahq/alpacadecimal" ) // ----------------------------------------------------------- // 通用效果:满足特定条件时,附加n点固定伤害 // ----------------------------------------------------------- // 条件回调函数:判断对方是否满足触发条件(返回true则触发伤害) type conditionFunc func(e *EffectConditionalAddDamage) bool // 全局映射:关联效果ID与对应的条件函数 var conditionMap = make(map[int]conditionFunc) type EffectConditionalAddDamage struct { node.EffectNode // 仅继承基础效果节点,不嵌入条件函数 } // 工厂函数:创建"条件附加伤害"效果实例(无需传入函数) func newEffectConditionalAddDamage() *EffectConditionalAddDamage { return &EffectConditionalAddDamage{} } // 初始化:批量注册所有"条件附加伤害"类效果 func init() { registerConditionalAddDamageEffects() } // 批量注册:绑定效果ID与对应的条件函数(可扩展) func registerConditionalAddDamageEffects() { // 效果ID与条件函数的映射 effectMap := map[int]conditionFunc{ // 130: conditionIsTypeX, // 对方是X属性时 133: conditionIsBurned, // 对方烧伤时 141: conditionIsFrozen, // 对方冻伤时 162: conditionIsAbnormal, // 对方处于任意异常状态时 167: conditionPropDown, // 对方处于能力下降状态时 } // 注册到全局映射,并初始化效果 for effectID, cond := range effectMap { conditionMap[effectID] = cond input.InitEffect(input.EffectType.Skill, effectID, newEffectConditionalAddDamage()) } } // ----------------------------------------------------------- // 核心共性逻辑:命中且满足条件时,附加固定伤害 // ----------------------------------------------------------- func (e *EffectConditionalAddDamage) OnSkill() bool { // 1. 命中判定失败,不触发 // 2. 获取当前效果ID对应的条件函数 cond, ok := conditionMap[int(e.ID().Suffix())] if !ok { return true // 无对应条件函数,不触发 } // 3. 检查是否满足触发条件 if !cond(e) { return true } // 4. 附加固定伤害(从SideEffectArgs[0]获取伤害值) damageValue := alpacadecimal.NewFromInt(int64(e.SideEffectArgs[0])) e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{ Type: info.DamageType.Fixed, Damage: damageValue, }) return true } // ----------------------------------------------------------- // 差异化条件函数的实现(对应不同效果的判断逻辑) // ----------------------------------------------------------- // conditionIsBurned:判断对方是否处于烧伤状态 func conditionIsBurned(e *EffectConditionalAddDamage) bool { return e.Ctx().Opp.StatEffect_Exist(info.PetStatus.Burned) } // conditionIsFrozen:判断对方是否处于冻伤状态 func conditionIsFrozen(e *EffectConditionalAddDamage) bool { return e.Ctx().Opp.StatEffect_Exist(info.PetStatus.Frozen) } // conditionIsTypeX:判断对方是否为X属性对方为X性则附加n点伤害 func conditionIsTypeX(e *EffectConditionalAddDamage) bool { // 示例:假设Args[0]为目标属性值,判断对方属性是否匹配 return e.Ctx().Opp.CurrentPet.Info.Gender == int(e.Args()[0].IntPart()) } // conditionIsAbnormal:判断对方是否处于任意异常状态 func conditionIsAbnormal(e *EffectConditionalAddDamage) bool { return e.Ctx().Opp.StatEffect_Exist_all() } // conditionPropDown:判断对方是否处于能力下降状态 func conditionPropDown(e *EffectConditionalAddDamage) bool { for _, v := range e.Ctx().Opp.Prop { if v < 0 { return true } } return false }