refactor: 重构战斗结构体以支持双打模式

This commit is contained in:
xinian
2026-04-04 22:13:42 +08:00
committed by cnb
parent 7916f90992
commit 39e1d4c42f
16 changed files with 543 additions and 246 deletions

View File

@@ -17,8 +17,9 @@
### 1.2 本清单目标
- 在不破坏现有 `1v1` 的前提下落地组队战斗可运行版本MVP
- 对齐 `flash` 组队战斗关键协议与关键行为开战出招切宠道具结算战斗结束
- 留出兼容层允许旧 `24xx/25xx` 流程继续使用
- 对齐 `flash`/社区实现中的关键行为开战出招切宠道具结算战斗结束
- 协议层采用一个统一结构体 + phase 字段方案单打/双打共用同一序列化模型
- 保留旧 `24xx/25xx` 流程入口通过服务端适配映射到统一结构体
### 1.3 非目标
@@ -49,74 +50,58 @@
- 回合主链仍以双动作兼容流程为中心
- 组队相关特性存在 TODO例如 `501/502/503`
### 2.3 外部实现参考本次新增
- `arcadia-star/seer2-fight-ui`
- 双打核心模型不是独立命令集而是统一帧模型 + `uiStyle + side + position`
- `uiStyle` 支持 `2v2/2v1`战位通过 `position(main/sub)` 区分
- `arcadia-star/seer2-next-message/src/entity/fight.rs`
- 采用统一战斗实体结构`team/user/pet` + `side/position`
- 行为包拆分为 `Load/Hurt/Change/Escape/...`但底层字段模型统一
- `ukuq/seer2-server/src/seer2/fight`
- `ArenaResourceLoadCMD -> TeamInfo -> FightUserInfo -> FighterInfo` 为层级化统一结构
- `FighterInfo` 直接包含 `position/hp/maxHp/anger/skills`适合直接映射为本项目统一结构体
---
## 3. 协议对齐清单按优先级
> 说明命令号来源于 `flash` `4c07fa07:CommandID.as`
> 实施时可先做服务端可跑+字段兼容逐步补全所有字段
> 说明本清单改为统一协议结构体路线不再强制先实现 `75xx` 独立命令族
> 推荐做法保留旧入口命令服务端内部统一转为 `FightActionEnvelope/FightStateEnvelope`
### 3.1 P0 必做MVP 必须
- [ ] `7555 GROUP_READY_TO_FIGHT`
- 用途组队成员准备
- 入参建议`room/groupId + userId + actorSlotsReady`
- 出参建议广播 ready 状态变化
- [ ] `7557 GROUP_START_FIGHT`
- 用途下发组队开战结构
- 参考客户端结构
- `isVsNPC`
- `groupOneMembCnt + groupOneList[]`
- `groupTwoMembCnt + groupTwoList[]`
- `group list` 每项至少要有`side/pos/userID/petID/catchTime/hp/maxHP/level/catchType`
- [ ] `7558 GROUP_FT_USE_SKILL`
- 用途组队技能指令
- 参考客户端 payload`skillId(uint32) + side(byte) + pos(byte)`6字节
- 服务端内部映射`actorIndex + targetIndex`
- [ ] `7563 GROUP_FT_CHG_PET`
- 用途组队切宠请求
- 至少支持按操作者位切宠
- [ ] `7562 GROUP_FT_USE_ITEM`
- 用途组队用道具
- 至少支持 actor/target 生效
- [ ] `7560 GROUP_FT_OVER`
- 用途组队战斗结束
- 至少下发结束原因胜方标识结算主体
- [ ] 统一入站动作结构 `FightActionEnvelope`
- 最少字段`actionType/actorIndex/targetIndex/skillId/itemId/catchTime/escape/chat`
- 兼容映射
- `2405 -> actionType=skill`
- `2406 -> actionType=item`
- `2407 -> actionType=change`
- `2410 -> actionType=escape`
- [ ] 统一出站状态结构 `FightStateEnvelope`
- 最少字段
- `phase``start/skill_hurt/change/over/load/chat`
- `left[]/right[]`元素为统一 `FighterState`
- `meta`回合号天气胜负结束原因
- [ ] 统一战位子结构 `FighterState`
- 每项至少包含`side/position(userSlot)/userId/petId(catchTime)/hp/maxHp/level/anger/status/prop/skills`
### 3.2 P1 强烈建议提升一致性
- [ ] `7559 GROUP_FT_SKILL_HURT`
- 对齐技能伤害播报攻击方+受击方快照
- 参考结构包含状态数组能力等级技能HP 变化暴击伤害值
- [ ] `7567 GROUP_FT_CHG_PET_SUC`
- 切宠成功广播保障前端战位同步
- [ ] `7568 GROUP_FT_ESCAPE_SUC`
- 逃跑成功广播含退出战位
- [ ] `7570 GROUP_CHAT_MSG`
- 组队战斗聊天转发
- [ ] `7571/7572 GROUP_LOAD_PERCENT(_NOTICE)`
- 组队加载进度同步
- [ ] 完善 `phase=skill_hurt`
- 至少带施法方快照受击方快照技能暴击伤害HP 变更
- [ ] 完善 `phase=change`
- 至少带切宠发起位切入目标位新精灵状态
- [ ] 完善 `phase=over`
- 至少带结束原因胜方收益主体
- [ ] 完善 `phase=load/chat`
- 组队加载进度战斗内聊天统一走同一 envelope
### 3.3 P2 视时间补齐
- [ ] `7561 GROUP_FT_SPRITE_DIE`
- [ ] `7573 GROUP_FT_SPRITE_NOTICE`
- [ ] `7574 GROUP_FT_WIN_CLOSE`
- [ ] `7575 GP_SKILL_WAIT_PERT`
- [ ] `7576 GP_SKILL_WAIT_NOTICE`
- [ ] `7585 GROUP_FT_OVERTIME_NOTICE`
- [ ] `7586 GROUP_FT_SKILL_PLAY_OVER`
- [ ] `7587 GROUP_FT_TIME_OUT_EXIT`
- [ ] `7588 GROUP_FT_RELATION_NOTICE`
- [ ] `phase=sprite_die/sprite_notice/win_close`
- [ ] `phase=skill_wait/skill_wait_notice`
- [ ] `phase=overtime/timeout_exit/relation_notice`
---
@@ -124,13 +109,13 @@
## 4.1 协议与结构层Owner A
- [ ] 新增组队协议结构文件
- 建议新建`logic/service/fight/cmd_group.go`
- 要求所有组队命令入站结构都有 `TomeeHeader cmd:"xxxx"`
- [ ] 新增统一协议结构文件
- 建议新建`logic/service/fight/cmd_unified.go`
- 要求统一定义 `FightActionEnvelope` 和映射辅助结构
- [ ] 新增组队出站结构
- 建议新建`logic/service/fight/info/group_info.go`
- 要求明确 `side/pos/user/pet/hp/maxHp/level` 等核心字段
- [ ] 新增统一出站结构
- 建议新建`logic/service/fight/info/unified_info.go`
- 要求定义 `FightStateEnvelope/FighterState`支持单打与双打
- [ ] 统一战位字段命名规范
- `actorIndex`我方执行位
@@ -139,26 +124,20 @@
验收
- [ ] `controller.Init(true)` 能注册全部新命令无重复 cmd panic
- [ ] 对每个新 cmd可反序列化入参并进入控制器方法
- [ ] cmd`2405/2406/2407/2410`可无损映射到统一入站结构
- [ ] 统一出站结构在 `start/skill_hurt/change/over` phase 均可序列化
---
## 4.2 控制器与路由层Owner B
- [ ] 新增组队战斗控制器
- 建议新建`logic/controller/fight_group.go`
- 包含
- 组队准备
- 组队出招
- 组队切宠
- 组队道具
- 组队逃跑
- 组队聊天
- [ ] 新增统一动作入口可单文件
- 建议新建`logic/controller/fight_unified.go`
- 用途将旧包和未来扩展包统一落到 `FightActionEnvelope`
- [ ] 兼容旧协议入口
- `2405/2406/2407` 保持可用默认 `actorIndex=0,targetIndex=0`
- `75xx` 走组队专用入口
- 组队场景由 `actorIndex/targetIndex` 与战斗上下文决定不再依赖独立 `75xx`
- [ ] 增加战前校验
- 成员是否在同一组队房间
@@ -167,7 +146,7 @@
验收
- [ ] 双端同时发送 `7558` 能转化为 `UseSkillAt(...)`
- [ ] 任意技能动作都能转化为 `UseSkillAt(...)` `actorIndex/targetIndex`
- [ ] 非法战位命令被拒绝不影响其他战位
---
@@ -215,8 +194,8 @@
- 战斗结束广播
- [ ] 保留旧包兼容必要时双发
- 组队战斗对新包
- 非组队仍可走 `2503/2505/2506`
- 单打/双打统一走同一结构体
- 如前端未升级可按需保留 `2503/2505/2506` 过渡映射
验收
@@ -276,14 +255,14 @@
- 协议/结构
- `logic/service/fight/cmd.go`
- `logic/service/fight/cmd_group.go`新增
- `logic/service/fight/cmd_unified.go`新增
- `logic/service/fight/info/info.go`
- `logic/service/fight/info/group_info.go`新增
- `logic/service/fight/info/unified_info.go`新增
- 控制器
- `logic/controller/fight_base.go`
- `logic/controller/fight_pvp_withplayer.go`
- `logic/controller/fight_group.go`新增
- `logic/controller/fight_unified.go`新增
- 核心流程
- `logic/service/fight/new.go`
@@ -309,8 +288,8 @@
### M1协议可通
- [ ] 75xx 关键命令可收
- [ ] 控制器能转发 `FightC` indexed 接口
- [ ] 统一结构体可完成 `start/skill_hurt/change/over` 四类下
- [ ] 旧命令入口均可映射 `FightC` indexed 接口
### M2核心可跑
@@ -339,7 +318,7 @@
缓解回合开始/结束 pair 执行中抽离确保每回合只触发一次
- 风险协议切换导致旧客户端不可用
缓解保留旧包并按战斗类型分流必要时过渡期双发
缓解服务端保持旧入口不变先做旧包 -> 统一结构映射前端按版本切流
- 风险effect 批量改动引发回归
缓解先做组队关键 effect其他 effect 分批迁移并每批回归
@@ -363,3 +342,16 @@
- 如改动协议字段必须附抓包样例或字段注释不允许只改代码不补说明
- 如发现与本清单冲突的历史逻辑兼容线上行为优先并在文档记录偏差原因
---
## 10. 可实现性结论统一协议结构体
- 结论可实现且风险可控
- 依据
- `seer2-fight-ui` 的双打模型本质是统一数据结构 + `uiStyle/side/position`不是强依赖独立命令族
- `seer2-next-message` `seer2-server` 都采用统一 `team/user/pet` 层级结构`position` 作为战位核心字段
- 本仓库已具备 `actorIndex/targetIndex` `UseSkillAt/ChangePetAt/UseItemAt` 能力协议统一后只需补齐映射和广播
- 实施建议
- 先完成旧入口 -> 统一入站结构映射
- 再完成统一出站结构 + phase 广播
- 最后做前端切换与旧包退场或长期双通道兼容