refactor(fight): 重构战斗准备逻辑并优化战斗启动流程 将 ReadyFight 方法拆分为多个职责清晰的子方法: - buildFightStartInfo: 构建战斗初始信息 - checkBothPlayersReady: 检查PVP双方是否就绪 - handleNPCFightSpecial: 处理NPC战斗特殊逻辑(如可捕捉标记) - startBattle: 统一启动战斗流程 同时修复部分逻辑顺序问题,增强代码可读性和扩展性。 feat(fight): 新增精灵王挑战协议支持 增加 StartPetWarInboundInfo 结构体用于接收精灵王挑战请求, 为后续实现相关功能提供基础。 fix(effect): 修正多个技能效果数值引用错误 - effect_37: 技能威力计算使用正确参数索引 - effect_50: 固定减伤比例调整为除以2 - effect_65: 正确比较技能分类类型 - effect_68: 致死保护改为锁定剩余1点生命值 - effect_77: 回复目标由敌方改为己方 - effect_93: 固定伤害值直接取参数 refactor(effect): 移除冗余效果类文件 删除 effect_133.go 和 effect_90.go 文件,其功能已被统一条件伤害和倍率系统取代; 移除 effect_74.go、effect_75.go 中重复的状态随机施加逻辑。 refactor(effect): 更新能力操作枚举命名一致性 重命名 AbilityOpType 枚举项名称,去除前缀,提升语义清晰度: - AbilityOpStealStrengthen → StealStrengthen - AbilityOpReverse → Reverse - AbilityOpBounceWeaken → BounceWeaken chore(fight): 完善 BattlePetEntity 属性初始化逻辑 在创建 BattlePetEntity 时即设置 PType,避免后续多次查询 PetMAP; 移除 Type() 方法中的冗余配置查找逻辑。 fix(skill): 确保必中技能不参与命中率计算 在 AttackTimeC 方法中添加 return 防止必中技能继续执行命中率公式计算。 refactor(fight): 调整战斗回合结束逻辑 进入新回合时允许玩家更换精灵,并提前跳出循环防止多余处理。 style(effect): 更正拼写及变量命名风格 修改 BaseSataus.Switch 方法签名中的参数命名; 更正 Effect58 中 can 字段首字母大写;
118 lines
3.7 KiB
Go
118 lines
3.7 KiB
Go
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
|
||
|
||
// 全局映射:关联效果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. 命中判定失败,不触发
|
||
if !e.Hit() {
|
||
return true
|
||
}
|
||
|
||
// 2. 获取当前效果ID对应的条件函数
|
||
cond, ok := conditionMap[e.ID()-int(input.EffectType.Skill)]
|
||
if !ok {
|
||
return true // 无对应条件函数,不触发
|
||
}
|
||
|
||
// 3. 检查是否满足触发条件
|
||
if !cond(e) {
|
||
return true
|
||
}
|
||
|
||
// 4. 附加固定伤害(从SideEffectArgs[0]获取伤害值)
|
||
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:判断对方是否处于烧伤状态
|
||
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属性(需根据实际属性枚举调整)
|
||
func conditionIsTypeX(e *EffectConditionalAddDamage) bool {
|
||
// 示例:假设Args[0]为目标属性值,判断对方属性是否匹配
|
||
return e.Ctx().Opp.CurrentPet.PType == e.Args()[0]
|
||
}
|
||
|
||
// 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
|
||
}
|