107 lines
3.5 KiB
Go
107 lines
3.5 KiB
Go
package effect
|
||
|
||
import (
|
||
"blazing/logic/service/fight/info"
|
||
"blazing/logic/service/fight/input"
|
||
"blazing/logic/service/fight/node"
|
||
)
|
||
|
||
// -----------------------------------------------------------
|
||
// 通用效果:满足特定条件时,附加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
|
||
}
|
||
|
||
e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{
|
||
Type: info.DamageType.Fixed,
|
||
Damage: e.Args()[0],
|
||
})
|
||
|
||
return true
|
||
}
|
||
|
||
// -----------------------------------------------------------
|
||
// 差异化条件函数的实现(对应不同效果的判断逻辑)
|
||
// -----------------------------------------------------------
|
||
|
||
// conditionIsBurned:判断对方是否处于烧伤状态
|
||
func conditionIsBurned(e *EffectConditionalAddDamage) bool {
|
||
return e.OpponentInput().StatEffect_Exist(info.PetStatus.Burned)
|
||
}
|
||
|
||
// conditionIsFrozen:判断对方是否处于冻伤状态
|
||
func conditionIsFrozen(e *EffectConditionalAddDamage) bool {
|
||
return e.OpponentInput().StatEffect_Exist(info.PetStatus.Frozen)
|
||
}
|
||
|
||
// conditionIsTypeX:判断对方是否为X属性对方为X性则附加n点伤害
|
||
func conditionIsTypeX(e *EffectConditionalAddDamage) bool {
|
||
// 示例:假设Args[0]为目标属性值,判断对方属性是否匹配
|
||
return e.OpponentInput().CurPet[0].Info.Gender == int(e.Args()[0].IntPart())
|
||
}
|
||
|
||
// conditionIsAbnormal:判断对方是否处于任意异常状态
|
||
func conditionIsAbnormal(e *EffectConditionalAddDamage) bool {
|
||
return e.OpponentInput().StatEffect_Exist_all()
|
||
}
|
||
|
||
// conditionPropDown:判断对方是否处于能力下降状态
|
||
func conditionPropDown(e *EffectConditionalAddDamage) bool {
|
||
|
||
return e.OpponentInput().HasPropSub()
|
||
}
|