二七王:接上 SubGameHooks.DeskInfo(中途进桌),复用重连的重画路径

平台 07_Desk.js 在「牌局已开始 + 走加入房间而非重连」时调 Game_Modify.DeskInfo(_msg.data.deskinfo),
该 hook 此前只有注释占位,整份 deskinfo 被 02 转发壳静默丢弃、界面全空且不报错。

裁剪核实(读平台源码):两条路径的 deskinfo 都出自 server_room/class.return.js——
进房走 self_join_room 的 get_deskinfo(o_room, o_player.gameinfo.seat),
登录走 self_login 的 get_deskinfo(o_player.gameinfo.o_room, o_player.gameinfo.seat),
同一个函数、同一个「本人座位」入参。底牌/埋牌底牌只给庄家、亮牌只给闲家、mustcard 只给轮到那家
等可见性裁剪对中途进桌一样生效,不存在「拿到别人视角」的问题,接线安全。

test_hooks 新增 4 条断言,含「同一份 deskinfo 分别喂 DeskInfo 与 Reconnect,snapshot 逐字段相同」。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-27 22:06:53 +08:00
co-authored by Claude Opus 5
parent f8a154ff7a
commit 8e0c8fdc90
2 changed files with 37 additions and 2 deletions
+18 -2
View File
@@ -122,8 +122,7 @@ SubGameHooks.gamemydraw = function (gameid, spid, times, timelong, no2, no3, no4
// [A] Free(_msg):投票解散确认回调。
// SubGameHooks.Free = function (_msg) { /* ... */ };
// [A] DeskInfo(_msg):未开战状态下加入牌桌的数据同步。
// SubGameHooks.DeskInfo = function (_msg) { /* ... */ };
// [A] DeskInfo(_msg):牌局已开始时加入牌桌的数据同步(实现见文末「网络与对局」一段)。
// [A] breakRoom():开局后自己退出房间触发。
// SubGameHooks.breakRoom = function () { /* ... */ };
@@ -295,6 +294,23 @@ SubGameHooks.Reconnect = function (_deskinfo) {
EQW_ResyncHandler.handleDeskinfo(_deskinfo);
};
// 中途进桌:牌局【已经开始】,但自己走的是「加入房间」而非「重连」这条路径。
// 平台 07_Desk.js 在 self_join_room 且 battlestate==1 时走 Game_Modify.DeskInfo(_msg.data.deskinfo),
// 与 self_login 的 Game_Modify.Reconnect(_msg.data.deskinfo) 是两条并列分支——
// 不接这个 hook,整份 deskinfo 会被 02 转发壳静默丢弃(无 hook 即 no-op),界面全空且不报错。
//
// 【入参与 Reconnect 完全同源、且已按【自己的】座位裁剪】:
// 两条路径的 deskinfo 都出自服务端 server/youle/server_room/class.return.js —— 进房走
// self_join_room 的 get_deskinfo(o_room, o_player.gameinfo.seat),登录走 self_login 的
// get_deskinfo(o_player.gameinfo.o_room, o_player.gameinfo.seat),同一个函数、同一个
// 「本人座位」入参。get_deskinfo 内部的可见性裁剪(底牌/埋牌底牌只给庄家、亮牌只给闲家、
// mustcard 只给轮到的那家)因此对中途进桌一样生效,不会把别人的视角发过来。
// 故直接复用同一条重画路径(前端 04 §3「重连 = 重画」),不为它单写一套渲染。
SubGameHooks.DeskInfo = function (_deskinfo) {
SubGameHooks._syncMySeat();
EQW_ResyncHandler.handleDeskinfo(_deskinfo);
};
// 重连但未开战:没有牌局数据,无需重画对局
SubGameHooks.ReconnectNoMakewar = function () {
SubGameHooks._syncMySeat();