fix(logic/service/fight): 修正状态效果判断逻辑中的类型转换问题

将 StatEffect_Exist 方法的参数类型从 int 改为 info.EnumPetStatus,
并在调用 GetEffect 时进行显式类型转换,以提高代码可读性和类型安全性。
同时清理了部分冗余的类型转换调用。
This commit is contained in:
2025-11-14 00:47:49 +08:00
parent 55ff5c6119
commit 3c067751f1
4 changed files with 167 additions and 9 deletions

View File

@@ -0,0 +1,113 @@
package effect
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
"github.com/shopspring/decimal"
)
// -----------------------------------------------------------
// 通用效果满足特定条件时附加n点固定伤害
// -----------------------------------------------------------
// 条件回调函数判断对方是否满足触发条件返回true则触发伤害
type conditionFunc func(e *EffectConditionalAddDamage) bool
type EffectConditionalAddDamage struct {
node.EffectNode
condition conditionFunc // 差异化:判断触发条件的函数
}
// 工厂函数:创建"条件附加伤害"效果实例,传入条件判断函数
func newEffectConditionalAddDamage(cond conditionFunc) *EffectConditionalAddDamage {
return &EffectConditionalAddDamage{
condition: cond,
}
}
// 初始化:批量注册所有"条件附加伤害"类效果
func init() {
registerConditionalAddDamageEffects()
}
// 批量注册绑定效果ID与对应的条件函数可扩展
func registerConditionalAddDamageEffects() {
// 效果ID与条件函数的映射
// 133: 对方烧伤时附加伤害134:对方冻伤时附加伤害135:对方是X属性时附加伤害136:对方处于异常状态时附加伤害
effectMap := map[int]conditionFunc{
133: conditionIsBurned, // Effect133对方烧伤时
141: conditionIsFrozen, // 新增:对方冻伤时
135: conditionIsAbnormal, // 新增对方是X属性时示例需根据实际属性枚举调整
130: conditionIsTypeX, // 新增:对方处于任意异常状态时
167: conditionprop, //167 若对手处于能力下降状态则附加n点伤害
}
// 循环注册所有效果
for effectID, cond := range effectMap {
input.InitEffect(input.EffectType.Skill, effectID, newEffectConditionalAddDamage(cond))
}
}
// -----------------------------------------------------------
// 核心共性逻辑:命中且满足条件时,附加固定伤害
// -----------------------------------------------------------
func (e *EffectConditionalAddDamage) OnSkill() bool {
// 1. 命中判定失败,不触发
if !e.Hit() {
return true
}
// 2. 检查是否满足触发条件(调用差异化的条件函数)
if !e.condition(e) {
return true
}
// 3. 附加固定伤害伤害值从SideEffectArgs[0]获取与原Effect133一致
damageValue := decimal.NewFromInt(int64(e.SideEffectArgs[0]))
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
Type: info.DamageType.Fixed,
Damage: damageValue,
})
return true
}
// -----------------------------------------------------------
// 差异化条件函数的实现(对应不同效果的判断逻辑)
// -----------------------------------------------------------
// conditionIsBurned判断对方是否处于烧伤状态对应原Effect133
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属性示例需根据实际属性枚举调整
// 假设属性枚举为info.PetTypeX属性为info.PetType.X
func conditionIsTypeX(e *EffectConditionalAddDamage) bool {
return e.Ctx().Opp.CurrentPet.Gender == e.Args()[0]
}
// conditionIsAbnormal判断对方是否处于任意异常状态新增效果
// 假设异常状态包含烧伤、冻伤、麻痹等,通过检查是否存在任意异常状态实现
func conditionIsAbnormal(e *EffectConditionalAddDamage) bool {
return e.Ctx().Opp.StatEffect_Exist_all()
}
func conditionprop(e *EffectConditionalAddDamage) bool {
for _, v := range e.Ctx().Opp.Prop {
if v < 0 {
return true
}
}
return false
}