From 82cfc98502207253bbd8283b98dedc978d32a691 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Tue, 25 Aug 2026 17:58:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E4=B8=83=E7=8E=8B=EF=BC=9Adesign=20?= =?UTF-8?q?=E4=B8=8E=E5=8D=8F=E8=AE=AE=E6=96=87=E6=A1=A3=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E3=80=8C=E5=BA=95=E7=89=8C=20/=20=E5=9F=8B=E7=89=8C=E5=BA=95?= =?UTF-8?q?=E7=89=8C=E3=80=8D=E6=9C=AF=E8=AF=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原命名与前端界面倒挂——界面上「底牌」按钮查看的正是发牌留桌那 8 张, 旧术语却把它叫「暗牌」,极易写反。现统一为: - 底牌 = 发牌时没有发给玩家、扣在桌面的 8 张(原「暗牌」) - 埋牌底牌 = 庄家埋牌时从手里扣下的 8 张(原「底牌」) design.md:全文 38 处表述替换(术语表、§4 坐庄流程、§6.3 扣底、§7.1 70 分说明、§8 算奖快照、§12.1 流程、§12.3 阶段速览),并在术语表后补 「术语变更记录」说明改名缘由与协议字段尚未拆分的现状。 packet_protocol.md:新增 §0.0 术语小节置于全文之首,逐条列出 bottomcards 在哪些包里指底牌、哪些包里指埋牌底牌;相关字段说明同步改用 新术语,并在 maipai / PushCards 两处加同名不同义的警示。 字段名本身暂未改动(底牌保持 bottomcards、埋牌底牌拟改 burycards), 拆分计划见前端清单 §7.5 S-4;在拆分落地前收发两侧按包判断语义。 Co-Authored-By: Claude Opus 5 (1M context) --- server/games/erqiwang/docs/design/design.md | 58 ++++++++++--------- .../erqiwang/docs/protocol/packet_protocol.md | 38 +++++++++--- 2 files changed, 61 insertions(+), 35 deletions(-) diff --git a/server/games/erqiwang/docs/design/design.md b/server/games/erqiwang/docs/design/design.md index 5b8d56c..d01a1a7 100644 --- a/server/games/erqiwang/docs/design/design.md +++ b/server/games/erqiwang/docs/design/design.md @@ -42,11 +42,11 @@ | 固定主牌 | 不论选择哪个花色为主,大王、小王、以及所有花色的"2""7"恒为主牌 | | 正2 / 正7 | 选定花色的"2""7",大于其余花色的"2""7"(口语里也叫"主2""主7",本文档统一用"正2""正7")| | 副2 / 副7 | 非选定花色的"2""7" | -| 暗牌 | 发牌时留在桌面的 8 张牌;庄家确认后可摸起查看,摸起后就不再是"暗牌",而是并入庄家手牌 | -| 底牌 | 庄家"埋牌"时从手牌中选出重新扣下的 8 张牌;"暗牌"与"底牌"是两批不同的牌,不通用、不互换 | -| 埋牌 | 庄家看到暗牌、摸起查看后,从手牌中选出 8 张重新扣下,作为"底牌" | +| 底牌 | 发牌时**没有发给玩家**、扣在桌面的 8 张牌;庄家确认后可摸起查看,摸起后就不再扣在桌面,而是并入庄家手牌 | +| 埋牌底牌 | 庄家"埋牌"时从手牌中选出重新扣下的 8 张牌;"底牌"与"埋牌底牌"是两批不同的牌,不通用、不互换 | +| 埋牌 | 庄家看到底牌、摸起查看后,从手牌中选出 8 张重新扣下,作为"埋牌底牌" | | 捡分 | 出牌中赢下的分牌(5、10、K)计入闲家总得分的过程 | -| 扣底 | 出完所有手牌后的最后一轮,若被闲家用主牌牌型压过庄家,则埋下的 8 张底牌也计入闲家捡分,并按牌型翻倍 | +| 扣底 | 出完所有手牌后的最后一轮,若被闲家用主牌牌型压过庄家,则埋下的 8 张埋牌底牌也计入闲家捡分,并按牌型翻倍 | | 拖拉机 | 同一花色(含主牌)里点数相邻的连续对子,如 K K Q Q 为"两托"(两连对) | | 甩牌 | 首家出牌时,一次性打出多组主牌组合(单张 / 对子 / 拖拉机自由搭配);仅主牌可以甩牌,副牌禁止甩牌,只能分单张 / 对子 / 拖拉机依次打出(见第 5.4 节) | | 毙牌 | 跟牌时手中没有本轮花色(缺门),改用主牌打出、且牌面大过本轮目前所有人的牌(见第 5.1 / 5.2 节) | @@ -57,6 +57,12 @@ | 傍王 | 可选房间规则:勾选后每张王额外算一奖,庄家、闲家都要算;这是在 8.1 常规算奖之外**额外叠加**的奖励,与常规算奖互不冲突(见第 8.3 节) | | 爬坡 | 可选房间规则:改变叫分对应的基础子数与保小光分数线,未勾选时按"常规算子"结算(见第 7 节) | +> **术语变更记录(2026-08-25)**:原「**暗牌**」(发牌留桌的 8 张)改称「**底牌**」;原「**底牌**」(庄家埋下的 8 张)改称「**埋牌底牌**」。 +> +> 改名原因:前端界面上「底牌」按钮查看的正是发牌留桌那 8 张,旧命名与界面倒挂、极易写反。 +> +> **本文已全文改用新术语。** 但 `docs/protocol/packet_protocol.md` 与服务端代码里的 `bottomcards` 字段名**尚未拆分**——两批牌目前仍共用这一个字段名,只靠「出现在哪个包」区分语义:`shangzhuang` / `ChooseMain` / `BuryCards` 里的是**底牌**,`maipai` / `PushCards` / 结算 `bottom` 分组里的是**埋牌底牌**。拆分计划见 `docs_dev/二七王-UI资源与精灵清单.md` §7.5 的 S-4。 + --- ## 2. 牌局构成 @@ -96,23 +102,23 @@ ## 4. 开局与坐庄流程 -1. 每人摸 28 张牌,剩余 8 张扣在桌面作为"暗牌"。 +1. 每人摸 28 张牌,剩余 8 张扣在桌面作为"底牌"。 2. 由暂定庄家开始,按逆时针方向依次叫分: - 叫分范围 5 ~ 70 分,步进 5 分。 - 叫分数值代表"庄家承诺闲家捡分总数将严格低于该数值"(即闲家捡分只要达到或超过这个数值,庄家就算没达成承诺,见第 7 节);数值越低代表叫分者越有信心,因此后叫的人必须叫出比当前更低的分数才能压过前者,不能叫相同或更高的分数。 - **暂定庄家必须叫分,不能"不叫"**:叫分从暂定庄家开始,他必须报出一个 5 ~ 70 之间的具体分数,不存在"暂定庄家弃权、三家都不叫"这种情况;起始叫分确定之后,后面的玩家才可以选择"叫出更低的分数"或"不叫"。 - 若某玩家直接叫出 5 分,则无人能再压过,立即确定为庄家。 - 若一家叫分后,另外两家都选择"不叫",则该叫分玩家成为本局庄家。 -3. 庄家确定后摸暗牌(摸完后庄家共 36 张): - - **非 70 分坐庄**:桌面 8 张暗牌**只有庄家可见**,庄家查看后摸入手牌。 - - **70 分坐庄**:在庄家摸暗牌**之前**,先把这 8 张暗牌**向所有玩家(含两个闲家)亮出 3 秒**,然后才由庄家把它们摸入手牌。 +3. 庄家确定后摸底牌(摸完后庄家共 36 张): + - **非 70 分坐庄**:桌面 8 张底牌**只有庄家可见**,庄家查看后摸入手牌。 + - **70 分坐庄**:在庄家摸底牌**之前**,先把这 8 张底牌**向所有玩家(含两个闲家)亮出 3 秒**,然后才由庄家把它们摸入手牌。 4. **选主 / 投降(同一决策点,二选一,互斥)**: - **选主**:庄家在 4 个花色中选定一个作为本局主牌(见第 3 节)→ 进入下一步埋牌、随后出牌。 - **投降**:仅当**叫分为 70 分**时,此决策点才额外提供"投降"选项;选择投降表示放弃本局,**直接结束、不再选主、不埋牌、不出牌**,按 7.1 节"70 分坐庄 · 投降"的固定结果结算(基础子数 1 个,庄家直接输;算奖仍照常,见 8.4 节)。选主与投降互斥——**选了花色就等于放弃投降、正常打牌;选了投降就不再选主**。 - 叫分 < 70 分时没有投降选项,只能选主。 - - (70 分坐庄的 8 张暗牌向所有玩家亮 3 秒,发生在上一步"庄家摸暗牌之前",见步骤 3。) + - (70 分坐庄的 8 张底牌向所有玩家亮 3 秒,发生在上一步"庄家摸底牌之前",见步骤 3。) - **前端表现**:此阶段界面显示 4 个花色选主按钮,且**每个花色按钮上要显示该花色在庄家手中有多少对**(供庄家判断选哪门为主);70 分坐庄时并列再显示一个投降按钮。 -5. **埋牌**(仅"选主/打牌"路径):庄家从 36 张里选出 8 张牌重新扣下("埋牌"),作为"底牌",供最后判断"扣底"使用;埋牌后庄家保留 28 张。(**本局先选主、后埋牌**——庄家先定主牌花色,知道主副后再决定埋哪 8 张。) +5. **埋牌**(仅"选主/打牌"路径):庄家从 36 张里选出 8 张牌重新扣下("埋牌"),作为"埋牌底牌",供最后判断"扣底"使用;埋牌后庄家保留 28 张。(**本局先选主、后埋牌**——庄家先定主牌花色,知道主副后再决定埋哪 8 张。) 6. 坐庄轮换规则(决定下一局的"暂定庄家"): - 第一局的暂定庄家为 **0 号座位**的玩家(此前没有打过任何牌局、还不存在"上一局的庄家",故取固定座位)。 - 若庄家本局获胜(庄赢),下一局暂定庄家仍为该玩家(连庄)。 @@ -261,9 +267,9 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 ### 6.3 扣底 -所有手牌出完后,若最后一轮闲家**用主牌**(不论单张、对子、拖拉机)**牌面压过庄家**、赢下最后一轮,才视为"扣底"(若闲家赢了最后一轮但用的不是主牌,则不算扣底)。触发后,庄家埋下的 8 张底牌翻开,若有分则计入闲家捡分。 +所有手牌出完后,若最后一轮闲家**用主牌**(不论单张、对子、拖拉机)**牌面压过庄家**、赢下最后一轮,才视为"扣底"(若闲家赢了最后一轮但用的不是主牌,则不算扣底)。触发后,庄家埋下的 8 张埋牌底牌翻开,若有分则计入闲家捡分。 -底牌的分要不要翻倍、翻几倍,取决于闲家扣底所用的那手牌(赢下最后一轮的牌)本身是什么牌型: +埋牌底牌的分要不要翻倍、翻几倍,取决于闲家扣底所用的那手牌(赢下最后一轮的牌)本身是什么牌型: | 闲家扣底所用牌型 | 倍数 | | --- | --- | @@ -275,7 +281,7 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 若最后一轮闲家是用第 5.4 节的**甩牌**(单张 + 对子 + 拖拉机混合的组合)扣底,取这套组合里**最高规格牌型**对应的倍数计算,其余较低规格的部分不额外叠加。例如甩出"单张 + 一对 + 两连对拖拉机"并以此扣底,最高规格是两连对拖拉机,整手按 4 倍计算。 -> **重要区分**:扣底翻的是**闲家的捡分得分(grade)**本身,属于"算分"阶段;这与第 7 节里"大光 ×3""小光 ×2""升 N 级 ×N"这些子数倍率是完全不同的两件事——那些乘的是**子数**,属于"算子"阶段。两者的先后顺序是:扣底先把底牌分(可能翻倍)计入闲家的捡分总数,这个最终捡分总数再拿去跟庄家叫分比较,判定过庄 / 小光 / 大光 / 闲家赢(升级),最后才由判定结果决定子数乘几倍。 +> **重要区分**:扣底翻的是**闲家的捡分得分(grade)**本身,属于"算分"阶段;这与第 7 节里"大光 ×3""小光 ×2""升 N 级 ×N"这些子数倍率是完全不同的两件事——那些乘的是**子数**,属于"算子"阶段。两者的先后顺序是:扣底先把埋牌底牌的分(可能翻倍)计入闲家的捡分总数,这个最终捡分总数再拿去跟庄家叫分比较,判定过庄 / 小光 / 大光 / 闲家赢(升级),最后才由判定结果决定子数乘几倍。 --- @@ -299,7 +305,7 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 3. **判定结果 → 子数倍率**:过庄 / 小光 / 大光 / 升级第几级,各自对应一个子数倍率,乘上第 1 层的基础子数,得到这一局的**子数结算结果 `X`**(前三层,即"算子",到此为止)。`X` 是庄家与**每一个**闲家之间"一对一"结算的基础金额:庄家赢(过庄 / 小光 / 大光)时,两个闲家各输给庄家 `X` 子;闲家赢(升级)时,庄家各输给两个闲家 `X` 子。 4. **算奖 → 结算倍率**:第 8 节算出的"奖数"(8.1 常规算奖 + 8.2 傍王,各玩家分别求和)**是"持有奖数的这个人"从其余两名玩家那里各自多收一笔钱的独立结算线,作用对象是这个人本身,不是整场结算的统一系数**——某玩家 P 这一局总共有 `N_P` 奖,则**另外两名玩家(不分庄闲)都要各自额外付给 P:`X × N_P` 子**。三名玩家可能同时都持有各自的奖数,会产生最多 3 条互相独立的额外支付线,与第 1~3 层的基础输赢结算加总,才是每个人这一局的最终盈亏。算奖的计算过程本身不受叫分、过庄 / 小光 / 大光、升级影响(只看手牌结构),详见 8.3 节的完整举例。 -> **例外**:70 分坐庄选择投降时不走第 1~3 层模型——直接固定基础子数 1 个、庄家输掉,不比较捡分、不判定过庄 / 小光 / 大光,见 7.1 末尾说明;但第 4 层算奖仍然照常叠加(投降是选主阶段的选择、未选主也未埋牌,按庄家"发牌 + 暗牌"共 36 张、无主牌花色计算,见 8.4 节)。 +> **例外**:70 分坐庄选择投降时不走第 1~3 层模型——直接固定基础子数 1 个、庄家输掉,不比较捡分、不判定过庄 / 小光 / 大光,见 7.1 末尾说明;但第 4 层算奖仍然照常叠加(投降是选主阶段的选择、未选主也未埋牌,按庄家"发牌 + 底牌"共 36 张、无主牌花色计算,见 8.4 节)。 **查表索引**:本节按叫分档位给出了完整判定表,位置如下: @@ -325,7 +331,7 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 - **选择投降**:基础子数按 **1 个**算,庄家直接输 1 个子(此时局面还没有真正出牌捡分,不经过 7.2 的大光 / 小光 / 升级判定,是一次性的固定结算)。 - **选择打牌**:基础子数按 **2 个**算(与 65 分相同),之后**照样按 7.2 节的方法,用捡分总数判定大光 / 小光 / 过庄 / 升级**,不是不细分——完整判定表见 7.2.1。 -70 分叫庄时,发牌时桌面留下的那 8 张暗牌(见第 4 节;不是埋牌埋下的底牌)需要**在庄家把它们摸入手牌之前、向所有玩家亮出 3 秒**,之后庄家才摸入手中;投降和打牌两种情况都适用(因为亮牌发生在选主 / 投降决策之前)。 +70 分叫庄时,发牌时桌面留下的那 8 张底牌(见第 4 节;不是埋牌时埋下的那 8 张「埋牌底牌」)需要**在庄家把它们摸入手牌之前、向所有玩家亮出 3 秒**,之后庄家才摸入手中;投降和打牌两种情况都适用(因为亮牌发生在选主 / 投降决策之前)。 ### 7.2 捡分 vs 叫分:庄家的过庄 / 小光 / 大光,闲家的升级(常规算子) @@ -562,7 +568,7 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 **8.1 常规算奖只认庄家的身份,不看闲家的手牌是否达标**:即使某位闲家的手牌结构凑巧也满足 8.1 表里的条件(比如手里也有 3 张王),这份常规算奖也**不会**计入这位闲家——常规算奖从规则上就只针对庄家一人。闲家想要获得算奖,只能靠 8.3 傍王(且必须房间勾选了这条可选规则)。 -**算奖依据的手牌快照时间点**:不管是 8.1(只看庄家)还是 8.3 傍王(庄闲都算),都按**静态初始手牌**计算——庄家是埋牌完成后的那一刻手牌(28 张),闲家是发牌完成后的那 28 张手牌;这个快照全程固定,不随之后的出牌、被吃、被打出而改变。**例外**:70 分投降局庄家未选主也未埋牌,其快照为"发牌 + 暗牌"共 36 张(无主牌花色),见 8.4 节。 +**算奖依据的手牌快照时间点**:不管是 8.1(只看庄家)还是 8.3 傍王(庄闲都算),都按**静态初始手牌**计算——庄家是埋牌完成后的那一刻手牌(28 张),闲家是发牌完成后的那 28 张手牌;这个快照全程固定,不随之后的出牌、被吃、被打出而改变。**例外**:70 分投降局庄家未选主也未埋牌,其快照为"发牌 + 底牌"共 36 张(无主牌花色),见 8.4 节。 **算奖(8.1 / 8.3)与亮牌(8.2)是两个互不干涉的独立概念**:算奖是结算阶段"该给多少额外结算分"的规则;亮牌只是出牌开始前"要不要向对手公开一部分手牌统计信息"的展示规则。两者各自有自己的触发条件,只是恰好都以庄家埋牌后的手牌结构为依据,因此部分门槛数值相同——但达成亮牌的条件不代表一定触发算奖,反之亦然,具体对照见 8.2 末尾的说明。 @@ -628,7 +634,7 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 以下三点已确认: - **庄家倒庄(闲家达标升级)时,8.1 常规算奖仍然生效**:算奖只看庄家埋牌后的手牌结构,与本局谁输谁赢无关。 -- **70 分投降时,仍叠加算奖倍率**:投降只是跳过了第 1~3 层的叫分 / 捡分判定(此时 `X = 1`)。投降是选主阶段的选择,庄家**未选主、未埋牌**,故算奖按庄家"发牌 + 暗牌"共 36 张手牌计算——因没有选定主牌花色,**没有连对链**,只有三 / 四王、六~八个 7、六~八个 2 这些组合,以及(勾选傍王时)按王数的傍王奖计入;8.1(及勾选傍王时的 8.3)照常计算并叠加。 +- **70 分投降时,仍叠加算奖倍率**:投降只是跳过了第 1~3 层的叫分 / 捡分判定(此时 `X = 1`)。投降是选主阶段的选择,庄家**未选主、未埋牌**,故算奖按庄家"发牌 + 底牌"共 36 张手牌计算——因没有选定主牌花色,**没有连对链**,只有三 / 四王、六~八个 7、六~八个 2 这些组合,以及(勾选傍王时)按王数的傍王奖计入;8.1(及勾选傍王时的 8.3)照常计算并叠加。 - **算奖对象的身份限制会带进 `N` 的计算**:8.1 只算庄家、8.3 傍王勾选后才不分庄闲(见第 8 节开头说明),把这名玩家实际适用的分量求和,才是他自己的 `N`;"其余两人向他支付 `X × N`"这条支付规则本身不因身份而改变,但闲家的 `N` 从一开始就不可能包含 8.1 的分量。 --- @@ -675,7 +681,7 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 - 选主阶段:4 个花色选主按钮上各显示"该花色在庄家手中的对子数"(供庄家判断选哪门为主);70 分坐庄时并列再显示一个投降按钮——选主与投降是同一决策点的互斥选择(见第 4 节)。 - 首家出主牌时可以甩牌,甩牌的生效条件、跟牌规则、甩错惩罚详见 5.4 节。 -- 牌局结束需要亮出底牌。 +- 牌局结束需要亮出埋牌底牌。 - 闲家在出牌时需要有 3 个提示选项: 1. **踩**:提示对家"我能大过庄家"。 2. **没分**:提示对家"我手上没分了"。 @@ -694,18 +700,18 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 1. **开局准备**:房间按第 10 节的设置(局数、扣卡方式、傍王、爬坡、查牌)建好后开战。第一局的暂定庄家为 0 号座位;之后每局按 4.6 的轮庄规则确定暂定庄家。 -2. **发牌**(第 2 节):92 张牌洗匀,三家各摸 28 张,剩余 8 张扣在桌面作为"暗牌"。 +2. **发牌**(第 2 节):92 张牌洗匀,三家各摸 28 张,剩余 8 张扣在桌面作为"底牌"。 3. **叫分坐庄**(4.2):由暂定庄家起、按逆时针依次叫分。暂定庄家必叫(5~70 分、步进 5,不能"不叫");其后每家只能叫比当前更低的分,或选择"不叫";有人叫出 5 分即立即坐庄,或一家叫分后另外两家都"不叫"也即坐庄。叫分越低表示庄家对"压住闲家捡分"越有信心,对应的基础子数越高(第 7 节)。 -4. **看暗牌**:庄家坐定后摸暗牌(摸完共 36 张)。非 70 分:8 张暗牌仅庄家可见。**70 分坐庄:庄家摸暗牌之前,先把这 8 张暗牌向所有玩家亮 3 秒,再由庄家摸入手牌**(4.4 / 第 4 节)。 +4. **看底牌**:庄家坐定后摸底牌(摸完共 36 张)。非 70 分:8 张底牌仅庄家可见。**70 分坐庄:庄家摸底牌之前,先把这 8 张底牌向所有玩家亮 3 秒,再由庄家摸入手牌**(4.4 / 第 4 节)。 5. **选主 / 投降(同一决策点,二选一,互斥)**(第 4 节): - **选主**:庄家选定一门花色为本局主牌(大王、小王、所有花色的 2、7 恒为主牌)→ 进入下一步埋牌。前端此阶段每个花色按钮上要显示该花色在庄家手中的对子数;70 分坐庄时并列显示投降按钮。 - **投降**:仅 70 分坐庄才有此选项;选投降即放弃本局,**不选主、不埋牌、不出牌**,直接按 7.1"70 分 · 投降"结算(算奖仍按下方 8 计,但用庄家 36 张、无主牌花色)。选花色就等于放弃投降、正常打牌。 - - (70 分的 8 张暗牌亮 3 秒发生在步骤 4"摸暗牌之前"。) + - (70 分的 8 张底牌亮 3 秒发生在步骤 4"摸底牌之前"。) -6. **埋牌**(第 4 节,仅"选主/打牌"路径):庄家从 36 张里选 8 张重新扣下作为"底牌"(供最后"扣底"判断),保留 28 张。(**先选主、后埋牌**。) +6. **埋牌**(第 4 节,仅"选主/打牌"路径):庄家从 36 张里选 8 张重新扣下作为"埋牌底牌"(供最后"扣底"判断),保留 28 张。(**先选主、后埋牌**。) 7. **出牌对局**(第 5、6 节): - 第一轮固定由庄家先出;此后每轮由上一轮牌面最大的一方先出。 @@ -714,12 +720,12 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 - 每轮比大小定出胜者:闲家赢下的那一轮,牌面上的分牌(5→5 分、10→10 分、K→10 分)计入闲家捡分;庄家赢的轮分牌作废(6.1~6.2)。 - 过程中:有玩家主牌出空需"报无主",可查牌模式下为全体展示他家主牌数量 / 对子结构(第 9 节);庄家手牌达到 8.2 的门槛时触发"亮牌"。 -8. **末轮扣底**(6.3):所有手牌出完后,若最后一轮由闲家**用主牌**赢下,则庄家埋的 8 张底牌翻开,其中的分按闲家赢牌的牌型翻倍(单张 ×1、主对 ×2、N 连对 ×2N)后计入闲家捡分。 +8. **末轮扣底**(6.3):所有手牌出完后,若最后一轮由闲家**用主牌**赢下,则庄家埋的 8 张埋牌底牌翻开,其中的分按闲家赢牌的牌型翻倍(单张 ×1、主对 ×2、N 连对 ×2N)后计入闲家捡分。 9. **小局结算**(第 7、8 节,两部分同时结算): - **算子**:闲家总捡分(含扣底)与庄家叫分比较 → 判定庄家的**过庄 / 小光 / 大光**,或闲家的**升级第几级** → 结合叫分档的基础子数,得到庄家与每个闲家"一对一"的结算子数 `X`(勾选爬坡则改用 7.3 的梯度与分段)。 - - **算奖**:以静态初始手牌(正常局:庄家埋牌后 28 张、闲家发牌后 28 张;**70 分投降局**:庄家用发牌+暗牌共 36 张、无主牌花色)计算奖数 `N` —— 常规算奖(8.1)**只计庄家**;勾选傍王(8.3)则庄闲每张王各算一奖。持有 `N` 奖的玩家从另外两人各多收 `X × N`(8.4)。 - - 以上两部分加总即各家本局盈亏;牌局结束需亮出底牌(第 11 节)。 + - **算奖**:以静态初始手牌(正常局:庄家埋牌后 28 张、闲家发牌后 28 张;**70 分投降局**:庄家用发牌+底牌共 36 张、无主牌花色)计算奖数 `N` —— 常规算奖(8.1)**只计庄家**;勾选傍王(8.3)则庄闲每张王各算一奖。持有 `N` 奖的玩家从另外两人各多收 `X × N`(8.4)。 + - 以上两部分加总即各家本局盈亏;牌局结束需亮出埋牌底牌(第 11 节)。 10. **进入下一局**(4.6):庄家本局赢则连庄(暂定庄家仍是他);庄家输(闲家捡分达标 / 庄家投降)则暂定庄家顺延到其下家。回到第 2 步开新的一小局。 @@ -730,7 +736,7 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 ### 12.3 阶段速览 ``` -建房(§10) → 发牌(§2) → 叫分坐庄(§4.2) → 看暗牌 → 选主(§3) → 埋牌(§4) +建房(§10) → 发牌(§2) → 叫分坐庄(§4.2) → 看底牌 → 选主(§3) → 埋牌(§4) → [70分:投降/打牌决策(§4.4)] → 出牌对局(§5,§6.1-6.2) → 末轮扣底(§6.3) → 小局结算=算子(§7)+算奖(§8) → 轮庄(§4.6) → 下一局 …… 打满局数 → 大局结算 ``` diff --git a/server/games/erqiwang/docs/protocol/packet_protocol.md b/server/games/erqiwang/docs/protocol/packet_protocol.md index c31fdad..fbc1e99 100644 --- a/server/games/erqiwang/docs/protocol/packet_protocol.md +++ b/server/games/erqiwang/docs/protocol/packet_protocol.md @@ -6,6 +6,24 @@ ## 0. 通用约定(所有包适用,下文各表不再逐一重复) +### 0.0 术语:底牌 vs 埋牌底牌(先读这一条) + +本项目于 2026-08-25 修订了这两个术语(`design.md` §1 已同步,本文亦已改用新称): + +| 术语 | 指哪 8 张 | 旧称 | +| --- | --- | --- | +| **底牌** | 发牌时**没有发给玩家**、扣在桌面的 8 张 | ~~暗牌~~ | +| **埋牌底牌** | 庄家**埋牌**时从手里扣下的 8 张 | ~~底牌~~ | + +⚠️ **两批牌目前共用同一个字段名 `bottomcards`**,只能靠「出现在哪个包」区分语义: + +| 字段位置 | 实际含义 | +| --- | --- | +| `shangzhuang.bottomcards`、`deskinfo.ChooseMain.bottomcards`、`deskinfo.BuryCards.bottomcards` | **底牌** | +| `maipai.bottomcards`、`deskinfo.PushCards.bottomcards`、结算 `bottom.cards` | **埋牌底牌** | + +字段名拆分(底牌保持 `bottomcards`、埋牌底牌改 `burycards`)的计划见 `docs_dev/二七王-UI资源与精灵清单.md` §7.5 的 **S-4**;**在拆分落地前,收发两侧都必须按上表判断语义**。 + ### 0.1 成败标志 `data.success` **每一个「服务器 → 客户端」的包,`data` 都必带 `success`**(布尔): @@ -137,9 +155,9 @@ | banker | 整数 | 庄家的位置序号 | | grade | 整数 | 庄家的叫分 | | 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)| -| bottomcards | 数组 | 8 张暗牌。**庄家恒有**;**闲家仅当 70 分坐庄时才有**(供 3 秒亮牌用),非 70 分时闲家没有该属性(暗牌只有庄家可见,design §4)| -| ancard3s | 整数 | 仅 70 分坐庄时出现且为 `1`:表示庄家把暗牌摸入手前,需将 `bottomcards` 这 8 张暗牌向所有玩家亮出 3 秒(design §4/§7.1);非 70 分无此属性 | -| cards | 数组 | 拿了暗牌后手上的牌(36 张,含暗牌),庄家才有此属性,闲家没有该属性 | +| bottomcards | 数组 | 8 张**底牌**(发牌时没发给玩家、扣在桌面的 8 张)。**庄家恒有**;**闲家仅当 70 分坐庄时才有**(供 3 秒亮牌用),非 70 分时闲家没有该属性(底牌只有庄家可见,design §4)| +| ancard3s | 整数 | 仅 70 分坐庄时出现且为 `1`:表示庄家把底牌摸入手前,需将 `bottomcards` 这 8 张**底牌**向所有玩家亮出 3 秒(design §4/§7.1);非 70 分无此属性 | +| cards | 数组 | 拿了底牌后手上的牌(36 张,含底牌),庄家才有此属性,闲家没有该属性 | | countdown | 整数 | 选主倒计时 | | touxiang | 整数 | 是否允许投降 0:不允许 1:允许(仅 70 分坐庄为 1)。投降与选主互斥、同为选主阶段(step2)的决策,见 touxiang 包与 design §4 | @@ -209,7 +227,7 @@ | 参数名 | 类型 | 说明 | | --- | --- | --- | | cards | 数组 | 埋牌后手上的牌,去掉了埋牌,庄家才有此属性,闲家没有该属性 | -| bottomcards | 数组 | 埋的牌,庄家才有此属性,闲家没有该属性 | +| bottomcards | 数组 | **埋牌底牌**(庄家埋下的 8 张),庄家才有此属性,闲家没有该属性。⚠️ 与 `shangzhuang.bottomcards`(底牌)**同名不同义**,见文首「术语」| | 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 张、但包含之后已打出的牌),全局固定不随出牌缩水,故重连包里的同名字段取值一致 | @@ -386,11 +404,13 @@ **bottom(抠底包,仅正常出牌结算存在;`cards` 恒有,其余仅闲家抠底时有)** +> 本分组的 `cards` 是**埋牌底牌**(庄家埋下的 8 张),不是发牌留桌的底牌。 + | 参数名 | 类型 | 说明 | | --- | --- | --- | -| cards | 数组 | 底牌,投降和解散无此属性 | +| cards | 数组 | **埋牌底牌**(庄家埋下的 8 张),投降和解散无此属性 | | multiple | 整数 | 闲家抠底倍数,闲家没抠底无此属性,投降和解散无此属性 | -| grade1 | 整数 | 底牌分数,闲家没抠底无此属性,投降和解散无此属性 | +| grade1 | 整数 | 埋牌底牌的分数,闲家没抠底无此属性,投降和解散无此属性 | | grade2 | 整数 | 闲家抠底得分,闲家没抠底无此属性,投降和解散无此属性 | **aset(单局结算包)** @@ -496,7 +516,7 @@ | call | 整数 | 叫分 | | 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)| | countdown | 整数 | 选主倒计时 | -| bottomcards | 数组 | 8 张暗牌,**只有庄家有此属性**(暗牌仅庄家可见;70 分的 3 秒亮牌是上庄时的一次性事件,重连不重放)| +| bottomcards | 数组 | 8 张**底牌**(发牌留桌的 8 张),**只有庄家有此属性**(底牌仅庄家可见;70 分的 3 秒亮牌是上庄时的一次性事件,重连不重放)| | touxiang | 整数 | 是否允许投降 0:不允许 1:允许(仅 70 分坐庄为 1)。投降与选主互斥、同一决策点,见 touxiang 包与 design §4 | > 选主阶段前端需在每个花色按钮上显示"该花色在庄家手中的对子数"(design §4/§11)——庄家的完整手牌由 `MyCards` 提供(庄家为 36 张),对子数由前端据此计算,服务端不额外下发。 @@ -510,7 +530,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 张暗牌,**只有庄家有此属性**(暗牌仅庄家可见;70 分的 3 秒亮牌是上庄时的一次性事件,重连不重放)| +| bottomcards | 数组 | 8 张**底牌**(发牌留桌的 8 张),**只有庄家有此属性**(底牌仅庄家可见;70 分的 3 秒亮牌是上庄时的一次性事件,重连不重放)| > 埋牌阶段无投降(投降是 step2 与选主互斥的选择,选主后即不可再投降)。 @@ -523,7 +543,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 | 数组 | 埋的牌,只有庄家有此属性 | +| bottomcards | 数组 | **埋牌底牌**(庄家埋下的 8 张),只有庄家有此属性。⚠️ 与 `ChooseMain`/`BuryCards.bottomcards`(底牌)**同名不同义** | | 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 末尾)|