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 字段首字母大写;
82 lines
2.3 KiB
Go
82 lines
2.3 KiB
Go
package effect
|
||
|
||
import (
|
||
"blazing/logic/service/fight/info"
|
||
"blazing/logic/service/fight/input"
|
||
"blazing/logic/service/fight/node"
|
||
)
|
||
|
||
// 定义状态区间配置:包含概率上限(0-100)和对应的状态
|
||
type statusRange struct {
|
||
upper int // 概率区间上限(例如10表示0-9区间)
|
||
status info.EnumPetStatus // 该区间触发的状态
|
||
}
|
||
|
||
// 通用随机状态效果结构体
|
||
type EffectRandomStatus struct {
|
||
node.EffectNode
|
||
ranges []statusRange // 当前效果的状态概率配置
|
||
}
|
||
|
||
// 工厂函数:创建通用随机状态效果实例(接收状态配置)
|
||
func newEffectRandomStatus(ranges []statusRange) *EffectRandomStatus {
|
||
return &EffectRandomStatus{
|
||
ranges: ranges,
|
||
}
|
||
}
|
||
|
||
// 通用逻辑:命中后按概率随机触发状态
|
||
func (e *EffectRandomStatus) OnSkill() bool {
|
||
if !e.Hit() {
|
||
return true
|
||
}
|
||
|
||
// 生成0-99的随机数(100种可能)
|
||
randVal := int(e.Input.FightC.GetRand().Int31n(100))
|
||
targetStatus := info.PetStatus.NULL
|
||
|
||
// 根据配置匹配对应的状态
|
||
for _, r := range e.ranges {
|
||
if randVal < r.upper {
|
||
targetStatus = r.status
|
||
break
|
||
}
|
||
}
|
||
|
||
// 未匹配到任何状态(概率外情况)
|
||
if targetStatus == info.PetStatus.NULL {
|
||
return true
|
||
}
|
||
|
||
// 获取状态效果并设置参数
|
||
eff := input.Geteffect(input.EffectType.Status, int(targetStatus))
|
||
if eff == nil {
|
||
return true
|
||
}
|
||
|
||
// 持续时间:随机2-3回合(与原逻辑一致)
|
||
duration := int(e.Input.FightC.GetRand().Int31n(2)) + 2
|
||
eff.Duration(duration)
|
||
eff.SetArgs(e.Ctx().Our)
|
||
e.Ctx().Opp.AddEffect(e.Ctx().Our, eff)
|
||
|
||
return true
|
||
}
|
||
|
||
// 初始化:注册Effect74和Effect75(通过不同配置区分)
|
||
func init() {
|
||
// Effect74:10%中毒、10%烧伤、10%冻伤(70%无效果)
|
||
input.InitEffect(input.EffectType.Skill, 74, newEffectRandomStatus([]statusRange{
|
||
{upper: 10, status: info.PetStatus.Poisoned}, // 0-9:中毒
|
||
{upper: 20, status: info.PetStatus.Burned}, // 10-19:烧伤
|
||
{upper: 30, status: info.PetStatus.Frozen}, // 20-29:冻伤
|
||
}))
|
||
|
||
// Effect75:10%麻痹、10%睡眠、10%害怕(70%无效果)
|
||
input.InitEffect(input.EffectType.Skill, 75, newEffectRandomStatus([]statusRange{
|
||
{upper: 10, status: info.PetStatus.Paralysis}, // 0-9:麻痹
|
||
{upper: 20, status: info.PetStatus.Sleep}, // 10-19:睡眠
|
||
{upper: 30, status: info.PetStatus.Fear}, // 20-29:害怕
|
||
}))
|
||
}
|