基于 00_Surface 平台层源码逐条交叉核对,修订 docs/protocol: - 补全前后端双向数据包(请求+响应/推送字段),覆盖框架模板全部平台层 rpc - 修正错误:重连触发条件(deskinfo 而非 isbattle)、小程序桥接(openminigamedata 而非 miniProData)、 get_player_invitecode 字段、setGameServer/GameData.Server 来源、route 分发守卫等 - 补遗漏 rpc:send_phone_code_wechat、submit_error/submit_log、refresh_task_state、 update_bean/update_charm/broadcast、connect_agentserver 字段、5 个成对推送常量 - 补 Desk 约 11 个字段、登录响应账号字段、10 个子游戏钩子 - 标注源码 bug(🐛 can_award 接收函数未定义、小程序 checkType=8 误接白名单) - 校准全篇 file:line 引用;待后端确认项标 ⚠️ - 明确范围:仅框架模板协议,不含子游戏对局包 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
115 lines
8.0 KiB
Markdown
115 lines
8.0 KiB
Markdown
# 友乐游戏前端通信协议文档(Game_Surface_3 框架逆向)
|
||
|
||
> 本文档基于现有 H5 前端框架 `projects/Game_Surface_3` 逆向整理,目标是为
|
||
> **使用 CocosCreator 重写一款全新前端**提供完整、精确的协议参考,做到
|
||
> **服务器不改动一行代码、完美适配**。
|
||
|
||
## 适配核心原则
|
||
|
||
新前端只要严格满足以下三点,即可被现有服务器无差别接受:
|
||
|
||
1. **传输层一致**:WebSocket(`ws://ip:port`)传输,纯文本 JSON;消息双层包装、心跳/握手包识别方式与本文档一致。
|
||
2. **消息信封一致**:发送/接收的信封字段 `{app, route, rpc, data}` 完全一致,`app` 恒为 `"youle"`。
|
||
3. **字段名/语义一致**:每个 RPC 的 `data` 字段名、类型、取值含义与本文档一致(服务器按字段名读取,多字段不影响,缺字段会报错)。
|
||
|
||
## 文档结构
|
||
|
||
| 文件 | 内容 |
|
||
|------|------|
|
||
| [00-框架架构设计.md](./00-框架架构设计.md) | **先读**:子游戏框架的整体架构——四层结构、自研精灵引擎、桥接层、平台/子游戏分层、生命周期、子游戏接入机制、CocosCreator 映射 |
|
||
| [01-传输层与架构.md](./01-传输层与架构.md) | 网络架构、消息信封、双层包装、心跳、握手、连接/重连、服务器切换、登录握手流程 |
|
||
| [02-协议-agent路由.md](./02-协议-agent路由.md) | 大厅服务器(route=agent)全部 RPC 收发字段 |
|
||
| [03-协议-room路由.md](./03-协议-room路由.md) | 房间服务器(route=room)全部 RPC 收发字段 |
|
||
| [04-数据结构.md](./04-数据结构.md) | C_Player、Desk(牌桌)、Player(座位)、登录响应、房间配置等核心数据结构 |
|
||
| [05-游戏内协议与桥接.md](./05-游戏内协议与桥接.md) | 子游戏(SubGame)游戏内协议机制、开局/结算流程、H5/小程序桥接 |
|
||
| [06-子游戏开发模式与Cocos方案.md](./06-子游戏开发模式与Cocos方案.md) | **重写参考**:框架提供给子游戏的钩子契约、状态归属、子游戏开发模式;含 CocosCreator 两套重写方案(具体某款子游戏的对局模块/roomtype/deskinfo 由各子游戏自定义,本框架文档不展开)|
|
||
|
||
## 关键事实速览
|
||
|
||
- **信封格式**:`{ "app":"youle", "route":"agent|room|platform", "rpc":"<rpc名>", "data":{...} }`
|
||
- **应用名**:`app = "youle"`(`AppList.app`)
|
||
- **路由**:`platform` / `agent`(大厅服)/ `room`(房间服);其它路由 → 走子游戏 `Game_Modify._ReceiveData`
|
||
- **服务器→客户端**为**双层包装**:外层 `{data: <内层>}`,内层才是 `{route,rpc,data}`(详见 01)
|
||
- **心跳单向**:服务器约 ~20s 推 `@serverheartbeat`(周期仅源码注释佐证,⚠️待抓包确认),**客户端不回包**;客户端仅做 30s 收包超时检测(`ConstVal.Max.heartbeat=30000`,且仅 `!isGameHall` 时启用)
|
||
- **握手包**:连接后服务器首包为 `@toconcon...`,客户端忽略
|
||
- **身份字段**:几乎所有请求都带 `agentid`、`gameid`、`playerid`(房间相关再加 `roomcode`)
|
||
|
||
## 提取来源文件
|
||
|
||
| 模块 | 文件 |
|
||
|------|------|
|
||
| 网络发送/接收封装 | `js/00_Surface/09_Net.js` |
|
||
| 协议常量(AppList/RouteList/RpcList) | `js/00_Surface/02_Const.js` |
|
||
| 连接/分发/心跳/重连 | `js/00_Surface/12_Logic.js` |
|
||
| WebSocket/Ajax 底层封装 | `js/00_Surface/00_minhttp.js` |
|
||
| 牌桌/房间接收处理 | `js/00_Surface/07_Desk.js` |
|
||
| 玩家数据结构 | `js/00_Surface/06_Player.js` |
|
||
| 全局数据 | `js/00_Surface/04_Data.js` |
|
||
| 子游戏钩子(空模板) | `js/01_SubGame/02_SubGame_Input.js` |
|
||
| 子游戏配置 | `js/01_SubGame/00_SubGame_Config.js` |
|
||
|
||
> ⚠️ **重要说明**:`Game_Surface_3` 是「平台壳框架」。平台层协议(登录/房间/大厅/聊天/排行等)完整可用,
|
||
> 已在本文档中精确给出。**游戏内对局协议**(发牌/出牌/结算等)在本工程中 `Game_Modify._ReceiveData` 为
|
||
> **空模板**,由各具体子游戏自定义。第 05 章给出其传输通道与格式约定;若需某款具体游戏的对局协议字段,
|
||
> 须从对应子游戏工程或抓包补充。
|
||
|
||
---
|
||
|
||
## 附录 · 完整 RPC 清单与覆盖状态(对照 `02_Const.js` RpcList)
|
||
|
||
> ✓=已在文档详述并核对源码;预留=`RpcList` 中定义但框架内**无处理函数/无调用**(历史遗留,新前端可不实现)。
|
||
|
||
| rpc | 路由 | 方向 | 状态 / 所在章节 |
|
||
|-----|------|------|----------------|
|
||
| player_login | agent | 收发 | ✓ 02 / 04(响应) |
|
||
| create_room | agent | 收发 | ✓ 02 / 04 |
|
||
| self_join_room | agent | 收发 | ✓ 02 / 04 |
|
||
| quick_enter_share_room | agent | 收发 | ✓ 02 |
|
||
| get_share_room | agent | 收发 | ✓ 02 |
|
||
| advanced_roomlist / advanced_createroom | agent | 收发 | ✓ 02 |
|
||
| getInfoByShortCode | agent | 收发 | ✓ 02 |
|
||
| switchRoomList | agent | 收发 | ✓ 02 |
|
||
| get_player_grade1 / get_player_grade2 | agent | 收发 | ✓ 02 |
|
||
| get_treasurelist / getShortCodeRankList / getVipRankList | agent | 收发 | ✓ 02 |
|
||
| get_player_task / player_finish_task / get_task_award | agent | 收发 | ✓ 02 |
|
||
| can_award | agent | 推送 | 🐛 02(接收函数 `C_Player.can_award` 未定义,到达即异常)|
|
||
| send_phone_code_wechat | agent | 收发 | ✓ 02(微信发手机验证码;调用点被注释,当前不发)|
|
||
| submit_error / submit_log | agent | 发送 | ✓ 02(错误上报,二者 rpc 均为 `submit_error`)|
|
||
| refresh_task_state | agent | 发送 | ✓ 02(`Send_can_award` 实发此 rpc,硬编码、不在 RpcList)|
|
||
| get_paylist / pay_succ / topup_card | agent | 收发 | ✓ 02(pay_succ 经 HTTP 上行,WS 发送处被注释)|
|
||
| giveCoin / set_bankpwd / change_star | agent | 收发 | ✓ 02 |
|
||
| update_charm / setAllCharm | agent | 推送/发 | ✓ 02 |
|
||
| binding_invitecode / get_player_invitecode | agent | 收发 | ✓ 02 |
|
||
| optBanList / getPlayerWhiteList / optWhiteList / setVipForbidSelect | agent | 收发 | ✓ 02 |
|
||
| binding_phone / send_phone_checkcode / setSign / query_player2 | agent | 收发 | ✓ 02 |
|
||
| submit_opinion / submit_location / submit_phoneinfo | agent | 发送 | ✓ 02 |
|
||
| kick_server / broadcast / playerBehavior | agent | 收/特殊 | ✓ 02 |
|
||
| connect_agentserver | agent | 推送 | ✓ 01 / 02 |
|
||
| update_roomcard / update_bean / kick_offline / show_message | agent | 推送 | ✓ 02(末表) |
|
||
| self_break_room / other_break_room | room | 收发 | ✓ 03 |
|
||
| self_exit_room / other_exit_room | room | 收发 | ✓ 03 |
|
||
| other_join_room | room | 推送 | ✓ 03 |
|
||
| other_offline / other_online | room | 推送 | ✓ 03 |
|
||
| self_apply_free_room / other_apply_free_room | room | 收发 | ✓ 03 |
|
||
| self_agree_free_room / other_agree_free_room | room | 收发 | ✓ 03 |
|
||
| self_refuse_free_room / other_refuse_free_room | room | 收发 | ✓ 03 |
|
||
| free_room | room | 推送 | ✓ 03 |
|
||
| self_makewar / other_makewar | room | 收发 | ✓ 03 / 05 |
|
||
| player_prepare | room | 收发 | ✓ 03 |
|
||
| change_room → change_seat | room | 发/推送 | ✓ 03 |
|
||
| send_text / send_voice / send_gift / send_phiz | room | 收发 | ✓ 03 |
|
||
| call_phone / hangup_phone | room | 收发 | ✓ 03 |
|
||
| beanroom_surrender | room | 收发 | ✓ 03 |
|
||
| share_room | room | 收发 | ✓ 03 |
|
||
| connect_roomserver | room | 推送 | ✓ 01 / 03 |
|
||
| over_game | (游戏内) | 推送 | ✓ 05(结算) |
|
||
| agentserver_game | (游戏内) | — | ✓ 05(对局中转保留名) |
|
||
| joinRoom (h5RpcList) | (桥接) | — | ✓ 05(H5/小程序唤起) |
|
||
| **play_voice** | room | — | **预留**:未实现,语音回包复用 `send_voice` |
|
||
| **receive_chat** | room | — | **预留**:未实现,聊天回包复用 `send_text` |
|
||
| **other_callphone** | room | — | **预留**:未实现,复用 `call_phone`(带 seat) |
|
||
| **other_hangup** | room | — | **预留**:未实现,复用 `hangup_phone`(带 seat) |
|
||
| **other_send_gift** | room | — | **预留**:未实现,复用 `send_gift`(带 sendseat) |
|
||
|
||
> 上述为 `RpcList` 全量(与 `02_Const.js` 1:1 对照)。除 5 个预留名外,全部已在 01–05 章给出收发字段并经源码核对。
|