二七王:C-1 修复 room.mySeat 永远为 -1
平台 12_Logic.js 在第 389 行调 Game_Modify.appStart(),而 C_Player = new Player(-1) 要到同函数第 480 行才执行,此刻 typeof C_Player === 'undefined',appStart 整体空转; 之后玩家登录 SetSeat 拿到真座位,appStart 再也不会被调用。于是 mySeat 永远停在 -1: 发包带 seat:-1 被服务端 check_player 全部拒绝、StartWar 差异化下发认领不到本座位而 整包丢弃、SeatMap.toDisplay(-1) 抛错——且全程无一处报错。 - 新增 SubGameHooks._syncMySeat():room.mySeat 的唯一写入处(SSOT),幂等、 座位非法或 C_Player 缺席时保持原值不倒退 - 在 setRoomDes / StartWar / Reconnect / ReconnectNoMakewar / appStart 各调用一次, 不赌「所有路径都经过某一个入口」 - 新增 SubGameHooks.changeSeat 并同步座位:Desk.change_seat 是唯一「座位中途变化 且不重走 setRoomDes」的路径,漏掉会让 mySeat 静默过期 - Rpc._seat() 改 fail-fast:座位非 0/1/2 即抛错,不再无声透传 -1 - 新增 client/tests/test_appstart_timing.js:复刻平台真实初始化时序, 全程不直接赋值 mySeat;已反向验证(退回 6 个调用点后核心断言转红) - test_rpc_send 补座位非法抛错断言;test_consistency 删除空转的 my.mustCard EXCLUDE client 23 脚本全绿,server 17 脚本 / 680 checks 全绿。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -21,9 +21,18 @@ var EQW_Rpc = EQW_Rpc || {
|
||||
APP: 'youle',
|
||||
ROUTE: 'erqiwang',
|
||||
|
||||
//—— 内部:取自己的座位 ——
|
||||
//—— 内部:取自己的座位(fail-fast)——
|
||||
//room.mySeat 由 SubGameHooks._syncMySeat 从平台 C_Player.seat 同步,初始值是 -1。
|
||||
//【为什么不能透传】seat:-1 发出去,服务端 check_player 必然返回 falsy → 每个操作都回 ERR.PLAYER,
|
||||
//叫分/选主/埋牌/出牌全部发不出去,而前端一声不吭。无声透传正是这类缺陷能长期潜伏的原因,
|
||||
//故与本文件其余形状校验一样在最近处显式失败。
|
||||
_seat: function () {
|
||||
return EQW_GameState.room.mySeat;
|
||||
var seat = EQW_GameState.room.mySeat;
|
||||
if (seat !== 0 && seat !== 1 && seat !== 2) {
|
||||
throw new Error('[EQW_Rpc] 座位未同步: ' + seat +
|
||||
'(须为 0/1/2;检查 SubGameHooks._syncMySeat 是否已由平台入口调用)');
|
||||
}
|
||||
return seat;
|
||||
},
|
||||
|
||||
//—— 内部:发送 ——
|
||||
|
||||
Reference in New Issue
Block a user