diff --git a/docs_dev/uiref/算奖牌型显示.png b/docs_dev/uiref/冲关牌型显示.png similarity index 100% rename from docs_dev/uiref/算奖牌型显示.png rename to docs_dev/uiref/冲关牌型显示.png diff --git a/docs_dev/uiref/小局结算.png b/docs_dev/uiref/小局结算.png index da98c2a..523aff9 100644 Binary files a/docs_dev/uiref/小局结算.png and b/docs_dev/uiref/小局结算.png differ diff --git a/docs_dev/二七王-UI资源与精灵清单.md b/docs_dev/二七王-UI资源与精灵清单.md index 8a5e05a..02be0d9 100644 --- a/docs_dev/二七王-UI资源与精灵清单.md +++ b/docs_dev/二七王-UI资源与精灵清单.md @@ -52,6 +52,18 @@ > ✅ `design.md` 与 `packet_protocol.md` **已同步此变更**(S-5 完成),协议字段名也已拆分为 `bottomcards` / `burycards`(S-4 完成)。 +#### 算奖 = 冲关 + 傍王 + +| 术语 | 范围 | 界面 | 字段 | +| --- | --- | --- | --- | +| **冲关** | design §8.1,**只计庄家**(旧称「常规算奖」) | 小局结算「**冲关分**」、「**冲关牌型**」按钮 | `chongguan`、`cards` | +| **傍王** | design §8.3,可选规则,勾选后**庄闲都算**,每张王 1 奖 | 大局结算「傍王分」 | `wang`、`bangwang` | +| **算奖** | **上位概念** = 冲关 + 傍王 | —— | `naward`(总奖数 N)、`grade_aw`(算奖得分) | + +说「**冲关**」指庄家那一份,说「**算奖**」指两者合计。 + +> ⚠️ **小局结算的「冲关分」标签有一处不严谨**:它取的是 `grade_aw`,而 `grade_aw` 是按**合计后**的 `N`(冲关+傍王)算出来的。房间**没开傍王**时两者相等、标签准确;**开了傍王**时这个数其实含傍王的贡献,叫「冲关分」就偏窄了。根因与 S-6 同源——两个分量在算钱前就已合并、事后拆不开。**待 S-6 落地后此标签才能名副其实。** + #### 四类「公开信息」——名字像、含义差很远 | 术语 | 谁公开给谁 | 给的是什么 | 触发 | 界面位置 | 字段 | @@ -220,7 +232,7 @@ get_nextseat: function(seat){ return (seat + 1) % 3; } | 1700–1749 | 埋牌 / 出牌操作条 | ~8 | | 1750–1799 | 桌面浮层(气泡 / 飘字 / 报无主 / 甩错) | ~15 | | 1800–1819 | 小局结算面板 | ~20 | -| 1820–1829 | 算奖牌型叠加层(**精灵复制**:遮罩 1 + 容器 3 + 模板 1 + 奖数 3) | **8** | +| 1820–1829 | 冲关牌型叠加层(**精灵复制**:遮罩 1 + 容器 3 + 模板 1 + 奖数 3) | **8** | | 1900–1949 | 大局总结算 / 解散结算 | 待设计 | | 1950–1999 | 出牌历史面板 | 待设计 | | 2000–2049 | 明牌面板 | 待设计 | @@ -599,7 +611,7 @@ EQW_RoomOptions = { | 查牌模式 | 仅可查牌模式下发;不查牌时闲家收不到该字段 | | 谁能看 | 只有两个闲家收到(庄家自己的牌自己本来就看得见) | -**展示形式**:与**明牌**同一套版式(半透黑遮罩 + 一排牌,照 `算奖牌型显示.png`),只是这里只有一排(庄家的)。可与 §5.7b 的明牌面板复用同一套精灵与渲染,仅数据源不同。 +**展示形式**:与**明牌**同一套版式(半透黑遮罩 + 一排牌,照 `冲关牌型显示.png`),只是这里只有一排(庄家的)。可与 §5.7b 的明牌面板复用同一套精灵与渲染,仅数据源不同。 **数量前端自己数**——协议不再下发 `zhu`/`zhupair`/`wang`/`qi`/`er` 等统计,需要显示「x 张王」之类就从 `cards` 里算。 @@ -692,14 +704,14 @@ EQW_RoomOptions = { > ⚠️ 这比 design §9 更严格,且与服务端当前校验不一致,见 §7.5 **S-7**。design 原文是「一旦有玩家的主牌全部打空……界面上会出现一个『明牌』按钮」,读作**全体三人**都出现;服务端 `mingpai` 的受理条件也是 `have_baofu()`(任一玩家报无主)。按新规则则应改成「**请求者本人**无主」。 - 点击 → 发 `mingpai { seat }` → 收 `mingpai { seat, others: [{seat, zhucards}] }` → 弹出面板展示另两家全部未出主牌的**具体牌面**。 - **再点一次取消是纯前端开关**,不再请求服务端(协议 §13.6)。 -- **展示形式(D-6 已定)**:**照 `算奖牌型显示.png` 那一套**——半透黑遮罩 + 两家各一排牌(`CARD_FACE_L`、`fan` 重叠排列),点遮罩关闭。与算奖牌型叠加层是同一种版式,可复用同一套渲染逻辑,仅数据源与座位数不同(明牌是**另两家**,算奖是**三家**)。 +- **展示形式(D-6 已定)**:**照 `冲关牌型显示.png` 那一套**——半透黑遮罩 + 两家各一排牌(`CARD_FACE_L`、`fan` 重叠排列),点遮罩关闭。与冲关牌型叠加层是同一种版式,可复用同一套渲染逻辑,仅数据源与座位数不同(明牌是**另两家**,冲关牌型是**三家**)。 - 面板:图层 305,群组 243;牌**用精灵复制**(张数不定,同 §5.6a 的判据)。 **出牌历史**(design §9.1): - 仅可查牌模式;底栏 `出牌历史` / `上一轮` 两个按钮(§2.6)。 - 数据来自重连包 `pushlist`(按轮次 × 3 家),**出牌过程中前端需自行累积**(`chupai1/2/3` 逐包记录)。 -- **展示形式(D-7 已定)**:**不按轮次分组**。把每家出过的牌全部**摊平聚合到该玩家名下**,再**按手牌那套主牌序排序**(同 §7.2 T-5 的 `order_cards` 顺序),三家各显示一排——版式**照 `算奖牌型显示.png`**(遮罩 + 三家各一排牌)。 +- **展示形式(D-7 已定)**:**不按轮次分组**。把每家出过的牌全部**摊平聚合到该玩家名下**,再**按手牌那套主牌序排序**(同 §7.2 T-5 的 `order_cards` 顺序),三家各显示一排——版式**照 `冲关牌型显示.png`**(遮罩 + 三家各一排牌)。 > 前端自行摊平 + 排序即可,**不需要改服务端**:`pushlist` 已含全部轮次数据,且各轮内部已按本局主牌花色排好。 - `上一轮` 按钮则只取**最近一轮**的三家出牌(`pushlist` 末尾一项),版式同上。 - 面板:图层 304,群组 242;牌**用精灵复制**(张数不定)。 @@ -734,43 +746,43 @@ EQW_RoomOptions = { | --- | --- | --- | --- | | 大字 | 本局总分 | `grade` | `+20` 橙色(赢)/ `-10` 蓝色(输),底带光晕 | | 小字左 | **`牌局分 N`** | `grade_jf`(捡分子数得分) | 白标签 + 数值 | -| 小字右 | **`算奖分 N`** | `grade_aw`(算奖得分) | 白标签 + 数值 | +| 小字右 | **`冲关分 N`** | `grade_aw`(算奖得分) | 白标签 + 数值 | -> 两个标签的文案已由更新后的 `小局结算.png` 确定(原图两个都写「牌局分」是 mock 重复,现已修正为 `牌局分` / `算奖分`)。 +> 两个标签的文案已由更新后的 `小局结算.png` 确定(原图两个都写「牌局分」是 mock 重复,现已修正为 `牌局分` / `冲关分`)。 **两个按钮**: | 按钮 | 位置 | 作用 | | --- | --- | --- | -| `算奖牌型`(蓝色) | 中央偏左 | 打开算奖牌型叠加层(见下) | +| `冲关牌型`(蓝色) | 中央偏左 | 打开冲关牌型叠加层(见下) | | `下一局`(金黄) | 中央偏右 | 发 `zhunbei { seat }` 进入下一局(§1.12) | #### 「冲关」是什么(`chongguan` 字段的准确定义) -服务端 `class.arith.js:1277` `get_chongguan(mainflower, cards)`。**「冲关」就是 design §8.1「常规算奖」的服务端命名**——`chongguan` 的值即该玩家常规算奖的**奖数**,不是另一套独立规则。函数返回三项: +服务端 `class.arith.js:1277` `get_chongguan(mainflower, cards)`。`chongguan` 即 design §8.1 **冲关**的奖数(该规则旧称「常规算奖」,现统一叫冲关)。函数返回三项: | 返回字段 | 含义 | 去向 | | --- | --- | --- | -| `count` | 关数 = 常规算奖奖数 | `aset.seatlist[i].chongguan` | +| `count` | 关数 = 冲关奖数 | `aset.seatlist[i].chongguan` | | `wang` | 手牌中的王数 | `aset.seatlist[i].wang`(傍王按此计奖) | -| `cards` | **王牌 + 所有参与冲关的牌**,已按主牌序从大到小排好 | `aset.seatlist[i].cards` → **算奖牌型叠加层要显示的就是它** | +| `cards` | **王牌 + 所有参与冲关的牌**,已按主牌序从大到小排好 | `aset.seatlist[i].cards` → **冲关牌型叠加层要显示的就是它** | 计数规则(与 design §8.1 逐条对应): -1. **前置**:`cards.length < 28` 直接返回 0 —— 手牌不足 28 张不参与算奖。 +1. **前置**:`cards.length < 28` 直接返回 0 —— 手牌不足 28 张不参与冲关。 2. **三王 / 四王**:≥3 王 → `count = 1`;= 4 王 → `count = 3`。 3. **连对链续奖**:**必须先满足 ≥3 王**(整段逻辑在 `if (_wlist.length >= 3)` 内)。从小王编码 `9553` 起,沿主牌序往下逐对扫描,每遇到一个与上一节**位置相邻**的对子就 `count + 1`,链条为 `正7 → 副7 → 正2 → 副2 → 主A → 主K → …`,断则止。**没有三王就没有连对链奖**。 4. **六/七/八个 7**:`count += 张数 − 5`(6→1、7→2、8→3 奖)。 5. **六/七/八个 2**:同上。 -6. **固定主牌 ≥10 张不算奖**——它只触发 design §8.2 的「亮牌」,代码里有明确注释。§1.6 的亮牌与这里的算奖是两回事。 +6. **固定主牌 ≥10 张不产生冲关奖**——它只触发 design §8.2 的「亮牌」,代码里有明确注释。§1.6 的亮牌与这里的冲关是两回事。 > 前端**不重算冲关**,`chongguan` / `wang` / `naward` / `cards` 一律直接取服务端下发值(服务端权威,红线)。上面的规则只用于理解要显示什么。 -**算奖牌型叠加层** 【图:算奖牌型显示.png】: +**冲关牌型叠加层** 【图:冲关牌型显示.png】: -点 `算奖牌型` 后,在结算面板之上盖一层**半透黑遮罩**,三家各展示自己的 `aset.seatlist[i].cards`,资源用 `CARD_FACE_L`、重叠排列。`下一局` 按钮在遮罩层上**继续可见可点**,`算奖牌型` 按钮本身被遮住。 +点 `冲关牌型` 后,在结算面板之上盖一层**半透黑遮罩**,三家各展示自己的 `aset.seatlist[i].cards`,资源用 `CARD_FACE_L`、重叠排列。`下一局` 按钮在遮罩层上**继续可见可点**,`冲关牌型` 按钮本身被遮住。 -**关闭方式:整块全屏半透明黑遮罩本身就是关闭热区,点击遮罩即关闭。** 不另设关闭按钮。因此 `AWARD_MASK` 必须注册点击事件,且 `下一局` 的层级要高于它、点它不被遮罩吃掉。 +**关闭方式:整块全屏半透明黑遮罩本身就是关闭热区,点击遮罩即关闭。** 不另设关闭按钮。因此 `CG_MASK` 必须注册点击事件,且 `下一局` 的层级要高于它、点它不被遮罩吃掉。 - 三家牌位:左上家、右上家在各自头像内侧;自己在中央偏下。 - 布局配置见 §6.7。 @@ -786,8 +798,8 @@ EQW_RoomOptions = { | `grade` | 闲家最终捡分(含扣底)→ 顶部 `抓分` 列 | | `upgrade` | **判定倍率(带符号)**:`3` 大光 / `2` 小光 / `1` 过庄 / `-N` 升 N 级(倒庄)/ `-99` 投降 / `0` 解散 → 需要一组判定文字或图标:`大光` `小光` `过庄` `升N级` `投降`【待设计 D-8】 | | `bangwang` / `climb` | 本局规则开关,用于结算面板上标注 | -| **`cards`** | **算奖牌型叠加层**的牌(见上) | -| `chongguan` / `wang` / `naward` | 常规算奖奖数 / 王数 / **总奖数**。叠加层**需要并列显示奖数**——以 `naward`(该家总奖数 N,8.4 节的支付基数)为主;`chongguan` / `wang` 作为明细可选展示 | +| **`cards`** | **冲关牌型叠加层**的牌(见上) | +| `chongguan` / `wang` / `naward` | 冲关奖数 / 王数 / **总奖数**。叠加层**需要并列显示奖数**——以 `naward`(该家总奖数 N,8.4 节的支付基数)为主;`chongguan` / `wang` 作为明细可选展示 | **投降结算**:只有 `aset`,无 `chupai`、无 `bottom` → 结算面板必须容忍**底牌区缺失**,不能因为读不到 `bottom.cards` 就崩或显示空框。 @@ -801,7 +813,7 @@ EQW_RoomOptions = { | 区 | 内容 | | --- | --- | | 标题栏(青绿底) | `二七王-3人 房号{roomcode} 共{asetcount}局 {开战时间}` + 右上角关闭钮 | -| 玩家栏 ×3(按名次排序,行间分隔线) | 名次徽章 → 头像 → 昵称 / `ID:{playerid}`(两行)→ `基础分{n}` / `总得分{n}`(两行)→ `算奖分{n}` → `傍王分{n}` → 右侧大字总分 | +| 玩家栏 ×3(按名次排序,行间分隔线) | 名次徽章 → 头像 → 昵称 / `ID:{playerid}`(两行)→ `基础分{n}` / `总得分{n}`(两行)→ `冲关分{n}` → `傍王分{n}` → 右侧大字总分 | | 规则栏(浅绿底) | `规则:可查牌、傍王、爬坡算子` —— 据 `roomtype` 位串拼出已启用项 | | 面板外底部 | `再来一局`(黄) `分享好友`(蓝) `复制战绩`(蓝) `退出房间`(红) | @@ -809,8 +821,8 @@ EQW_RoomOptions = { - **总分大字**:正分橙色带 `+`、负分蓝色带 `-`,复用 §3.6 的 `NUM_RESULT_WIN` / `NUM_RESULT_LOSE`。 > ⚠️ **四项分数当前协议给不出,需服务端补**,见 §7.5 **S-6**: -> `account` 只有「累积得分 + 每局得分数组」,没有「基础分 / 算奖分 / **傍王分**」这三项分解。 -> 尤其 **傍王分无法从现有字段拆出**——`naward = 常规算奖 + 傍王王数` 已经把两者合并,`grade_aw` 是按合并后的 `N` 算出来的。 +> `account` 只有「累积得分 + 每局得分数组」,没有「基础分 / 冲关分 / **傍王分**」这三项分解。 +> 尤其 **傍王分无法从现有字段拆出**——`naward = 冲关 + 傍王王数` 已经把两者合并,`grade_aw` 是按合并后的 `N` 算出来的。 ### 1.10 解散结算 `free_room` 【待设计】 @@ -1051,7 +1063,7 @@ y≈648–720 深色条。左侧头像/昵称/分数由平台渲染(§0.2) | ~~539~~ | ~~`BTN_READY`~~ | **不需要**:准备标识用平台的(§0.2) | —— | —— | | 540 | `BTN_TISHI` | 底栏 `踩` / `有分` / `没分` 按钮底(三者共用) | 1 | 深色圆角,同 `BTN_BOTTOM_FUNC` 风格但更窄 | 52 × 30 | | 541 | `BTN_NEXT_ASET` | 结算 `下一局` | 1 | 金黄渐变 | 180 × 65 | -| 542 | `BTN_AWARD_CARDS` | 结算 `算奖牌型` | 1 | 蓝色渐变 | 183 × 63 | +| 542 | `BTN_CG_CARDS` | 结算 `冲关牌型` | 1 | 蓝色渐变 | 183 × 63 | | 543 | `BTN_ACCOUNT_AGAIN` | 大局结算 `再来一局` | 1 | 黄色渐变 | 190 × 60 | | 544 | `BTN_ACCOUNT_SHARE` | 大局结算 `分享好友` | 1 | 蓝色渐变 | 190 × 60 | | 545 | `BTN_ACCOUNT_COPY` | 大局结算 `复制战绩` | 1 | 蓝色渐变 | 190 × 60 | @@ -1084,7 +1096,7 @@ y≈648–720 深色条。左侧头像/昵称/分数由平台渲染(§0.2) | 606 | `PANEL_BOTTOM_CARDS` | 结算底牌区面板底 | 1 | 420 × 148 | | 607 | `GLOW_RESULT` | 结算分数光晕背景 | 2 | 帧1=赢(橙) 帧2=输(蓝) | 225 × 100 | | 608 | `BAR_FOOTER` | 底栏深色条 | 1 | 1280 × 72 | -| 609 | `MASK_DIM` | 半透黑遮罩(算奖牌型 / 出牌历史 / 明牌 共用) | 1 | 1280 × 720(纯色可拉伸,出 1 张小图即可) | +| 609 | `MASK_DIM` | 半透黑遮罩(冲关牌型 / 出牌历史 / 明牌 共用) | 1 | 1280 × 720(纯色可拉伸,出 1 张小图即可) | | 610 | `PANEL_ACCOUNT` | 大局总结算面板底(圆角浅灰绿) | 1 | 1100 × 540 | | 611 | `BAR_ACCOUNT_TITLE` | 大局结算标题栏(青绿底,含圆角上沿) | 1 | 1100 × 56 | | 612 | `BAR_ACCOUNT_RULE` | 大局结算底部规则栏(浅绿底,含圆角下沿) | 1 | 1100 × 62 | @@ -1275,14 +1287,14 @@ design 与协议均**未定义任何音效**。以下是按牌类游戏常规推 | 1808–1810 | `RESULT_JF_LEFT/RIGHT/SELF` | 文字 ×3 | 捡分子数得分 `grade_jf`【T-13】 | —— | | 1811–1813 | `RESULT_AW_LEFT/RIGHT/SELF` | 文字 ×3 | 算奖得分 `grade_aw`【T-13】 | —— | | 1814 | `RESULT_JUDGE_TEXT` | 文字 | 判定结果(大光/小光/过庄/升N级/投降,据 `aset.upgrade`) | —— | -| 1815 | `RESULT_BTN_AWARD` | 图片 | `算奖牌型` 按钮 | `BTN_AWARD_CARDS` | -| 1816 | `RESULT_BTN_AWARD_TEXT` | 文字 | 按钮文案 | —— | +| 1815 | `RESULT_BTN_CG` | 图片 | `冲关牌型` 按钮 | `BTN_CG_CARDS` | +| 1816 | `RESULT_BTN_CG_TEXT` | 文字 | 按钮文案 | —— | | 1817 | `RESULT_BTN_NEXT` | 图片 | `下一局` 按钮 | `BTN_NEXT_ASET` | | 1818 | `RESULT_BTN_NEXT_TEXT` | 文字 | 按钮文案 | —— | > 底牌 8 张精灵复用 §5.3 群组 215(1258–1265),不在此重复。 -### 5.6a 算奖牌型叠加层(Layer 302,群组 **244**,**精灵复制**) +### 5.6a 冲关牌型叠加层(Layer 302,群组 **244**,**精灵复制**) **本层的牌用 `SpriteCopyUtils` 运行时复制,不预置固定张数。** `aset.seatlist[i].cards` 的长度不定(四王 + 长连对链 + 八个 7 + 八个 2 可达 20 余张),预置既可能不够、又在多数局里白占 ID。 @@ -1290,27 +1302,27 @@ design 与协议均**未定义任何音效**。以下是按牌类游戏常规推 | 精灵 ID | 键名 | 类型 | 用途 | 资源 / 帧 | | --- | --- | --- | --- | --- | -| 1820 | `AWARD_MASK` | 图片 | 半透黑遮罩(拉伸满屏,兼作点击关闭热区) | `MASK_DIM` | -| 1821 | `AWARD_BOX_LEFT` | **容器** | 左上家算奖牌容器(复制的父精灵) | —— | -| 1822 | `AWARD_BOX_RIGHT` | **容器** | 右上家算奖牌容器 | —— | -| 1823 | `AWARD_BOX_SELF` | **容器** | 自己算奖牌容器 | —— | -| 1824 | `AWARD_CARD_TPL` | **模板** | 算奖牌模板(编辑器里放好、默认隐藏,只作样式来源) | `CARD_FACE_L` | -| 1825–1827 | `AWARD_COUNT_LEFT/RIGHT/SELF` | 文字 ×3 | **奖数**,与该家的算奖牌**并列显示**(取 `aset.seatlist[i].naward`;是否另列 `chongguan`/`wang` 明细见下) | —— | +| 1820 | `CG_MASK` | 图片 | 半透黑遮罩(拉伸满屏,兼作点击关闭热区) | `MASK_DIM` | +| 1821 | `CG_BOX_LEFT` | **容器** | 左上家冲关牌容器(复制的父精灵) | —— | +| 1822 | `CG_BOX_RIGHT` | **容器** | 右上家冲关牌容器 | —— | +| 1823 | `CG_BOX_SELF` | **容器** | 自己冲关牌容器 | —— | +| 1824 | `CG_CARD_TPL` | **模板** | 冲关牌模板(编辑器里放好、默认隐藏,只作样式来源) | `CARD_FACE_L` | +| 1825–1827 | `CG_COUNT_LEFT/RIGHT/SELF` | 文字 ×3 | **奖数**,与该家的冲关牌**并列显示**(取 `aset.seatlist[i].naward`;是否另列 `chongguan`/`wang` 明细见下) | —— | **生成方式**: ```js // 每个座位一个容器,tag 用牌在 cards 里的下标(父精灵内唯一即可) -var pos = LayoutSolver.solve(EQW_Layout.AWARD_CARDS, seatKey, cards.length); // fan 布局,见 §6.7 +var pos = LayoutSolver.solve(EQW_Layout.CG_CARDS, seatKey, cards.length); // fan 布局,见 §6.7 for (var i = 0; i < cards.length; i++) { - var sid = SpriteCopyUtils.create(boxId, sprites.AWARD_CARD_TPL, pos[i].x, pos[i].y, i); + var sid = SpriteCopyUtils.create(boxId, sprites.CG_CARD_TPL, pos[i].x, pos[i].y, i); SpriteManager.setFrame(sid, cardIdToFrame(cards[i])); // §0.4 } ``` **清理是硬要求**:关闭叠加层 / 组件 `onDestroy` 时必须 `SpriteCopyUtils.removeRange(boxId, 0, cards.length)`,否则复制精灵残留(client 02 §6)。 -> `RESULT_BTN_NEXT`(1817/1818)在遮罩之上仍需可见可点 —— 其图层内层级须高于 `AWARD_MASK`。 +> `RESULT_BTN_NEXT`(1817/1818)在遮罩之上仍需可见可点 —— 其图层内层级须高于 `CG_MASK`。 #### 预置 vs 精灵复制的选用判据 @@ -1321,11 +1333,11 @@ for (var i = 0; i < cards.length; i++) { | 逐个控制 | 需要独立 z 序 / 动画 / 命名引用 | 只需批量摆位 + 设帧 | | 清理成本 | 无 | 必须显式 `remove`,忘了就残留 | -据此,本清单的选用——**全项目只有「算奖牌型」一处用复制,其余一律预置**: +据此,本清单的选用——**全项目只有「冲关牌型」一处用复制,其余一律预置**: | 区域 | 方式 | 理由 | | --- | --- | --- | -| **算奖牌型** | **复制** | 张数不定、无小上限,多数局用不满 | +| **冲关牌型** | **复制** | 张数不定、无小上限,多数局用不满 | | 自己手牌(36) | 预置 | 上限确定;需逐张选中上浮、独立动画与点击 | | 已出牌区(28 × 3) | 预置 | 需叠压 z 序与出牌动画,逐张独立控制 | | 底牌(8)/ 埋牌底牌(8) | 预置 | 固定 8 张 | @@ -1360,7 +1372,7 @@ for (var i = 0; i < cards.length; i++) { ### 5.7b Layer 304 / 305 · 出牌历史与明牌(群组 242 / 243,**牌用精灵复制**) -两者版式相同(遮罩 + 每家一排牌,照 `算奖牌型显示.png`),差别只在数据源与家数,**共用同一套渲染**: +两者版式相同(遮罩 + 每家一排牌,照 `冲关牌型显示.png`),差别只在数据源与家数,**共用同一套渲染**: | 精灵 ID | 键名 | 类型 | 用途 | 资源 / 帧 | | --- | --- | --- | --- | --- | @@ -1468,7 +1480,7 @@ for (var i = 0; i < cards.length; i++) { #### `fan` — 自适应压缩排 -张数可变、**总宽受限**、需要动态压缩间距的牌排(手牌、出牌区、算奖牌)。 +张数可变、**总宽受限**、需要动态压缩间距的牌排(手牌、出牌区、冲关牌)。 ```js { kind: 'fan', direction: 'horizontal', @@ -1552,7 +1564,7 @@ PLAY_AREA: { ```js CARD_SIZE: { - L: { w: 110, h: 190, res: 'CARD_FACE_L' }, // 手牌、底牌、算奖牌 + L: { w: 110, h: 190, res: 'CARD_FACE_L' }, // 手牌、底牌、冲关牌 M: { w: 90, h: 155, res: 'CARD_FACE_M' }, // 已出牌区 S: { w: 50, h: 70, res: 'CARD_FACE_S' } // 结算埋牌底牌 } @@ -1617,7 +1629,7 @@ CARD_SIZE: { | **已出牌区** | `fan` | 见 §6.2 的 `bySeat` 示例(三家共用 base,LEFT 镜像) | | 已出牌 · 牌型标签 | `attach` | `target:该区首张牌, corner:bottomLeft, offsetX:0, offsetY:-24` | | 已出牌 · 牌角 `庄`/`大` 标 | `attach` | `target:对应牌, corner:topRight, offsetX:-28, offsetY:0` | -| **算奖牌(叠加层)** | `fan` | `size:L spacingMax:-40 spacingMin:-88 maxWidth:420`;`bySeat{ LEFT:{anchorX:260,anchorY:120}, RIGHT:{anchorX:1035,anchorY:120}, SELF:{anchorX:640,anchorY:400} }`。**精灵复制**(§5.6a):求解结果直接作为 `SpriteCopyUtils.create` 的 `x/y`(相对容器)。`spacingMin` 放宽到 `-88`(即最窄只露 22px)以容纳 20+ 张的极端情况 | +| **冲关牌(叠加层)** | `fan` | `size:L spacingMax:-40 spacingMin:-88 maxWidth:420`;`bySeat{ LEFT:{anchorX:260,anchorY:120}, RIGHT:{anchorX:1035,anchorY:120}, SELF:{anchorX:640,anchorY:400} }`。**精灵复制**(§5.6a):求解结果直接作为 `SpriteCopyUtils.create` 的 `x/y`(相对容器)。`spacingMin` 放宽到 `-88`(即最窄只露 22px)以容纳 20+ 张的极端情况 | ### 6.8 阶段操作区配置 @@ -1650,10 +1662,10 @@ CARD_SIZE: { | **三家分数光晕** | `point` | `bySeat{ LEFT:{x:175,y:150}, RIGHT:{x:865,y:150}, SELF:{x:490,y:340} }`,`w:225 h:100` | | 三家总分大字 | `attach` | `target:对应光晕, hAlign:center, vAlign:middle`,`textStyle{fontSize:56, align:center}` | | 三家 `牌局分` | `attach` | `target:对应光晕, hAlign:left, vAlign:bottom, offsetX:-15, offsetY:24` | -| 三家 `算奖分` | `attach` | `target:对应光晕, hAlign:right, vAlign:bottom, offsetX:15, offsetY:24` | -| `算奖牌型` 按钮 | `point` | `x:535 y:515 w:183 h:63` | +| 三家 `冲关分` | `attach` | `target:对应光晕, hAlign:right, vAlign:bottom, offsetX:15, offsetY:24` | +| `冲关牌型` 按钮 | `point` | `x:535 y:515 w:183 h:63` | | `下一局` 按钮 | `point` | `x:835 y:518 w:180 h:65` | -| 算奖遮罩 | `point` | `x:0 y:0 w:1280 h:720`,`opacity:0.72`(透明度也是配置项) | +| 冲关遮罩 | `point` | `x:0 y:0 w:1280 h:720`,`opacity:0.72`(透明度也是配置项) | ### 6.9b 建房规则选项配置(§1.1) @@ -1732,7 +1744,7 @@ codes/config/ | ~~D-3~~ | 甩错提示 | ✅ 定稿:桌面中央深色半透条 **`强甩失败`**(`强甩失败提示.png`),**不做收回动画**,直接落下那张被强制打出的最小主牌 | | ~~D-4~~ | 报无主 | ✅ 定稿:**不做全场提示**。只让他家 `主N`/`对N` 角标出现;自己的主牌统计条本来就常显(§2.5) | | ~~D-5~~ | 踩 / 没分 / 有分 | ✅ 定稿:底栏三按钮(占庄标区)+ 3×2 六帧气泡 | -| ~~D-6~~ | 明牌面板 | ✅ 定稿:版式照 `算奖牌型显示.png`(遮罩 + 每家一排牌)。**按钮显示条件收紧为「可查牌 + 自己是无主玩家」** → 见 **S-7** | +| ~~D-6~~ | 明牌面板 | ✅ 定稿:版式照 `冲关牌型显示.png`(遮罩 + 每家一排牌)。**按钮显示条件收紧为「可查牌 + 自己是无主玩家」** → 见 **S-7** | | ~~D-7~~ | 出牌历史面板 | ✅ 定稿:版式同上。**不按轮次**,按玩家聚合、用主牌序排序。前端摊平 `pushlist` 即可,无需改服务端 | | ~~D-9~~ | 大局总结算 | ✅ 定稿:`大局结算.png`,玩家栏用精灵复制(§5.7a)。**四项分数协议缺** → 见 **S-6** | | ~~D-10~~ | 解散结算 | ✅ 复用 D-9 面板;投票界面平台全包(Layer 420) | @@ -1765,17 +1777,17 @@ codes/config/ | ~~T-10~~ | 出牌阶段**必有** `提示` 按钮;服务端已下发 `mustcard` 供自动选中(S-2 ✅) | | ~~T-11~~ | 牌型标签**只做「毙」一种**;数据层保留 毙/垫/混合出牌 三种标识备扩展,当前不出图 | | ~~T-12~~ | `底牌 20x0` 的 `x` 后面是**扣底倍数**(`bottom.multiple`);未扣底显示 0(§1.8) | -| ~~T-13~~ | 结算两个小字 = `牌局分`(`grade_jf`) / `算奖分`(`grade_aw`) | -| ~~T-14~~ | 算奖明细走独立的**算奖牌型叠加层** | +| ~~T-13~~ | 结算两个小字 = `牌局分`(`grade_jf`) / `冲关分`(`grade_aw`) | +| ~~T-14~~ | 冲关明细走独立的**冲关牌型叠加层** | | ~~T-15~~ | 准备标识**用平台的** | | ~~T-16~~ | `抓分` 角标 = **当前捡分对应判定倍率的实时预览**;服务端已下发 `curmultiple`(S-1 ✅) | | ~~T-17~~ | 倒计时归零**停在 `0`** 不隐藏 | | ~~T-18~~ | 底栏 5 按钮:`上一轮`/`出牌历史`/`明牌`/`扣底`(看**埋牌底牌**)/`底牌`(看**底牌**);术语已统一见 §2.6;可见性按手册 → **S-3** | | ~~T-19~~ | 数字**一律用图片多帧精灵**(参考图数字带描边渐变,文字精灵做不出),资源 631–634 全部要出 | | ~~T-21~~ | 手牌单排 `spacingMin:-78`、双排 `-65`(§6.7) | -| ~~T-22~~ | 算奖叠加层:**全屏半透明遮罩本身即关闭热区,点击遮罩关闭**,不另设关闭钮 | +| ~~T-22~~ | 冲关牌型叠加层:**全屏半透明遮罩本身即关闭热区,点击遮罩关闭**,不另设关闭钮 | | ~~T-23~~ | 叠加层**需要并列显示奖数**(以 `naward` 为主) | -| ~~T-24~~ | 算奖牌用**精灵复制**,张数不设上限 | +| ~~T-24~~ | 冲关牌用**精灵复制**,张数不设上限 | | ~~T-25~~ | `line` 支持可选 `items` 逐项不等宽 | | ~~T-26~~ | 自己发的提示**需要本地回显**(受控例外,理由见 §1.7) | | ~~T-27~~ | 埋牌双排 `floor(n/2)` / `ceil(n/2)` | @@ -1815,7 +1827,7 @@ codes/config/ | 6 | 投降结算(无 `bottom`)与解散结算(无 `deskfree` 的情形)都不崩、不显示空框 | §1.8 / §1.10 | | 7 | 解散包从 `data.deskfree.data.aset` 取值,不是 `data.aset` | §1.10 | | 8 | 倒计时归零不做任何界面推进 | 协议 §0.3 | -| 9 | 算奖牌型叠加层关闭时 `SpriteCopyUtils.removeRange` 已清理 | §5.6a | +| 9 | 冲关牌型叠加层关闭时 `SpriteCopyUtils.removeRange` 已清理 | §5.6a | | 10 | `EQW_Layout` 与 `Game_Modify.PLAYER_INFO_LAYOUT` 的头像框坐标一致 | §6.11 | | 11 | 丢弃 `this.data`、仅凭最近一次服务端快照重画,界面完全一致 | 前端 05 §6.2 | | 12 | 所有布局参数都在配置文件里,业务代码无裸值 | §6 | @@ -1936,9 +1948,9 @@ data.bottom.cards // 结算包 | `docs/compliance/*.md`(3 份,24 处) | ⬜ **有意不改**——这三份是历次核对的**历史记录**,反映当时的 design 表述;下轮核对按新 design 重做即可,不追溯修改 | | `test/*.js` 其余注释(约 14 处) | ⬜ 仅注释、不影响行为,后续顺手清理 | -#### S-6 · 大局结算缺「基础分 / 算奖分 / 傍王分」三项分解(新增,⚠️ 阻塞 D-9) +#### S-6 · 大局结算缺「基础分 / 冲关分 / 傍王分」三项分解(新增,⚠️ 阻塞 D-9) -**需求**:大局结算面板每行要显示 `基础分{n}` / `总得分{n}` / `算奖分{n}` / **`傍王分{n}`** 四项(见 `大局结算.png`)。 +**需求**:大局结算面板每行要显示 `基础分{n}` / `总得分{n}` / `冲关分{n}` / **`傍王分{n}`** 四项(见 `大局结算.png`)。 **现状**:协议 `account` 分组只有 @@ -1949,14 +1961,14 @@ data.bottom.cards // 结算包 拿不出上面四项中的任何一项分解。小局包 `aset.seatlist[i]` 虽有 `grade_jf`(捡分子数得分)与 `grade_aw`(算奖得分),但: 1. **只有小局值,没有大局累计**——大局要的是全部局数的累加; -2. **傍王分拆不出来**。这是最麻烦的一条:`naward = (庄家?常规算奖:0) + (傍王?王数:0)`,两个来源在**求和之后**才拿去算钱(`grade_aw = X×(2Ni−Nj−Nk)`)。等于说常规算奖与傍王的贡献在算钱前就已经混在一个 `N` 里,**事后无法从 `grade_aw` 反推各自占多少**。 +2. **傍王分拆不出来**。这是最麻烦的一条:`naward = (庄家?冲关:0) + (傍王?王数:0)`,两个来源在**求和之后**才拿去算钱(`grade_aw = X×(2Ni−Nj−Nk)`)。等于说冲关与傍王的贡献在算钱前就已经混在一个 `N` 里,**事后无法从 `grade_aw` 反推各自占多少**。 -**建议实现**:在 `class.paiju.js` 算 `grade_aw` 的地方,把 `N` 拆成 `N_chongguan` 与 `N_bangwang` **分别代入同一公式**各算一次,得到两个分量后再相加(相加结果必须等于现在的 `grade_aw`,可作为回归断言)。然后在 `account` 里逐项累计下发,例如: +**建议实现**:在 `class.paiju.js` 算 `grade_aw` 的地方,把 `N` 拆成 `N_chongguan`(冲关)与 `N_bangwang`(傍王)**分别代入同一公式**各算一次,得到两个分量后再相加(相加结果必须等于现在的 `grade_aw`,可作为回归断言)。然后在 `account` 里逐项累计下发,例如: | 字段 | 类型 | 说明 | | --- | --- | --- | | `grade_base_total` | 整数 | 基础分(捡分子数得分 `grade_jf`)的大局累计 | -| `grade_aw_total` | 整数 | 常规算奖分的大局累计(**不含**傍王) | +| `grade_cg_total` | 整数 | **冲关分**的大局累计(**不含**傍王) | | `grade_bw_total` | 整数 | 傍王分的大局累计 | | `score` | 整数 | 总得分(已有) | @@ -1995,5 +2007,5 @@ data.bottom.cards // 结算包 | `docs/client/development-guide/` | **前端规范权威源**。ID 范围、组件范式、红线均以其为准 | | `docs_dev/uiref/*.png` | 参考图,16 张(牌桌态 + 叫分按钮面板 + 大局结算 + 强甩失败 + 等待庄家选主 + 1 张建房**样式范式**,末者内容属他游戏、不可照抄) | | `client/js/gameabc-framework/ui/AlignmentUtils.js` | **布局求解的框架能力**。§6 的配置参数名与其入参一一对应,配置可原样喂入 | -| `client/js/gameabc-framework/ui/SpriteCopyUtils.js` | 精灵复制。用于算奖牌型、大局结算玩家栏、出牌历史 / 明牌(§5.6a 判据表) | +| `client/js/gameabc-framework/ui/SpriteCopyUtils.js` | 精灵复制。用于冲关牌型、大局结算玩家栏、出牌历史 / 明牌(§5.6a 判据表) | | `client/js/gameabc-framework/templates/*.template.js` | 常量文件写法蓝本。本清单落地为常量文件时按其格式 | diff --git a/server/games/erqiwang/docs/design/design.md b/server/games/erqiwang/docs/design/design.md index a7a1be4..01e7a49 100644 --- a/server/games/erqiwang/docs/design/design.md +++ b/server/games/erqiwang/docs/design/design.md @@ -23,7 +23,7 @@ - [7.2 常规算子的判定表](#72-捡分-vs-叫分庄家的过庄-小光-大光闲家的升级常规算子) - [7.3 爬坡](#73-爬坡叫分-→-基础子数与保小光分段可选规则开房时勾选爬坡生效) 8. [算奖规则](#8-算奖规则) - - [8.1 常规算奖](#81-常规算奖) + - [8.1 冲关](#81-冲关) - [8.2 亮牌规则](#82-亮牌规则) - [8.3 傍王(可选规则)](#83-傍王可选规则) - [8.4 算奖如何影响最终结算](#84-算奖如何影响最终结算) @@ -59,8 +59,9 @@ | 垫牌 | 跟牌时手中没有本轮花色(缺门)、且不用主牌毙牌,随意出一张其他副牌,不参与、不争夺本轮的出牌权(见第 5.1 节) | | 混合出牌 | 首家出副牌,你手中有该花色副牌但张数不够凑齐首家总张数,又没有(或不用)别的副牌补差额,只能用主牌补足缺口——打出的是"该花色副牌 + 主牌"的混合牌。这既不是垫牌(不是缺门、不是纯副牌),也不是毙牌(不是纯主牌牌型、压不过首家),服务端判定其牌面为 0,**与垫牌等效:不参与、不争夺本轮出牌权**(见第 5.1 / 5.2 节) | | 子 | 结算时用于计算输赢筹码的单位,与"倍数"是两个独立概念(见第 7 节) | -| 常规算奖 | 局末对固定组合(三王/四王、六 2/七 2/八 2、六 7/七 7/八 7、连续对子链等)的额外奖励结算,只计入庄家的手牌结构(见第 8.1 节) | -| 傍王 | 可选房间规则:勾选后每张王额外算一奖,庄家、闲家都要算;这是在 8.1 常规算奖之外**额外叠加**的奖励,与常规算奖互不冲突(见第 8.3 节) | +| 冲关 | 局末对固定组合(三王/四王、六 2/七 2/八 2、六 7/七 7/八 7、连续对子链等)的额外奖励结算,**只计庄家**(见第 8.1 节)。旧称"常规算奖",现统一叫**冲关**;服务端字段名 `chongguan` 与此同源 | +| 算奖 | **上位概念** = 冲关(8.1,只计庄家)+ 傍王(8.3,可选、庄闲都算)。两个分量求和后才是某玩家的总奖数 `N`,据此结算(见第 8.4 节)。**说"冲关"指的是庄家那一份,说"算奖"指的是合计** | +| 傍王 | 可选房间规则:勾选后每张王额外算一奖,庄家、闲家都要算;这是在 8.1 冲关之外**额外叠加**的奖励,与冲关互不冲突(见第 8.3 节) | | 爬坡 | 可选房间规则:改变叫分对应的基础子数与保小光分数线,未勾选时按"常规算子"结算(见第 7 节) | > **术语变更记录(2026-08-25)**:原「**暗牌**」(发牌留桌的 8 张)改称「**底牌**」;原「**底牌**」(庄家埋下的 8 张)改称「**埋牌底牌**」。 @@ -322,7 +323,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 节的完整举例。 +4. **算奖 → 结算倍率**:第 8 节算出的"奖数"(8.1 冲关 + 8.3 傍王,各玩家分别求和)**是"持有奖数的这个人"从其余两名玩家那里各自多收一笔钱的独立结算线,作用对象是这个人本身,不是整场结算的统一系数**——某玩家 P 这一局总共有 `N_P` 奖,则**另外两名玩家(不分庄闲)都要各自额外付给 P:`X × N_P` 子**。三名玩家可能同时都持有各自的奖数,会产生最多 3 条互相独立的额外支付线,与第 1~3 层的基础输赢结算加总,才是每个人这一局的最终盈亏。算奖的计算过程本身不受叫分、过庄 / 小光 / 大光、升级影响(只看手牌结构),详见 8.3 节的完整举例。 > **例外**:70 分坐庄选择投降时不走第 1~3 层模型——直接固定基础子数 1 个、庄家输掉,不比较捡分、不判定过庄 / 小光 / 大光,见 7.1 末尾说明;但第 4 层算奖仍然照常叠加(投降是选主阶段的选择、未选主也未埋牌,按庄家"发牌 + 底牌"共 36 张、无主牌花色计算,见 8.4 节)。 @@ -583,15 +584,19 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 ## 8. 算奖规则 -算奖在**每个小局结算时**计算(与第 7 节的子数结算属于同一次小局结算,不是等大局所有局数打完才统一算,也不是在出牌过程中途算)。8.1 常规算奖只计入庄家;8.3 傍王是额外叠加的独立奖励,庄家、闲家都要算——两者的计入范围不同,注意区分。 +算奖在**每个小局结算时**计算(与第 7 节的子数结算属于同一次小局结算,不是等大局所有局数打完才统一算,也不是在出牌过程中途算)。8.1 冲关只计入庄家;8.3 傍王是额外叠加的独立奖励,庄家、闲家都要算——两者的计入范围不同,注意区分。 -**8.1 常规算奖只认庄家的身份,不看闲家的手牌是否达标**:即使某位闲家的手牌结构凑巧也满足 8.1 表里的条件(比如手里也有 3 张王),这份常规算奖也**不会**计入这位闲家——常规算奖从规则上就只针对庄家一人。闲家想要获得算奖,只能靠 8.3 傍王(且必须房间勾选了这条可选规则)。 +**8.1 冲关只认庄家的身份,不看闲家的手牌是否达标**:即使某位闲家的手牌结构凑巧也满足 8.1 表里的条件(比如手里也有 3 张王),这份冲关也**不会**计入这位闲家——冲关从规则上就只针对庄家一人。闲家想要获得算奖,只能靠 8.3 傍王(且必须房间勾选了这条可选规则)。 **算奖依据的手牌快照时间点**:不管是 8.1(只看庄家)还是 8.3 傍王(庄闲都算),都按**静态初始手牌**计算——庄家是埋牌完成后的那一刻手牌(28 张),闲家是发牌完成后的那 28 张手牌;这个快照全程固定,不随之后的出牌、被吃、被打出而改变。**例外**:70 分投降局庄家未选主也未埋牌,其快照为"发牌 + 底牌"共 36 张(无主牌花色),见 8.4 节。 **算奖(8.1 / 8.3)与亮牌(8.2)是两个互不干涉的独立概念**:算奖是结算阶段"该给多少额外结算分"的规则;亮牌只是出牌开始前"要不要向对手公开一部分手牌"的展示规则。两者各自有自己的触发条件,只是恰好都以庄家埋牌后的手牌结构为依据,因此部分门槛数值相同——但达成亮牌的条件不代表一定触发算奖,反之亦然,具体对照见 8.2 末尾的说明。 -### 8.1 常规算奖 +### 8.1 冲关 + +> **旧称「常规算奖」**,现统一叫**冲关**(与服务端字段 `chongguan`、界面「冲关分」「冲关牌型」同口径)。 +> 它只是「算奖」的**其中一个分量**——另一个是 8.3 傍王;两者求和才是某玩家的总奖数 `N`(见 8.4)。 + | 组合 | 奖数 | | --- | --- | @@ -630,21 +635,21 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 - **不限叫分**:任何叫分档位都适用,不是 70 分坐庄专有。 - **仅可查牌模式**:房间勾选了"不查牌"时,闲家看不到亮牌(见第 9 节)。 - **只亮庄家的**:闲家不亮牌。 -- 亮牌依据的是**埋牌后**的手牌,与 8.1 算奖用的是同一份静态快照(见第 8 节开头),全局固定、不随之后出牌缩水。 +- 亮牌依据的是**埋牌后**的手牌,与 8.1 冲关用的是同一份静态快照(见第 8 节开头),全局固定、不随之后出牌缩水。 > **亮牌给的是牌面,不是统计**。这一点与「余主公示」(只给剩余主牌数与对子数,见第 9 节)不同;与「明牌」(查看**他家**全部未出主牌的牌面,见第 9 节)也不同——亮牌是**庄家主动公开自己的**,明牌是**闲家去看别人的**。 -**亮牌门槛与 8.1 算奖起点的数值巧合,不代表两者是同一条规则**:王 ≥ 3 张 / 7 ≥ 6 张 / 2 ≥ 6 张这三个门槛,数值上恰好分别与 8.1 表里"三个王""六个 7""六个 2"的算奖起点相同,达到时会同时触发"亮牌"和"算奖"这两件独立的事——但它们是各自独立判定后凑巧同时发生,不是"亮牌导致算奖"或者"算奖导致亮牌"。这一点在"固定主牌 ≥ 10 张"这一档表现得最清楚:它只在亮牌这条规则里有定义、会触发亮牌,但 8.1 的算奖表里根本没有为这一档定义奖数,所以**不触发任何算奖**——如果亮牌和算奖是同一回事,这里就该矛盾;现在不矛盾,正说明两者互不干涉。 +**亮牌门槛与 8.1 冲关起点的数值巧合,不代表两者是同一条规则**:王 ≥ 3 张 / 7 ≥ 6 张 / 2 ≥ 6 张这三个门槛,数值上恰好分别与 8.1 表里"三个王""六个 7""六个 2"的冲关起点相同,达到时会同时触发"亮牌"和"冲关"这两件独立的事——但它们是各自独立判定后凑巧同时发生,不是"亮牌导致冲关"或者"冲关导致亮牌"。这一点在"固定主牌 ≥ 10 张"这一档表现得最清楚:它只在亮牌这条规则里有定义、会触发亮牌,但 8.1 的冲关表里根本没有为这一档定义奖数,所以**不产生任何冲关奖**——如果亮牌和冲关是同一回事,这里就该矛盾;现在不矛盾,正说明两者互不干涉。 ### 8.3 傍王(可选规则) 开房时勾选"傍王"后,每张王额外算一奖:这个奖是**庄家、闲家都要各自计算**(每个人按自己手里的王算,不限庄家)。 -**傍王奖是在 8.1 常规算奖之外额外叠加的一份奖励,与常规算奖互不冲突、不互相替代**:庄家照常按 8.1 的规则算常规算奖(只计庄家),同时如果勾选了傍王,庄家、闲家还要**各自另外**再按自己手里的王数算一份傍王奖;两份奖励分开计算,最后相加。 +**傍王奖是在 8.1 冲关之外额外叠加的一份奖励,与冲关互不冲突、不互相替代**:庄家照常按 8.1 的规则算冲关(只计庄家),同时如果勾选了傍王,庄家、闲家还要**各自另外**再按自己手里的王数算一份傍王奖;两份奖励分开计算,最后相加。 ### 8.4 算奖如何影响最终结算 -**算奖是"持有奖数的那个人"从其余两名玩家那里各自多收一笔钱的独立结算线,不是把第 7 节算出的输赢结果整体重新乘一遍**:设第 7 节前三层算出的结算子数为 `X`(庄家与每个闲家之间"一对一"结算的基础金额,见 7.0 第 3 层),玩家 P 这一局总共积累了 `N_P` 奖(8.1 常规算奖 + 8.3 傍王,各自求和后相加;只有庄家可能有 8.1 的分量,8.3 傍王则庄闲都可能有): +**算奖是"持有奖数的那个人"从其余两名玩家那里各自多收一笔钱的独立结算线,不是把第 7 节算出的输赢结果整体重新乘一遍**:设第 7 节前三层算出的结算子数为 `X`(庄家与每个闲家之间"一对一"结算的基础金额,见 7.0 第 3 层),玩家 P 这一局总共积累了 `N_P` 奖(8.1 冲关 + 8.3 傍王,各自求和后相加;只有庄家可能有 8.1 的分量,8.3 傍王则庄闲都可能有): - 若 `N_P > 0`,**另外两名玩家(不分是庄家还是闲家)都要各自额外付给 P:`X × N_P` 子**; - 若 `N_P = 0`,P 没有额外收入。 @@ -659,7 +664,7 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 以下三点已确认: -- **庄家倒庄(闲家达标升级)时,8.1 常规算奖仍然生效**:算奖只看庄家埋牌后的手牌结构,与本局谁输谁赢无关。 +- **庄家倒庄(闲家达标升级)时,8.1 冲关仍然生效**:冲关只看庄家埋牌后的手牌结构,与本局谁输谁赢无关。 - **70 分投降时,仍叠加算奖倍率**:投降只是跳过了第 1~3 层的叫分 / 捡分判定(此时 `X = 1`)。投降是选主阶段的选择,庄家**未选主、未埋牌**,故算奖按庄家"发牌 + 底牌"共 36 张手牌计算——因没有选定主牌花色,**没有连对链**,只有三 / 四王、六~八个 7、六~八个 2 这些组合,以及(勾选傍王时)按王数的傍王奖计入;8.1(及勾选傍王时的 8.3)照常计算并叠加。 - **算奖对象的身份限制会带进 `N` 的计算**:8.1 只算庄家、8.3 傍王勾选后才不分庄闲(见第 8 节开头说明),把这名玩家实际适用的分量求和,才是他自己的 `N`;"其余两人向他支付 `X × N`"这条支付规则本身不因身份而改变,但闲家的 `N` 从一开始就不可能包含 8.1 的分量。 @@ -750,7 +755,7 @@ A - K - Q - J - 10 - 9 - 8 - 6 - 5 9. **小局结算**(第 7、8 节,两部分同时结算): - **算子**:闲家总捡分(含扣底)与庄家叫分比较 → 判定庄家的**过庄 / 小光 / 大光**,或闲家的**升级第几级** → 结合叫分档的基础子数,得到庄家与每个闲家"一对一"的结算子数 `X`(勾选爬坡则改用 7.3 的梯度与分段)。 - - **算奖**:以静态初始手牌(正常局:庄家埋牌后 28 张、闲家发牌后 28 张;**70 分投降局**:庄家用发牌+底牌共 36 张、无主牌花色)计算奖数 `N` —— 常规算奖(8.1)**只计庄家**;勾选傍王(8.3)则庄闲每张王各算一奖。持有 `N` 奖的玩家从另外两人各多收 `X × N`(8.4)。 + - **算奖**:以静态初始手牌(正常局:庄家埋牌后 28 张、闲家发牌后 28 张;**70 分投降局**:庄家用发牌+底牌共 36 张、无主牌花色)计算奖数 `N` —— 冲关(8.1)**只计庄家**;勾选傍王(8.3)则庄闲每张王各算一奖。持有 `N` 奖的玩家从另外两人各多收 `X × N`(8.4)。 - 以上两部分加总即各家本局盈亏;牌局结束需亮出埋牌底牌(第 11 节)。 10. **进入下一局**(4.6):庄家本局赢则连庄(暂定庄家仍是他);庄家输(闲家捡分达标 / 庄家投降)则暂定庄家顺延到其下家。回到第 2 步开新的一小局。 diff --git a/server/games/erqiwang/docs/protocol/packet_protocol.md b/server/games/erqiwang/docs/protocol/packet_protocol.md index c75420b..fb1ac91 100644 --- a/server/games/erqiwang/docs/protocol/packet_protocol.md +++ b/server/games/erqiwang/docs/protocol/packet_protocol.md @@ -39,6 +39,19 @@ 另有一组「底」字族专管发牌留桌的那 8 张:**摸底**(庄家摸起看,仅庄家)、**开底**(70 分时全场看 3 秒)、**查底牌**(对局中随时回看)、**扣底**(末轮翻开埋牌底牌计分)。 (「亮主」不是术语,是前端选主界面的标题文案,与上表无关。) + +### 0.0c 算奖 = 冲关 + 傍王 + +| 术语 | 范围 | 相关字段 | +| --- | --- | --- | +| **冲关** | design §8.1,**只计庄家**。旧称"常规算奖",现统一叫冲关 | `chongguan`(奖数)、`cards`(冲关牌型) | +| **傍王** | design §8.3,可选规则,勾选后**庄闲都算**,每张王 1 奖 | `wang`(王数)、`bangwang`(开关) | +| **算奖** | **上位概念** = 冲关 + 傍王 | `naward`(总奖数 N)、`grade_aw`(算奖得分) | + +说「**冲关**」指庄家那一份,说「**算奖**」指两者合计。界面上小局结算显示「冲关分」、按钮叫「冲关牌型」。 + +> ⚠️ `grade_aw` 是按合计后的 `N` 算出来的,**冲关与傍王的贡献事后无法拆分**。大局结算若要分别显示「冲关分」「傍王分」,须服务端在算钱时就分开代入公式——见前端清单 §7.5 **S-6**。 + ### 0.1 成败标志 `data.success` **每一个「服务器 → 客户端」的包,`data` 都必带 `success`**(布尔): @@ -451,11 +464,11 @@ ```json { - "cards": [], // 算奖相关牌(王/冲关牌)列表 - "chongguan": 0, // 常规算奖奖数(只有庄家才计入自己的 N) + "cards": [], // 冲关牌型:参与冲关的牌(王 + 冲关组合牌)列表,供「冲关牌型」界面展示 + "chongguan": 0, // 冲关奖数(design §8.1,旧称"常规算奖";只有庄家才计入自己的 N) "wang": 0, // 手牌中的王数(傍王按此计奖) - "naward": 0, // 该家总奖数 N =(庄家?常规算奖:0)+(傍王?王数:0) - "grade_aw": 0, // 算奖得分 = X×(2Ni−Nj−Nk),X 为每对子子数 + "naward": 0, // 该家总奖数 N =(庄家?冲关奖数:0)+(傍王?王数:0) + "grade_aw": 0, // 算奖得分 = X×(2Ni−Nj−Nk),X 为每对子子数。注意这是【冲关 + 傍王合计】后的结果,两个分量事后拆不开(见 §0.0c) "grade_jf": 0, // 捡分子数得分 "grade": 0, // 本局总分 = grade_aw + grade_jf "score": 0 // 累计得分