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