/////////////////////////////////////////////////////////////// ////////// EQW_BuryHandler: 埋牌(maipai)//////////////////// /////////////////////////////////////////////////////////////// // 协议 §9:cards 埋牌后手牌(仅庄家) / burycards 埋牌底牌(仅庄家) / // step 阶段(=5 出牌) / seat 控制权=首出者(必为庄家) / countdown 出牌倒计时 / // seatlist 三家牌况(仅可查牌模式) / // liangpai 亮牌(仅闲家 + 可查牌模式 + 庄家固定主牌达门槛) // // 注意 burycards(埋牌底牌,庄家埋下的 8 张)与 bottomcards(底牌,发牌留桌的 8 张) // 是两批不同的牌,协议 §0.0 与验收清单专门警告过别写反。 // // 【seatlist 此刻是全初值,但必须接】:埋牌完成时这张表刚初始化 // (每家 [[0,0],[0,0],[0,0],[0,0],[-1,-1]]),界面上看不出差别——但「埋牌完成 → 庄家首出」 // 这段窗口内重连拿到的 PushCards.seatlist 就是它,漏接会让增量路径此刻为空、重连路径却有表。 // // 【bottomcards 到此失效,要清空】:底牌在上庄时已翻给玩家看并并入手牌,埋牌完成后 // 只剩「埋牌底牌 burycards」有意义;deskinfo 的 PushCards 不带 bottomcards,重连重建恒为 []。 // // 【playproc 是服务端的「本轮进行态」,原样拷贝】:埋牌完成时服务端已就地开好 round-1 // 的进行态(庄家首出、桌面全空),恒有、三家同值,与 chupai1/2/3.playproc / 重连包 // PushCards.playproc 同源同结构(服务端同一个 get_playproc())。没有它,「埋牌完成 → // 庄家首出」这段窗口增量路径 table.playproc 会停在上一阶段的 null,与重连路径不一致。 var EQW_BuryHandler = EQW_BuryHandler || { handle: function (data) { if (!data.hasOwnProperty('seat')) { console.error('[EQW_BuryHandler] maipai 缺 seat,已跳过该包'); return; } //庄家才有的两项,闲家缺字段时保持原值、不抹手牌 EQW_GameState._apply(EQW_GameState.my, data, { cards: 'cards', buryCards: 'burycards' }); //底牌已并入手牌、埋牌完成即失效(重连的 PushCards 不带它),显式清空保持两条路径一致 EQW_GameState.my.bottomCards = []; //三家牌况(仅可查牌模式)、闲家才可能有的亮牌、本轮进行态(恒有,见上方注释) EQW_GameState._apply(EQW_GameState.table, data, { seatlist: 'seatlist', liangpai: 'liangpai', playproc: 'playproc' }); //阶段只读包字段(服务端权威),不按 rpc 名硬编码 step=5 EQW_GameState._apply(EQW_GameState.aset, data, { step: 'step' }); //控制权:本包的 seat 就是「轮到谁」(即将首出的庄家,服务端取自 playproc.currseat) EQW_GameState._apply(EQW_GameState.turn, data, { seat: 'seat', countdown: 'countdown' }); EventBus.emit(EQW_Events.EQW_BURY_DONE); if (data.hasOwnProperty('cards')) { EventBus.emit(EQW_Events.EQW_HAND_CHANGED); } EventBus.emit(EQW_Events.EQW_TURN_CHANGED); } };