- 在多个战斗控制器方法中添加 defer 调用,确保战斗操作正确延迟执行 - 修改 ChangePet 方法返回值类型,增强接口一致性 - 修复战斗准备阶段逻辑,重构战斗开始信息构建过程 - 移除冗余广播调用,调整 PVE 战斗初始化流程 - 更新 README 中的 pprof 命令地址并完善项目介绍部分 fix(effect): 修复效果叠加逻辑与ID解析问题 - 效果叠加时默认增加一层,而非直接相加参数 - 修正 EffectIDCombiner 类型、CatchTime 的掩码偏移计算错误 - 添加重复效果日志输出,便于调试追踪 feat(boss): 完善BOSS特性实现逻辑 - 修正 NewSel17 特性
125 lines
4.7 KiB
Go
125 lines
4.7 KiB
Go
package input
|
||
|
||
import "fmt"
|
||
|
||
// -------------------------- 位运算常量(统一管理) --------------------------
|
||
const (
|
||
// 位移偏移量:64位ID结构 = [高16位:效果类型][中32位:CatchTime][低16位:扩展标识]
|
||
prefixOffset = 48 // 高16位(uint16):效果类型
|
||
catchOffset = 16 // 中32位(uint32):CatchTime(核心调整点)
|
||
suffixOffset = 0 // 低16位(uint16):扩展标识/子ID
|
||
|
||
// 掩码(提取对应位段)
|
||
suffixMask = 0xFFFF // 低16位掩码
|
||
catchMask = 0xFFFFFFFF // 中32位掩码(CatchTime专属)
|
||
prefixMask = 0xFFFF // 高16位掩码
|
||
maxPrefix = prefixMask // 效果类型最大值(uint16范围)
|
||
maxCatch = catchMask // CatchTime最大值(uint32范围)
|
||
maxSuffix = suffixMask // 扩展标识最大值(uint16范围)
|
||
)
|
||
|
||
// -------------------------- 64位拼接工具(无状态工具类) --------------------------
|
||
// EffectIDCombiner 64位效果ID拼接器:[效果类型(uint16)+CatchTime(uint32)+扩展标识(uint16)] → int64
|
||
// 无状态设计,可全局复用
|
||
type EffectIDCombiner struct {
|
||
Base int64
|
||
}
|
||
|
||
// Combine 拼接三个字段为64位效果ID
|
||
// 参数:
|
||
// prefix: 高16位(效果类型,如EffectType.Skill)
|
||
// catchTime: 中32位(核心字段:32位CatchTime)
|
||
// suffix: 低16位(扩展标识/子ID)
|
||
// 返回:拼接后的int64,参数超出范围返回错误
|
||
func (c *EffectIDCombiner) Combine(prefix EnumEffectType, catchTime uint32, suffix uint16) {
|
||
// // 范围校验(避免溢出)
|
||
// if prefix > maxPrefix {
|
||
// return 0, fmt.Errorf("效果类型值%d超出uint16范围(最大%d)", prefix, maxPrefix)
|
||
// }
|
||
// if catchTime > maxCatch {
|
||
// return 0, fmt.Errorf("CatchTime值%d超出uint32范围(最大%d)", catchTime, maxCatch)
|
||
// }
|
||
// if suffix > maxSuffix {
|
||
// return 0, fmt.Errorf("扩展标识值%d超出uint16范围(最大%d)", suffix, maxSuffix)
|
||
// }
|
||
|
||
c.Base = (int64(prefix) << prefixOffset) |
|
||
(int64(catchTime) << catchOffset) |
|
||
int64(suffix)
|
||
|
||
}
|
||
|
||
// EffectID 获取完整的64位效果ID
|
||
func (e *EffectIDCombiner) EffectID() int64 {
|
||
return e.Base
|
||
}
|
||
|
||
// SetEffectType 设置效果类型(修复掩码偏移问题)
|
||
// 参数t:必须传入有效值,否则panic(也可加len(t)==0判断)
|
||
func (e *EffectIDCombiner) SetEffectType(t EnumEffectType) {
|
||
|
||
// 修正:掩码左移到高16位,仅清空效果类型区域
|
||
clearMask := uint64(prefixMask) << prefixOffset
|
||
e.Base = (e.Base & ^int64(clearMask)) | (int64(t) << prefixOffset)
|
||
}
|
||
|
||
// GetEffectType 读取效果类型
|
||
func (e EffectIDCombiner) GetEffectType() EnumEffectType {
|
||
return EnumEffectType((e.Base >> prefixOffset) & int64(prefixMask))
|
||
}
|
||
|
||
// SetCatchTime 设置CatchTime(修复掩码偏移问题,避免清空Suffix)
|
||
func (e *EffectIDCombiner) SetCatchTime(t uint32) {
|
||
|
||
// 修正:掩码左移到中32位,仅清空CatchTime区域
|
||
clearMask := uint64(catchMask) << catchOffset
|
||
e.Base = (e.Base & ^int64(clearMask)) | (int64(t) << catchOffset)
|
||
}
|
||
func (e EffectIDCombiner) GetCatchTime() uint32 {
|
||
|
||
return uint32((e.Base >> catchOffset) & catchMask)
|
||
}
|
||
|
||
// Suffix 读取/替换扩展标识(读写一体,和CatchTime写法一致)
|
||
// 参数t:可选,传入则替换当前扩展标识;不传则仅读取
|
||
// 返回:当前的扩展标识值
|
||
func (e EffectIDCombiner) Suffix() uint16 {
|
||
// if len(t) > 0 {
|
||
// // 替换逻辑:先清空低16位,再设置新值
|
||
// e.Base = (e.Base & ^suffixMask) | int64(t[0])
|
||
// }
|
||
// 读取并返回当前扩展标识
|
||
return uint16(e.Base & suffixMask)
|
||
}
|
||
|
||
// -------------------------- 自由取值方法(核心需求:按需取不同类型) --------------------------
|
||
|
||
func Test() {
|
||
combiner := &EffectIDCombiner{}
|
||
|
||
// 1. 初始化拼接ID
|
||
combiner.Combine(EffectType.Skill, 123456, 789)
|
||
|
||
fmt.Println("=== 初始值 ===")
|
||
fmt.Printf("完整ID:%d\n", combiner.EffectID())
|
||
fmt.Printf("效果类型:%d\n", combiner.GetEffectType()) // 仅读取
|
||
fmt.Printf("CatchTime:%d\n", combiner.GetCatchTime()) // 仅读取
|
||
fmt.Printf("扩展标识:%d\n", combiner.Suffix()) // 仅读取
|
||
|
||
// 2. 替换字段(传参即替换)
|
||
combiner.SetEffectType(EffectType.NewSel) // 替换效果类型为Buff
|
||
combiner.SetCatchTime(987654) // 替换CatchTime
|
||
// 替换扩展标识
|
||
|
||
fmt.Println("\n=== 替换后 ===")
|
||
fmt.Printf("完整ID:%d\n", combiner.EffectID())
|
||
fmt.Printf("效果类型:%d\n", combiner.GetEffectType())
|
||
fmt.Printf("CatchTime:%d\n", combiner.GetCatchTime())
|
||
fmt.Printf("扩展标识:%d\n", combiner.Suffix())
|
||
|
||
// 3. 链式替换+读取(一行完成替换并获取新值)
|
||
combiner.SetCatchTime(111222) // 替换并返回新值
|
||
fmt.Printf("\n替换CatchTime并读取:%d\n", combiner.GetCatchTime())
|
||
|
||
}
|