二七王:出牌顺序收敛为唯一口径,重连包补发 baozhu

同一份数据「这一手打出的牌」此前有两个顺序口径:chupai*/playproc.cards
回显客户端请求原序,重连包 pushlist 则从 playround 反查后自己再排一次序。
一手多张(甩牌/对子/拖拉机)时两者必然分岔;同编码的一对牌更是排序都
区分不了,靠"两处各自排序"永远收敛不了。

改为单一写入处:
- 新增 order_playcards(),do_playcard 入口归一化一次(顺带隔离
  can_playcard 的原地排序,不再就地改写 pack.data.cards)
- 新增 paiju.playhistory,出牌当场归档;新增 get_pushlist() 只做深拷贝
- class.export.js 删掉整段反查+重排,改为直读归档
- do_playcard 三个分支都给 re.cards,mod.js 去掉回落到入参的兜底

顺带修复重连包漏发 baozhu:它是余主公示与明牌按钮的开关,此前只在
chupai 包里给,报无主后重连按钮会凭空消失。现与 chupai 同源同门控下发。

协议文档新增 §0.6「一手出牌」的顺序口径,并补 PushCards.baozhu 字段。
测试:pushlist 一节改为真实链路驱动(一手多张 + 乱序提交),断言升级为
「重连每一手与当时的 chupai.cards 逐元素相等」;三处修复均已退回验证转红。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-27 20:12:03 +08:00
co-authored by Claude Opus 5
parent 5689ceab6f
commit 4508fe005f
8 changed files with 233 additions and 89 deletions
+5 -1
View File
@@ -481,7 +481,11 @@ youle_erqiwang.chupai = function(pack){
msg.data = {};
msg.data.success = true;
msg.data.seat = seat;
msg.data.cards = re.cards ? re.cards : cards; //实际打出的牌(甩错时为单张)
//实际打出的牌(甩错时为单张),顺序由 do_playcard 的 order_playcards 统一给出——
//与 playproc.cards、重连包 PushCards.pushlist 同一个口径(SSOT)。
//【不回落到入参 cards】那是客户端的点击顺序,服务端不采信、更不回显(server 04 §8);
//do_playcard 成功时三个分支都会给出 re.cards,缺了就是它的缺陷,显式暴露、不兜底。
msg.data.cards = re.cards;
if (!_cfg.nocheck){
//三家座位牌况(缺门/无对 + 报副统计),仅可查牌下发。
//必须整表下发、不能只带出牌者一家:design §9 要求「一旦有玩家报无主,就为全体三人