二七王:S-4 拆分 bottomcards 字段名,S-5 术语同步收口
S-4(服务端改动):底牌与埋牌底牌不再共用一个字段名。 - bottomcards = 底牌(发牌留桌 8 张)—— shangzhuang / ChooseMain / BuryCards,保持不变 - burycards = 埋牌底牌(庄家埋下 8 张)—— maipai(mod.js)、PushCards(class.export.js) - 结算 bottom.cards 未改名(分组名已表明是抠底相关),文档注明其语义 测试: - test_leak.js 的 CARD_FIELDS 白名单加入 burycards。这一步是必须的——不加的话 新字段会静默脱离下发面审计,闲家误收也发现不了。 - test_rpc.js 新增 11 条正反用例:庄家有 burycards 且为 8 张、庄家不再有 bottomcards(抓改名漏改)、闲家两个字段皆无、重连 PushCards 同上。 验证(不止「跑过了」): - 改动前基线 16 个文件全绿;改动后仍全绿,新增后 rpc 从 89 → 100 checks。 - 反向验证一:把 mod.js 的 burycards 改回 bottomcards → test_rpc 新用例 FAIL, 且 test_leak 报出真实泄露(赋值改了而 delete 没改时,闲家会收到庄家埋的牌)。 - 反向验证二:删掉闲家侧的 delete msg.data.burycards → test_leak 立刻抓出 5 张越权牌,确认 burycards 确已纳入审计白名单。 两次验证后均已还原并复跑全绿。 S-5:术语同步收口。design.md / packet_protocol.md / 代码注释均已改用 「底牌 / 埋牌底牌」;compliance 三份历史核对记录有意不改(反映当时的 design 表述,下轮核对按新 design 重做)。 另:T-9 亮牌条文案暂定「x对 x主」(取 liangpai.zhupair 与 zhu,其余档位 先不渲染、协议不变)。至此 29 项待确认规格全部有结论。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -15,14 +15,15 @@
|
||||
| **底牌** | 发牌时**没有发给玩家**、扣在桌面的 8 张 | ~~暗牌~~ |
|
||||
| **埋牌底牌** | 庄家**埋牌**时从手里扣下的 8 张 | ~~底牌~~ |
|
||||
|
||||
⚠️ **两批牌目前共用同一个字段名 `bottomcards`**,只能靠「出现在哪个包」区分语义:
|
||||
**两批牌的字段名已拆分**(2026-08-25,原先共用 `bottomcards`):
|
||||
|
||||
| 字段位置 | 实际含义 |
|
||||
| --- | --- |
|
||||
| `shangzhuang.bottomcards`、`deskinfo.ChooseMain.bottomcards`、`deskinfo.BuryCards.bottomcards` | **底牌** |
|
||||
| `maipai.bottomcards`、`deskinfo.PushCards.bottomcards`、结算 `bottom.cards` | **埋牌底牌** |
|
||||
| 字段名 | 含义 | 出现在 |
|
||||
| --- | --- | --- |
|
||||
| **`bottomcards`** | **底牌** | `shangzhuang`、`deskinfo.ChooseMain`、`deskinfo.BuryCards` |
|
||||
| **`burycards`** | **埋牌底牌** | `maipai`、`deskinfo.PushCards` |
|
||||
| `bottom.cards` | **埋牌底牌** | 结算包的 `bottom` 分组(分组名已表明是抠底相关,字段未改名) |
|
||||
|
||||
字段名拆分(底牌保持 `bottomcards`、埋牌底牌改 `burycards`)的计划见 `docs_dev/二七王-UI资源与精灵清单.md` §7.5 的 **S-4**;**在拆分落地前,收发两侧都必须按上表判断语义**。
|
||||
同一个包里不会同时出现这两个字段。**下发面**:`burycards` 与 `bottomcards`(非 70 分时)都**只发给庄家**,闲家两者皆无——已由 `test/test_leak.js` 的泄露审计覆盖。
|
||||
|
||||
### 0.1 成败标志 `data.success`
|
||||
|
||||
@@ -227,7 +228,7 @@
|
||||
| 参数名 | 类型 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| cards | 数组 | 埋牌后手上的牌,去掉了埋牌,庄家才有此属性,闲家没有该属性 |
|
||||
| bottomcards | 数组 | **埋牌底牌**(庄家埋下的 8 张),庄家才有此属性,闲家没有该属性。⚠️ 与 `shangzhuang.bottomcards`(底牌)**同名不同义**,见文首「术语」|
|
||||
| burycards | 数组 | **埋牌底牌**(庄家埋下的 8 张),庄家才有此属性,闲家没有该属性。注意与 `shangzhuang.bottomcards`(**底牌**,发牌留桌 8 张)是两批不同的牌,见 §0.0 |
|
||||
| seat | 整数 | 出牌者的位置序号(即将首出的庄家)|
|
||||
| countdown | 整数 | 出牌倒计时 |
|
||||
| liangpai | json | 庄家亮牌信息(design §8.2),**只有闲家、且可查牌模式、且庄家埋牌后手牌达标时才有**。结构(各字段按是否达标出现):`zhu` 主牌总数、`zhupair` 主对子数、`zhutuo` 主拖拉机组数(固定主牌王+2+7 总数 ≥10 时有这三项);`wang` 王数(王≥3 时);`qi` 7 数(7≥6 时);`er` 2 数(2≥6 时)。都不达标则无此属性。统计口径是庄家**埋牌后 28 张的静态快照**(排除已埋的 8 张、但包含之后已打出的牌),全局固定不随出牌缩水,故重连包里的同名字段取值一致 |
|
||||
@@ -543,7 +544,7 @@
|
||||
| multiple | 整数 | 叫分对应的基础子数 `get_base_bycall(call, climb)`,**随房间「爬坡」开关取值**(roomtype 位3):常规算子 65→2 60→3 55→4 50及以下→6;爬坡 65→2 60→3 55→4 50→6 45→7 40→8 35→9 30→10 25→11 20→12 15→13 10→14 5→15;两种模式下 70→2;无叫分→0。与结算包 `aset.multiple` 同源同值(design §7.1/§7.3.1)|
|
||||
| flower | 整数 | 主牌花色 |
|
||||
| countdown | 整数 | 出牌倒计时 |
|
||||
| bottomcards | 数组 | **埋牌底牌**(庄家埋下的 8 张),只有庄家有此属性。⚠️ 与 `ChooseMain`/`BuryCards.bottomcards`(底牌)**同名不同义** |
|
||||
| burycards | 数组 | **埋牌底牌**(庄家埋下的 8 张),只有庄家有此属性。注意与 `ChooseMain`/`BuryCards.bottomcards`(**底牌**)是两批不同的牌,见 §0.0 |
|
||||
| grade | 整数 | 当前的捡分分数 |
|
||||
| gradecards | 数组 | 当前的捡分分牌,只有闲家有此属性 |
|
||||
| playproc | json | 当前出牌情况 `o_paiju.playproc`:`round` 第几轮、`start` 本轮首出位置、`currseat` 当前出牌位置、`startcount` 首出张数、`startflower` 首出花色、`starttype` 首出牌型、`maxseat` 本轮最大者位置、`maxcard` 最大牌编码、`cards` 本轮三家各自出的牌(数组下标=位置序号)、`shuai_demand` 首家甩牌的分量需求 `{tractors:[连对数...],pairs,singles}`(非甩牌为 null,供跟牌逐分量强制匹配,design §5.4.4)。**两种查牌模式下恒有此属性**——`cards` 是当前这一轮桌面上的牌,不属于「查牌」,屏蔽了后出的人就无从跟牌(design §9 末尾)|
|
||||
|
||||
Reference in New Issue
Block a user