Files
bl/logic/service/fight/info/info.go
昔念 e75ecd413d feat(fight): 重构战斗系统技能逻辑与精灵切换功能
- 优化技能执行流程,统一使用 SelectSkillAction 作为技能载体
- 移除冗余的技能 ID 字段,简化数据结构
- 调整命中判断和技能效果触发机制,提升准确性
- 修改精灵切换与捕获相关方法参数格式
- 更新技能列表结构为动态数组以支持灵活长度
- 完善睡眠等异常状态的处理逻辑
- 修复战斗中技能 PP 扣减及副本还原问题
- 清理无用代码,如多余的 FindWithIndex 函数定义
- 强化验证码缓存键命名规则,增强安全性
2025-10-26 20:56:03 +08:00

291 lines
11 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package info
import (
"blazing/modules/blazing/model"
"fmt"
"github.com/tnnmigga/enum"
)
type ChangePetInfo struct {
// UserId 米米号野怪为0
UserId uint32 `json:"userId"`
// PetId 切换上场的精灵编号
ID uint32 `fieldDesc:"当前对战精灵ID" `
// PetName 精灵名字固定16字节长度
Name string `struc:"[16]byte"`
// Level 切换上场的精灵等级
Level uint32 `json:"level"`
// Hp 切换上场的精灵当前生命值
Hp uint32 `json:"hp"`
// MaxHp 切换上场的精灵最大生命值
MaxHp uint32 `json:"maxHp"`
CatchTime uint32 `fieldDesc:"捕捉时间" `
}
type NoteInviteToFightOutboundInfo struct {
UserID uint32 `codec:"true"`
Nick string `struc:"[16]byte" default:"seer" json:"nick"` // 16字节昵称
// Mode 战斗模式 1 = 1v1 2 = 6v6
Mode EnumBattleMode `codec:"true"`
}
type S2C_NOTE_HANDLE_FIGHT_INVITE struct {
// UserID 对方的userid
UserID uint32
Nick string `struc:"[16]byte" default:"seer" json:"nick"` // 16字节昵称
// Result 处理结果
// 0=对方拒绝了对战
// 1=对方同意了对战
// 2=对方在线时长超过6小时
// 3=对方没有可出战的精灵
// 4=对方不在线
Result uint32
}
type PVPinfo struct {
PlayerID uint32
Mode EnumBattleMode
}
// FightPetInfo 战斗精灵信息结构体FightPetInfo类
type FightPetInfo struct {
// 用户ID野怪为0@UInt long
UserID uint32 `fieldDesc:"用户ID 野怪为0" `
// 当前对战精灵ID@UInt long
ID uint32 `fieldDesc:"当前对战精灵ID" `
Name string `struc:"[16]byte"`
// 精灵的捕获时间,@UInt long
CatchTime uint32 `fieldDesc:"精灵的捕获时间" `
// 当前HP@UInt long
Hp uint32 `fieldDesc:"当前HP" `
// 最大HP@UInt long
MaxHp uint32 `fieldDesc:"最大HP" `
// 当前等级,@UInt long
Level uint32 `fieldDesc:"当前等级" `
// 精灵是否能捕捉1为能捕捉0为不能捕捉
Catchable uint32 `fieldDesc:"精灵是否能捕捉. 1为能捕捉 0为不能捕捉" `
//能力提升属性
Prop PropDict
}
type AttackValueS struct {
FAttack AttackValue
SAttack AttackValue
}
func NewAttackValue(userid uint32) *AttackValue {
return &AttackValue{
userid,
0,
0,
0,
0,
0,
0,
0,
0,
[]model.SkillInfo{},
0,
[20]int8{},
[6]int8{},
}
}
// AttackValue 战斗中的攻击数值信息
type AttackValue struct {
UserID uint32 `json:"userId" fieldDescription:"玩家的米米号 与野怪对战userid = 0"`
SkillID uint32 `json:"skillId" fieldDescription:"使用技能的id"`
AttackTime uint32 `json:"attackTime" fieldDescription:"是否击中 如果为0 则miss 如果为1 则击中,2为必中"`
LostHp uint32 `json:"lostHp" fieldDescription:"我方造成的伤害"`
GainHp int32 `json:"gainHp" fieldDescription:"我方获得血量"`
RemainHp int32 `json:"remainHp" fieldDescription:"我方剩余血量"`
MaxHp uint32 `json:"maxHp" fieldDescription:"我方最大血量"`
State uint32 `json:"state" fieldDescription:"固定值0 需要后续测试"`
SkillListLen uint32 `struc:"sizeof=SkillList"`
SkillList []model.SkillInfo `json:"skillList" fieldDescription:"根据精灵的数据插入技能 最多4条 不定长"`
IsCritical uint32 `json:"isCritical" fieldDescription:"是否暴击"`
Status [20]int8 //精灵的状态
//能力提升属性
Prop [6]int8
// OwnerMaxShield uint32 `json:"ownerMaxShield" fieldDescription:"我方最大护盾"`
// OwnerCurrentShield uint32 `json:"ownerCurrentShield" fieldDescription:"我方当前护盾"`
}
type WeakenedS struct {
Stack int8 `struc:"skip"`
Round int8
}
// 定义战斗状态枚举
var PetStatus = enum.New[struct {
// 麻痹
Paralysis EnumBattleStatus `enum:"0"`
Poisoned EnumBattleStatus `enum:"1"` // 中毒
Burned EnumBattleStatus `enum:"2"` // 烧伤
DrainHP EnumBattleStatus `enum:"3"` // 吸取对方的体力
DrainedHP EnumBattleStatus `enum:"4"` // 被对方吸取体力
Frozen EnumBattleStatus `enum:"5"` // 冻伤
Fear EnumBattleStatus `enum:"6"` // 害怕
Tired EnumBattleStatus `enum:"7"` // 疲惫
Sleep EnumBattleStatus `enum:"8"` // 睡眠
Petrified EnumBattleStatus `enum:"9"` // 石化
Confused EnumBattleStatus `enum:"10"` // 混乱
Weakened EnumBattleStatus `enum:"11"` // 衰弱
MountainGodGuard EnumBattleStatus `enum:"12"` // 山神守护
Flammable EnumBattleStatus `enum:"13"` // 易燃
Berserk EnumBattleStatus `enum:"14"` // 狂暴
IceBound EnumBattleStatus `enum:"15"` // 冰封
Bleeding EnumBattleStatus `enum:"16"` // 流血
ImmuneToStatDrop EnumBattleStatus `enum:"17"` // 免疫能力下降
ImmuneToAbnormal EnumBattleStatus `enum:"18"` // 免疫异常状态
Paralyzed EnumBattleStatus `enum:"19"` // 瘫痪
// Blind EnumBattleStatus `enum:"20"` // 失明(预留)
}]()
// 枚举类型别名(根据实际枚举库要求定义)
type EnumBattleStatus = byte
// 精灵的能力提升
type PropDict struct {
// 攻击(@UInt long → uint32
Attack int8
// 防御(@UInt long → uint32
Defence int8
// 特攻(@UInt long → uint32
SpecialAttack int8
// 特防(@UInt long → uint32
SpecialDefence int8
// 速度(@UInt long → uint32
Speed int8
// 命中(@UInt long → uint32
Accuracy int8
}
// BattleLevels 战斗属性等级结构体对应原6字节数组
// NoteUseSkillOutboundInfo 战斗技能使用通知的出站信息结构体
type NoteUseSkillOutboundInfo struct {
FirstAttackInfo AttackValue // 本轮先手的精灵在释放技能结束后的状态
SecondAttackInfo AttackValue // 本轮后手的精灵在释放技能结束后的状态
}
type FightStartOutboundInfo struct {
// @UInt long类型
IsCanAuto uint32 `fieldDesc:"是否自动 默认给0 怀疑是自动战斗器使用的" `
// 当前战斗精灵信息1前端通过userid判断是否为我方
Info1 FightPetInfo `fieldDesc:"当前战斗精灵的信息 可能不准.看前端代码是以userid来判断哪个结构体是我方的" serialize:"struct"`
// 当前战斗精灵信息2前端通过userid判断是否为我方
Info2 FightPetInfo `fieldDesc:"当前战斗精灵的信息 可能不准.看前端代码是以userid来判断哪个结构体是我方的" serialize:"struct"`
}
type FightUserInfo struct {
// 用户ID野怪为0@UInt long
UserID uint32 `fieldDesc:"userID 如果为野怪则为0" `
// 玩家名称野怪为UTF-8的'-'固定16字节
// 使用[16]byte存储固定长度的字节数组
Nick string `struc:"[16]byte"`
}
// NoteReadyToFightInfo 战斗准备就绪消息结构体NoteReadyToFightInfo
type NoteReadyToFightInfo struct {
MAXPET uint32 `struc:"skip"` // 最大精灵数 struc:"skip"`
// 战斗类型ID与野怪战斗为3与人战斗为1前端似乎未使用
// @UInt long
Status EnumBattleMode `fieldDesc:"战斗类型ID 但前端好像没有用到 与野怪战斗为3与人战斗似乎是1" `
Mode EnumBattleMode `struc:"skip"`
// 我方信息
OurInfo FightUserInfo `fieldDesc:"我方信息" serialize:"struct"`
// Our *socket.Player `struc:"skip"`
OurPetListLen uint32 `struc:"sizeof=OurPetList"`
// 我方携带精灵的信息
// ArrayList<ReadyFightPetInfo>,使用切片模拟动态列表
OurPetList []ReadyFightPetInfo `fieldDesc:"我方携带精灵的信息" serialize:"lengthFirst,lengthType=uint16,type=structArray"`
// 对方信息
OpponentInfo FightUserInfo `fieldDesc:"对方信息" serialize:"struct"`
//Opp *socket.Player `struc:"skip"`
OpponentPetListLen uint32 `struc:"sizeof=OpponentPetList"`
// 敌方的精灵信息
// 野怪战斗时客户端接收此包前已生成精灵PetInfo将部分信息写入该列表
OpponentPetList []ReadyFightPetInfo `fieldDesc:"敌方的精灵信息 如果是野怪 那么再给客户端发送这个包体时就提前生成好了这只精灵的PetInfo,然后把从PetInfo中把部分信息写入到这个敌方的精灵信息中再发送这个包结构体" serialize:"lengthFirst,lengthType=uint16,type=structArray"`
}
// 当A和B都 这时候给双方回复开始战斗包
func (t *NoteReadyToFightInfo) onBothFinished() {
fmt.Println("A和B都已完成触发onBothFinished")
}
// ReadyFightPetInfo 准备战斗的精灵信息结构体ReadyFightPetInfo类
type ReadyFightPetInfo struct {
// 精灵ID@UInt long
ID uint32 `fieldDesc:"精灵ID" `
// 精灵等级,@UInt long
Level uint32 `fieldDesc:"精灵等级" `
// 精灵当前HP@UInt long
Hp uint32 `fieldDesc:"精灵HP" `
// 精灵最大HP@UInt long
MaxHp uint32 `fieldDesc:"最大HP" `
SkillListLen uint32 `struc:"sizeof=SkillList"`
// 技能信息列表固定4个元素技能ID和剩余PP无技能则为0
// List<SkillInfo>初始化容量为4
SkillList []model.SkillInfo `fieldDesc:"技能信息 技能ID跟剩余PP 固定32字节 没有给0" serialize:"fixedLength=4,type=structArray"`
// 精灵捕获时间,@UInt long
CatchTime uint32 `fieldDesc:"精灵捕获时间" `
// 捕捉地图固定给0@UInt long
CatchMap uint32 `fieldDesc:"捕捉地图 给0" `
// 固定给0@UInt long
CatchRect uint32 `fieldDesc:"给0" `
// 固定给0@UInt long
CatchLevel uint32 `fieldDesc:"给0" `
SkinID uint32 `fieldDesc:"精灵皮肤ID" `
Shiny uint32 `fieldDesc:"精灵是否闪" `
}
// FightOverInfo 战斗结束信息结构体 2506
type FightOverInfo struct {
//1=isPlayerLost 对方玩家退出
// 2=isOvertime 正常对战结束?有质疑
// 3=isDraw 双方平手
// 4=isSysError 系统错误
// 5=isNpcEscape 精灵主动逃跑
Reason EnumBattleOverReason // 固定值0
WinnerId uint32 // 胜者的米米号 野怪为0
TwoTimes uint32 // 双倍经验剩余次数
ThreeTimes uint32 // 三倍经验剩余次数
AutoFightTimes uint32 // 自动战斗剩余次数
EnergyTimes uint32 // 能量吸收器剩余次数
LearnTimes uint32 // 双倍学习器剩余次数
}
type CatchMonsterOutboundInfo struct {
// CatchTime 捕捉时间
CatchTime uint32 `json:"catchTime" `
// PetId 宠物编号
PetId uint32 `json:"petId" `
}
type LoadPercentOutboundInfo struct {
// 玩家userId使用结构体标签模拟注解
Id uint32 `fieldDescription:"玩家userId" autoCodec:"true"`
// 加载百分比,使用结构体标签模拟注解
Percent uint32 `fieldDescription:"加载百分比" autoCodec:"true"`
}