Files
youle_cocos/docs/protocol/README.md
T
joywayerandClaude Opus 4.8 08640ca89a docs(protocol): 交叉源码审计后重修全 8 篇协议文档
基于 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>
2026-06-28 11:35:47 +08:00

115 lines
8.0 KiB
Markdown
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.
# 友乐游戏前端通信协议文档(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 章给出收发字段并经源码核对。